diff options
author | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-03-03 14:20:36 -0700 |
---|---|---|
committer | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2024-03-03 14:22:51 -0700 |
commit | e2e74df94fcdd2f3165e035fc00c98573f0b40d8 (patch) | |
tree | 362943ba180b3ba0298473855e2622f7560c84aa /src/interpreter/grammar.pegjs | |
parent | 4233aca561b5650924f3cc4232cfd294d706c863 (diff) | |
download | the-abstraction-engine-e2e74df94fcdd2f3165e035fc00c98573f0b40d8.tar.gz the-abstraction-engine-e2e74df94fcdd2f3165e035fc00c98573f0b40d8.zip |
add parser
Diffstat (limited to 'src/interpreter/grammar.pegjs')
-rw-r--r-- | src/interpreter/grammar.pegjs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/interpreter/grammar.pegjs b/src/interpreter/grammar.pegjs new file mode 100644 index 0000000..520d6c8 --- /dev/null +++ b/src/interpreter/grammar.pegjs @@ -0,0 +1,17 @@ +LambdaTerm = Application / Abstraction / Variable + +Application = LPAREN _? left:LambdaTerm _ argList:(LambdaTerm _)* lastArg:LambdaTerm _? RPAREN { + const args = lastArg || argList.length ? [...argList.map(x => x[0]), lastArg] : []; + return { application: { left, args } }; +} + +Abstraction = LPAREN _? LAMBDA _? LPAREN _? param:Variable _? RPAREN _? DOT _? body:LambdaTerm _? RPAREN { return { abstraction: { param, body } }; } + +Variable = param:[a-zA-Z0-9]+ { return param.join(""); } + +LPAREN = "(" +RPAREN = ")" +DOT = "." +LAMBDA = "λ" / "\\" + +_ = ("\n" / " " / "\t" / "\r\n")+
\ No newline at end of file |