diff options
author | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-03-07 20:45:47 -0700 |
---|---|---|
committer | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-03-07 20:45:47 -0700 |
commit | e6e29440563e33bb67e0ad51f9fb6c5c2c3fe809 (patch) | |
tree | 5deaee322ff1a039dc44a3cb52ecc48a671fda2a /src/interpreter | |
parent | 823620b2a6ebb7ece619991e47a37ad46542b69f (diff) | |
download | the-abstraction-engine-e6e29440563e33bb67e0ad51f9fb6c5c2c3fe809.tar.gz the-abstraction-engine-e6e29440563e33bb67e0ad51f9fb6c5c2c3fe809.zip |
level one (applications prototype finished!)
Diffstat (limited to 'src/interpreter')
-rw-r--r-- | src/interpreter/PeggyParser.js | 4 | ||||
-rw-r--r-- | src/interpreter/interpreter.ts | 35 | ||||
-rw-r--r-- | src/interpreter/parser.ts | 8 |
3 files changed, 27 insertions, 20 deletions
diff --git a/src/interpreter/PeggyParser.js b/src/interpreter/PeggyParser.js index 5671d91..632f1b7 100644 --- a/src/interpreter/PeggyParser.js +++ b/src/interpreter/PeggyParser.js @@ -201,7 +201,7 @@ export default (function () { ); }; - function peg$parse(input, options) { + function peg$parse(input, options, allowUnderscores = false) { options = options !== undefined ? options : {}; var peg$FAILED = {}; @@ -215,7 +215,7 @@ export default (function () { var peg$c2 = "."; var peg$c3 = "\r\n"; - var peg$r0 = /^[a-zA-Z0-9]/; + var peg$r0 = allowUnderscores ? /^[a-zA-Z0-9]_/ : /^[a-zA-Z0-9]/; var peg$r1 = /^[\\\u03BB]/; var peg$r2 = /^[\t-\n ]/; diff --git a/src/interpreter/interpreter.ts b/src/interpreter/interpreter.ts index 0b3ae34..4599c46 100644 --- a/src/interpreter/interpreter.ts +++ b/src/interpreter/interpreter.ts @@ -198,22 +198,6 @@ export const betaReduce = ( ); }; -export const interpret = (term: string): DebrujinifiedLambdaTerm => { - const ast = parse(term); - const symbolTable = new SymbolTable(); - const debrujined = debrujinify(ast, symbolTable); - - let prev = debrujined; - let next = betaReduce(prev); - - while (emitDebrujin(prev) !== emitDebrujin(next)) { - // alpha equivalence - prev = next; - next = betaReduce(prev); - } - return next; -}; - export const emitDebrujin = (term: DebrujinifiedLambdaTerm): string => { if ("index" in term) { return term.index.toString(); @@ -253,3 +237,22 @@ export const emitNamed = (term: DebrujinifiedLambdaTerm): string => { throw new InvalidLambdaTermError(`Invalid lambda term: ${term}`); }; + +export const interpret = ( + term: string, + symbolTable = new SymbolTable(), + allowUnderscores = false, +): DebrujinifiedLambdaTerm => { + const ast = parse(term, allowUnderscores); + const debrujined = debrujinify(ast, symbolTable); + + let prev = debrujined; + let next = betaReduce(prev); + + while (emitDebrujin(prev) !== emitDebrujin(next)) { + // alpha equivalence + prev = next; + next = betaReduce(prev); + } + return next; +}; diff --git a/src/interpreter/parser.ts b/src/interpreter/parser.ts index 5e3be0f..d288815 100644 --- a/src/interpreter/parser.ts +++ b/src/interpreter/parser.ts @@ -30,6 +30,10 @@ export const isVariable = (term: LambdaTerm): term is Variable => { return typeof term === "string"; }; -export const parse = (term: string, library = false) => { - return peggyParser.parse(term, { peg$library: library }); +export const parse = ( + term: string, + allowUnderscores = false, + library = false, +) => { + return peggyParser.parse(term, { peg$library: library }, allowUnderscores); }; |