|  | @@ -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])
 | 
	
		
			
				|  |  | +                 }
 | 
	
		
			
				|  |  |  
 |