| 
					
				 | 
			
			
				@@ -8,51 +8,62 @@ varIdentifier  = first:[a-z] others:[a-zA-Z0-9]* {return first + others.join("") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 keyword        = first:identifier last:[:] {return first + last} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 className      = first:[A-Z] others:[a-zA-Z0-9]* {return first + others.join("")} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 string         = ['] val:(("''" {return "'"} / [^'])*) ['] { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	   return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	   	._value_(val.join("").replace(/\"/ig, '"')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._value_(val.join("").replace(/\"/ig, '"')); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 symbol         = "#"val:( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			digits:[a-zA-Z0-9\:]+ {return digits.join("")} /  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			node:string {return node._value()})* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  		    return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	   		    	   ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"'))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         digits:[a-zA-Z0-9\:]+ {return digits.join("")} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       / node:string {return node._value()})* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"'))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 number         = n:(float / integer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	   	._value_(n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._value_(n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 float          = neg:[-]?int:[0-9]+ "." dec:[0-9]+ {return parseFloat((neg + int.join("") + "." + dec.join("")), 10)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 integer        = neg:[-]?digits:[0-9]+ {return (parseInt(neg+digits.join(""), 10))} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 literalArray   = "#(" ws lits:(lit:literal ws {return lit._value()})* ws ")" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	   	._value_(lits) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-               	 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._value_(lits) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 dynamicArray   = "{" ws expressions:expressions? ws "."? "}" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	  return smalltalk.DynamicArrayNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		        ._nodes_(expressions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.DynamicArrayNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._nodes_(expressions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 dynamicDictionary = "#{" ws expressions: expressions? ws "}" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	  return smalltalk.DynamicDictionaryNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		        ._nodes_(expressions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return smalltalk.DynamicDictionaryNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               ._nodes_(expressions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 pseudoVariable = val:( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          'true' {return true}  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	/ 'false' {return false} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		/ 'nil' {return nil}) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return smalltalk.ValueNode._new()._value_(val) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   'true' {return true} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 / 'false' {return false} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 / 'nil' {return nil}) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       return smalltalk.ValueNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              ._value_(val) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 literal        = pseudoVariable / number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 variable       = identifier:varIdentifier { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  return smalltalk.VariableNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			._value_(identifier) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.VariableNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._value_(identifier) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 classReference = className:className { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  return smalltalk.ClassReferenceNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  	._value_(className) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.ClassReferenceNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._value_(className) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 reference      = variable / classReference 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -62,7 +73,7 @@ binarySelector = bin:[\\+*/=><,@%~|&-]+ {return bin.join("").replace(/\\/g, '\\\ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 unarySelector  = identifier 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 keywordPattern = pairs:(ws key:keyword ws arg:identifier {return {key:key, arg: arg}})+ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	             var keywords = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     var keywords = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      var params = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      for(var i=0;i<pairs.length;i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                          keywords.push(pairs[i].key); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -70,8 +81,8 @@ keywordPattern = pairs:(ws key:keyword ws arg:identifier {return {key:key, arg: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      for(var i=0;i<pairs.length;i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                          params.push(pairs[i].arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		     return [keywords.join(""), params] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return [keywords.join(""), params] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 binaryPattern  = ws selector:binarySelector ws arg:identifier {return [selector, [arg]]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 unaryPattern   = ws selector:unarySelector {return [selector, []]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -79,23 +90,25 @@ expression     = assignment / cascade / keywordSend / binarySend / jsStatement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 expressionList = ws "." ws expression:expression {return expression} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 expressions    = first:expression others:expressionList* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     var result = [first]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		     for(var i=0;i<others.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 	 result.push(others[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		     return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     var result = [first]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     for(var i=0;i<others.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         result.push(others[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 assignment     = variable:variable ws ':=' ws expression:expression { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     return smalltalk.AssignmentNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     	._left_(variable) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     	._right_(expression) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.AssignmentNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._left_(variable) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._right_(expression) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ret            = '^' ws expression:expression ws '.'? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     return smalltalk.ReturnNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       	     	._nodes_([expression]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.ReturnNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._nodes_([expression]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 temps          = "|" vars:(ws variable:identifier ws {return variable})* "|" {return vars} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -103,121 +116,127 @@ blockParamList = params:((ws ":" ws param:identifier {return param})+) ws "|" {r 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 subexpression  = '(' ws expression:expression ws ')' {return expression} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-statements    = ret:ret [.]* {return [ret]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      / exps:expressions ws [.]+ ws ret:ret [.]* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      	      	  var expressions = exps; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  expressions.push(ret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  return expressions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      / expressions:expressions? [.]* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      	          return expressions || [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-sequence      = temps:temps? ws statements:statements? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	  return smalltalk.SequenceNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	  	._temps_(temps || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	  	._nodes_(statements || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-block         = '[' ws params:blockParamList? ws sequence:sequence? ws ']' { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          return smalltalk.BlockNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          	._parameters_(params || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          	._nodes_([sequence._asBlockSequenceNode()]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-operand       = literal / reference / subexpression 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-unaryMessage  = ws selector:unarySelector ![:] { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      		._selector_(selector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-unaryTail     = message:unaryMessage ws tail:unaryTail? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return tail._valueForReceiver_(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-unarySend     = receiver:operand ws tail:unaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-binaryMessage = ws selector:binarySelector ws arg:(unarySend / operand) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          	._selector_(selector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          	._arguments_([arg]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-binaryTail    = message:binaryMessage tail:binaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      	          if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return tail._valueForReceiver_(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-binarySend    = receiver:unarySend tail:binaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	  if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      return receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+statements     = ret:ret [.]* {return [ret]} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 / exps:expressions ws [.]+ ws ret:ret [.]* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       var expressions = exps; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       expressions.push(ret); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       return expressions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 / expressions:expressions? [.]* { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       return expressions || [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sequence       = temps:temps? ws statements:statements? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.SequenceNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._temps_(temps || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._nodes_(statements || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+block          = '[' ws params:blockParamList? ws sequence:sequence? ws ']' { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.BlockNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._parameters_(params || []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._nodes_([sequence._asBlockSequenceNode()]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+operand        = literal / reference / subexpression 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unaryMessage   = ws selector:unarySelector ![:] { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._selector_(selector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unaryTail      = message:unaryMessage ws tail:unaryTail? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return tail._valueForReceiver_(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unarySend      = receiver:operand ws tail:unaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+binaryMessage  = ws selector:binarySelector ws arg:(unarySend / operand) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._selector_(selector) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._arguments_([arg]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+binaryTail     = message:binaryMessage tail:binaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return tail._valueForReceiver_(message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return message; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+binarySend     = receiver:unarySend tail:binaryTail? { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     if(tail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         return receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 keywordMessage = ws pairs:(pair:keywordPair ws {return pair})+ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  var selector = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  var args = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  for(var i=0;i<pairs.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      selector.push(pairs[i].key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	      args.push(pairs[i].arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  	._selector_(selector.join("")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		  	._arguments_(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-keywordSend   = receiver:binarySend tail:keywordMessage { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	          return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-message       = binaryMessage / unaryMessage / keywordMessage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-cascade       = ws send:(keywordSend / binarySend) messages:(ws ";" ws mess:message ws {return mess})+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var cascade = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		cascade.push(send); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		for(var i=0;i<messages.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          		cascade.push(messages[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      		return smalltalk.CascadeNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	       ._receiver_(send._receiver()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          	       ._nodes_(cascade) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-jsStatement   = "<" val:((">>" {return ">"} / [^>])*) ">" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return smalltalk.JSStatementNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			._source_(val.join("")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-method        = ws pattern:(keywordPattern / binaryPattern / unaryPattern) ws sequence:sequence? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      	return smalltalk.MethodNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		       ._selector_(pattern[0]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		       ._arguments_(pattern[1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		       ._nodes_([sequence]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     var selector = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     var args = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      for(var i=0;i<pairs.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          selector.push(pairs[i].key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          args.push(pairs[i].arg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      return smalltalk.SendNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._selector_(selector.join("")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._arguments_(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+keywordSend    = receiver:binarySend tail:keywordMessage { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return tail._valueForReceiver_(receiver); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+message        = binaryMessage / unaryMessage / keywordMessage 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cascade        = ws send:(keywordSend / binarySend) messages:(ws ";" ws mess:message ws {return mess})+ { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     var cascade = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     cascade.push(send); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     for(var i=0;i<messages.length;i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         cascade.push(messages[i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.CascadeNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._receiver_(send._receiver()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._nodes_(cascade) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+jsStatement    = "<" val:((">>" {return ">"} / [^>])*) ">" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     return smalltalk.JSStatementNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            ._source_(val.join("")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+method         = ws pattern:(keywordPattern / binaryPattern / unaryPattern) ws sequence:sequence? ws { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      return smalltalk.MethodNode._new() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._position_((line).__at(column)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._selector_(pattern[0]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._arguments_(pattern[1]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             ._nodes_([sequence]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |