41 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2008 James Cash
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: kernel peg peg.ebnf math.parser sequences arrays strings
 | 
						|
math fry accessors lists combinators.short-circuit ;
 | 
						|
 | 
						|
IN: lisp.parser
 | 
						|
 | 
						|
TUPLE: lisp-symbol name ;
 | 
						|
C: <lisp-symbol> lisp-symbol
 | 
						|
 | 
						|
EBNF: lisp-expr
 | 
						|
_            = (" " | "\t" | "\n")*
 | 
						|
LPAREN       = "("
 | 
						|
RPAREN       = ")"
 | 
						|
dquote       = '"'
 | 
						|
squote       = "'"
 | 
						|
digit        = [0-9]
 | 
						|
integer      = ("-")? (digit)+                           => [[ first2 append string>number ]]
 | 
						|
float        = integer "." (digit)*                      => [[ first3 >string [ number>string ] 2dip 3append string>number ]]
 | 
						|
rational     = integer "/" (digit)+                      => [[ first3 nip string>number / ]]
 | 
						|
number       = float
 | 
						|
              | rational
 | 
						|
              | integer
 | 
						|
id-specials  = "!" | "$" | "%" | "&" | "*" | "/" | ":"
 | 
						|
              | "<" | "#" | " =" | ">" | "?" | "^" | "_"
 | 
						|
              | "~" | "+" | "-" | "." | "@"
 | 
						|
letters      = [a-zA-Z]                                  => [[ 1array >string ]]
 | 
						|
initials     = letters | id-specials
 | 
						|
numbers      = [0-9]                                     => [[ 1array >string ]]
 | 
						|
subsequents  = initials | numbers
 | 
						|
identifier   = initials (subsequents)*                   => [[ first2 concat append <lisp-symbol> ]]
 | 
						|
escaped      = "\" .                                     => [[ second ]]
 | 
						|
string       = dquote ( escaped | !(dquote) . )*  dquote => [[ second >string ]]
 | 
						|
atom         = number
 | 
						|
              | identifier
 | 
						|
              | string
 | 
						|
s-expression = LPAREN (list-item)* RPAREN                => [[ second seq>cons ]]
 | 
						|
list-item    = _ ( atom | s-expression | quoted ) _      => [[ second ]]
 | 
						|
quoted       = squote list-item                          => [[ second nil cons "quote" <lisp-symbol> swap cons ]]
 | 
						|
expr         = list-item
 | 
						|
;EBNF |