94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								USING: kernel arrays strings sequences sequences.deep accessors peg peg.ebnf
							 | 
						||
| 
								 | 
							
								       newfx ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								IN: shell.parser
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: basic-expr         command  stdin stdout background ;
							 | 
						||
| 
								 | 
							
								TUPLE: pipeline-expr      commands stdin stdout background ;
							 | 
						||
| 
								 | 
							
								TUPLE: single-quoted-expr expr ;
							 | 
						||
| 
								 | 
							
								TUPLE: double-quoted-expr expr ;
							 | 
						||
| 
								 | 
							
								TUPLE: back-quoted-expr   expr ;
							 | 
						||
| 
								 | 
							
								TUPLE: glob-expr          expr ;
							 | 
						||
| 
								 | 
							
								TUPLE: variable-expr      expr ;
							 | 
						||
| 
								 | 
							
								TUPLE: factor-expr        expr ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>basic-expr ( ast -- obj ) first4 basic-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>pipeline-expr ( ast -- obj )
							 | 
						||
| 
								 | 
							
								  pipeline-expr new
							 | 
						||
| 
								 | 
							
								    over [ 1st ] [ 4th [ 1st ] map ] [ 5th ] tri suffix prefix-on >>commands
							 | 
						||
| 
								 | 
							
								    over 2nd >>stdin
							 | 
						||
| 
								 | 
							
								    over 6th   >>stdout
							 | 
						||
| 
								 | 
							
								    swap 7th   >>background ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>single-quoted-expr ( ast -- obj )
							 | 
						||
| 
								 | 
							
								  2nd >string single-quoted-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>double-quoted-expr ( ast -- obj )
							 | 
						||
| 
								 | 
							
								  2nd >string double-quoted-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>back-quoted-expr ( ast -- obj )
							 | 
						||
| 
								 | 
							
								  2nd >string back-quoted-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>glob-expr ( ast -- obj ) flatten concat glob-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>variable-expr ( ast -- obj ) 2nd variable-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ast>factor-expr ( ast -- obj ) 2nd >string factor-expr boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EBNF: expr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								space = " "
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								tab   = "\t"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								white = (space | tab)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_ = (white)* => [[ drop ignore ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								sq = "'"
							 | 
						||
| 
								 | 
							
								dq = '"'
							 | 
						||
| 
								 | 
							
								bq = "`"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								single-quoted = sq (!(sq) .)* sq => [[ ast>single-quoted-expr ]]
							 | 
						||
| 
								 | 
							
								double-quoted = dq (!(dq) .)* dq => [[ ast>double-quoted-expr ]]
							 | 
						||
| 
								 | 
							
								back-quoted   = bq (!(bq) .)* bq => [[ ast>back-quoted-expr   ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								factor = "$(" (!(")") .)* ")" => [[ ast>factor-expr ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								variable = "$" other => [[ ast>variable-expr ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								glob-char = ("*" | "?")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								non-glob-char = !(glob-char | white) .
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								glob-beginning-string = (non-glob-char)* => [[ >string ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								glob-rest-string = (non-glob-char)+ => [[ >string ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								glob = glob-beginning-string glob-char (glob-rest-string | glob-char)* => [[ ast>glob-expr ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								other = (!(white | "&" | ">" | ">>" | "<" | "|") .)+ => [[ >string ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								element = (single-quoted | double-quoted | back-quoted | factor | variable | glob | other)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								command = (element _)+
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								to-file = ">"  _ other => [[ second ]]
							 | 
						||
| 
								 | 
							
								in-file = "<"  _ other => [[ second ]]
							 | 
						||
| 
								 | 
							
								ap-file = ">>" _ other => [[ second ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								basic = _ command _ (in-file)? _ (to-file | ap-file)? _ ("&")? => [[ ast>basic-expr ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								pipeline = _ command _ (in-file)? _ "|" _ (command _ "|" _)* command _ (to-file | ap-file)? _ ("&")? => [[ ast>pipeline-expr ]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								submission = (pipeline | basic)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								;EBNF
							 |