1 #! A parser for lambda expressions, by Matthew Willis
2 #! The grammar in BNF is:
5 #! <expr> ::= (<id> . <expr>)
6 #! <expr> ::= (<expr> <expr>)
8 #! <line> ::= <name> : <expr>
9 USING: lazy-lists parser-combinators strings sequences kernel ;
14 #! parses an uppercase or lowercase letter
15 [ letter? ] satisfy [ 1string ] <@ ;
18 #! parses an uppercase or lowercase letter
19 [ LETTER? ] satisfy [ 1string ] <@ ;
23 [ digit? ] satisfy [ 1string ] <@ ;
26 #! parses an alphanumeral
27 <letter> <number> <|> ;
30 #! parses an alphanumeral
31 <LETTER> <number> <|> ;
34 #! parses an identifier (string for now)
35 #! TODO: do we need to enter it into a symbol table?
36 <letter> <alphanumeric> <*> <&:> [ concat <var-node> ] <@ ;
39 #! parses a name, which is used in replacement
40 <ALPHANUMERIC> <+> [ concat ] <@ ;
43 LAZY: <lambda> ( -- parser )
44 #! parses (<id>.<expr>), the "lambda" expression
45 #! all occurences of <id> are replaced with a pointer to this
47 "(" token <id> sp &> "." token sp <&
48 <expr> sp <&> ")" token sp <&
49 [ [ first var-node-name ] keep second <lambda-node> ] <@ ;
51 LAZY: <apply> ( -- parser )
52 #! parses (<expr> <expr>), the function application
53 "(" token <expr> sp &> <expr> sp <&> ")" token sp <&
54 [ [ first ] keep second <apply-node> ] <@ ;
56 LAZY: <alien> ( -- parser )
57 #! parses [<FACTOR-WORD>], the alien invocation
58 #! an alien factor word must be all capital letters and numerals
59 "[" token <name> sp &> "]" token sp <& [ <alien-node> ] <@ ;
62 <id> <lambda> <apply> <|> <|>
63 <name> [ <var-node> ] <@ <|> <alien> <|> ;
66 ":" token <name> &> <expr> sp <&> f succeed <expr> <&>
67 <|> "." token <name> &> f succeed <&> <|> ;
70 <line> some parse force ;