summaryrefslogtreecommitdiff
path: root/src/interpreter
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 20:45:47 -0700
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2024-03-07 20:45:47 -0700
commite6e29440563e33bb67e0ad51f9fb6c5c2c3fe809 (patch)
tree5deaee322ff1a039dc44a3cb52ecc48a671fda2a /src/interpreter
parent823620b2a6ebb7ece619991e47a37ad46542b69f (diff)
downloadthe-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.js4
-rw-r--r--src/interpreter/interpreter.ts35
-rw-r--r--src/interpreter/parser.ts8
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);
};