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