thaw-interpreter
Version:
Programming language interpreters, including LISP, Scheme, and Prolog.
98 lines (97 loc) • 3.53 kB
JavaScript
import { LanguageSelector } from 'thaw-interpreter-types';
import { readEvaluatePrintLoop } from 'thaw-repl';
import { createInterpreter } from './common/interpreter-factory';
import { executeScript } from './common/script-executor';
import { scriptExecutorLCAug } from './languages/lambda-calculus-augmented-syntax/script-executor';
function printUsageMessage() {
process.stdout.write('\n');
process.stdout.write('Usage: $ intrprtr [language name]\n');
process.stdout.write('\n');
process.stdout.write('E.g.: $ intrprtr lisp\n');
process.stdout.write('\n');
process.stdout.write('Available languages: minimal, chapter1, lisp, scheme, sasl, prolog');
process.stdout.write('\n');
}
function languageNameStringToLanguageSelector(languageName) {
switch (languageName) {
case 'minimal':
return LanguageSelector.MinimalLanguage;
case 'chapter1':
return LanguageSelector.Chapter1;
case 'lisp':
return LanguageSelector.LISP;
case 'apl':
return LanguageSelector.APL;
case 'scheme':
return LanguageSelector.Scheme;
case 'sasl':
return LanguageSelector.SASL;
case 'clu':
return LanguageSelector.CLU;
case 'smalltalk':
return LanguageSelector.Smalltalk;
case 'prolog':
return LanguageSelector.Prolog2;
default:
throw new Error('languageNameStringToLanguageSelector()');
}
}
function doInteractiveMode(languageName) {
process.stdout.write('\nThis is the command line interface for thaw-interpreter\n\n');
if (process.argv.length < 3) {
process.stdout.write('Error: No language specified.\n');
printUsageMessage();
return;
}
const languageSelector = languageNameStringToLanguageSelector(languageName);
const interpreter = createInterpreter(languageSelector);
const isExitCommand = (command) => command === 'exit';
const evaluate = (command) => interpreter.evaluateFromString(command);
readEvaluatePrintLoop(isExitCommand, evaluate)
.then(() => {
})
.catch((error) => {
process.stderr.write(`Error in readEvaluatePrintLoop(): ${typeof error} ${error}\n`);
});
}
function runScript(languageName, scriptFilenames) {
let scriptExecutionPromise;
if (languageName === 'lcaug') {
scriptExecutionPromise = scriptExecutorLCAug(scriptFilenames[0]);
}
else {
scriptExecutionPromise = executeScript(languageNameStringToLanguageSelector(languageName), scriptFilenames);
}
scriptExecutionPromise.then().catch((error) => {
console.error('Script execution error:', typeof error, error);
});
}
export function driver(argv) {
if (argv.length <= 2) {
console.error('Usage: intrprtr language-name [script-path-list]');
process.exit(1);
}
const languageName = argv[2];
const supportedLanguages = [
'apl',
'chapter1',
'clu',
'lcaug',
'lisp',
'minimal',
'prolog',
'scheme',
'smalltalk'
];
if (supportedLanguages.indexOf(languageName) < 0) {
console.error(`Error: Unknown language name '${languageName}'.`);
console.error('The language name must be one of:', supportedLanguages.join(', '));
process.exit(1);
}
if (argv.length === 3) {
doInteractiveMode(languageName);
}
else {
runScript(languageName, argv.slice(3));
}
}