UNPKG

thaw-interpreter

Version:

Programming language interpreters, including LISP, Scheme, and Prolog.

98 lines (97 loc) 3.53 kB
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)); } }