#! A parser for lambda expressions, by Matthew Willis #! The grammar in BNF is: #! ::= #! ::= #! ::= ( . ) #! ::= ( ) #! ::= #! ::= : USING: parser-combinators strings sequences kernel ; IN: lambda : #! parses an uppercase or lowercase letter [ letter? ] satisfy [ ch>string ] <@ ; : #! parses an uppercase or lowercase letter [ LETTER? ] satisfy [ ch>string ] <@ ; : #! parses a number [ digit? ] satisfy [ ch>string ] <@ ; : #! parses an alphanumeral <|> ; : #! parses an alphanumeral <|> ; : #! parses an identifier (string for now) #! TODO: do we need to enter it into a symbol table? <*> <&:> [ concat ] <@ ; : #! parses a name, which is used in replacement <+> [ concat ] <@ ; DEFER: : #! parses (.), the "lambda" expression #! all occurences of are replaced with a pointer to this #! lambda expression. "(" token sp &> "." token sp <& sp <&> ")" token sp <& [ [ first var-node-name ] keep second ] <@ ; : #! parses ( ), the function application "(" token sp &> sp <&> ")" token sp <& [ [ first ] keep second ] <@ ; : #! parses [], the alien invocation #! an alien factor word must be all capital letters and numerals "[" token sp &> "]" token sp <& [ ] <@ ; : [ call ] [ call ] [ call ] <|> <|> [ ] <@ <|> <|> ; : ":" token &> sp <&> f succeed <&> <|> "." token &> f succeed <&> <|> ; : lambda-parse some call ;