| 
									
										
										
										
											2009-02-11 14:56:09 -05:00
										 |  |  | ! Copyright (C) 2009 Philipp Brüschweiler | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-02-07 19:03:35 -05:00
										 |  |  | USING: infix.ast infix.tokenizer kernel math peg.ebnf sequences | 
					
						
							|  |  |  | strings vectors ;
 | 
					
						
							|  |  |  | IN: infix.parser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EBNF: parse-infix | 
					
						
							|  |  |  | Number      = . ?[ ast-number? ]? | 
					
						
							|  |  |  | Identifier  = . ?[ string? ]? | 
					
						
							|  |  |  | Array       = Identifier:i "[" Sum:s "]" => [[ i s ast-array boa ]] | 
					
						
							| 
									
										
										
										
											2013-03-19 19:52:33 -04:00
										 |  |  | Slice1      = Identifier:i "[" Sum?:from ":" Sum?:to "]" => [[ i from to f ast-slice boa ]] | 
					
						
							|  |  |  | Slice2      = Identifier:i "[" Sum?:from ":" Sum?:to ":" Sum?:step "]" => [[ i from to step ast-slice boa ]] | 
					
						
							|  |  |  | Slice       = Slice1 | Slice2 | 
					
						
							| 
									
										
										
										
											2009-02-07 19:03:35 -05:00
										 |  |  | Function    = Identifier:i "(" FunArgs?:a ")" => [[ i a [ V{ } ] unless* ast-function boa ]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FunArgs     =   FunArgs:a "," Sum:s => [[ s a push a ]] | 
					
						
							|  |  |  |               | Sum:s => [[ s 1vector ]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Terminal    =   ("-"|"+"):op Terminal:term => [[ term op "-" = [ ast-negation boa ] when ]] | 
					
						
							|  |  |  |               | "(" Sum:s ")" => [[ s ]] | 
					
						
							| 
									
										
										
										
											2011-03-18 01:42:23 -04:00
										 |  |  |               | Number | Array | Slice | Function | 
					
						
							| 
									
										
										
										
											2009-02-07 19:03:35 -05:00
										 |  |  |               | Identifier => [[ ast-local boa ]] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-04 18:04:14 -04:00
										 |  |  | Product     =   Product:p ("**"|"*"|"/"|"%"):op Terminal:term  => [[ p term op ast-op boa ]] | 
					
						
							| 
									
										
										
										
											2009-02-07 19:03:35 -05:00
										 |  |  |               | Terminal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sum         =   Sum:s ("+"|"-"):op Product:p  => [[ s p op ast-op boa ]] | 
					
						
							|  |  |  |               | Product | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | End         = !(.) | 
					
						
							|  |  |  | Expression  = Sum End | 
					
						
							|  |  |  | ;EBNF | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : build-infix-ast ( string -- ast )
 | 
					
						
							|  |  |  |     tokenize-infix parse-infix ;
 |