]> gitweb.factorcode.org Git - factor.git/blob - contrib/lambda/parser.factor
lambda: fix for parser combinator changes
[factor.git] / contrib / lambda / parser.factor
1 #! A parser for lambda expressions, by Matthew Willis
2 #! The grammar in BNF is:
3 #! <expr> ::= <id>
4 #! <expr> ::= <name>
5 #! <expr> ::= (<id> . <expr>)
6 #! <expr> ::= (<expr> <expr>)
7 #! <line> ::= <expr>
8 #! <line> ::= <name> : <expr>
9 USING: lazy-lists parser-combinators strings sequences kernel ;
10
11 IN: lambda
12
13 LAZY: <letter> 
14     #! parses an uppercase or lowercase letter
15         [ letter? ] satisfy [ ch>string ] <@ ;
16
17 LAZY: <LETTER> 
18     #! parses an uppercase or lowercase letter
19     [ LETTER? ] satisfy [ ch>string ] <@ ;
20
21 LAZY: <number>
22     #! parses a number
23     [ digit? ] satisfy [ ch>string ] <@ ;
24
25 LAZY: <alphanumeric>
26     #! parses an alphanumeral
27     <letter> <number> <|> ;
28
29 LAZY: <ALPHANUMERIC>
30     #! parses an alphanumeral
31     <LETTER> <number> <|> ;
32
33 LAZY: <id>
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> ] <@ ;
37
38 LAZY: <name>
39     #! parses a name, which is used in replacement
40     <ALPHANUMERIC> <+> [ concat ] <@ ;
41
42 DEFER: <expr>
43 LAZY: <lambda> ( -- parser )
44     #! parses (<id>.<expr>), the "lambda" expression
45     #! all occurences of <id> are replaced with a pointer to this
46     #! lambda expression.
47     "(" token <id> sp &> "." token sp <& 
48     <expr> sp <&> ")" token sp <&
49     [ [ first var-node-name ] keep second <lambda-node> ] <@ ;
50
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> ] <@ ;
55
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> ] <@ ;
60
61 LAZY: <expr>
62     <id> <lambda> <apply> <|> <|>
63     <name> [ <var-node> ] <@ <|> <alien> <|> ;
64
65 LAZY: <line>
66     ":" token <name> &> <expr> sp <&> f succeed <expr> <&> 
67     <|> "." token <name> &> f succeed <&> <|> ;
68
69 : lambda-parse
70     <line> some parse force ;