Explorar el Código

parser.pegjs: cleanup tab/whitespace mix with spaces only

mkroehnert hace 12 años
padre
commit
bf6cead6ae
Se han modificado 2 ficheros con 282 adiciones y 282 borrados
  1. 120 120
      js/parser.js
  2. 162 162
      js/parser.pegjs

+ 120 - 120
js/parser.js

@@ -627,9 +627,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, val) {
-                       	   return smalltalk.ValueNode._new()
-                       	   	._value_(val.join("").replace(/\"/ig, '"'))
-        	         })(pos0, result0[1]);
+                             return smalltalk.ValueNode._new()
+                                    ._value_(val.join("").replace(/\"/ig, '"'))
+                         })(pos0, result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -755,9 +755,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, val) {
-        		  		    return smalltalk.ValueNode._new()
-                       	   		    	   ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
-                       	 })(pos0, result0[1]);
+                              return smalltalk.ValueNode._new()
+                                     ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
+                          })(pos0, result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -776,9 +776,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, n) {
-        		  return smalltalk.ValueNode._new()
-                       	   	._value_(n)
-                       	 })(pos0, result0);
+                             return smalltalk.ValueNode._new()
+                                    ._value_(n)
+                         })(pos0, result0);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1055,9 +1055,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, lits) {
-        		  return smalltalk.ValueNode._new()
-                       	   	._value_(lits)
-                       	 })(pos0, result0[2]);
+                             return smalltalk.ValueNode._new()
+                                    ._value_(lits)
+                         })(pos0, result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1136,9 +1136,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, expressions) {
-        	       	  return smalltalk.DynamicArrayNode._new()
-        		        ._nodes_(expressions)
-        		  })(pos0, result0[2]);
+                             return smalltalk.DynamicArrayNode._new()
+                                    ._nodes_(expressions)
+                         })(pos0, result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1202,9 +1202,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, expressions) {
-        	       	  return smalltalk.DynamicDictionaryNode._new()
-        		        ._nodes_(expressions)
-        		  })(pos0, result0[2]);
+                                return smalltalk.DynamicDictionaryNode._new()
+                                       ._nodes_(expressions)
+                            })(pos0, result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1271,8 +1271,8 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, val) {
-        			return smalltalk.ValueNode._new()._value_(val)
-        		    })(pos0, result0);
+                               return smalltalk.ValueNode._new()._value_(val)
+                           })(pos0, result0);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1316,9 +1316,9 @@ smalltalk.parser = (function(){
         result0 = parse_varIdentifier();
         if (result0 !== null) {
           result0 = (function(offset, identifier) {
-        		  return smalltalk.VariableNode._new()
-        			._value_(identifier)
-        		  })(pos0, result0);
+                             return smalltalk.VariableNode._new()
+                                    ._value_(identifier)
+                         })(pos0, result0);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1334,9 +1334,9 @@ smalltalk.parser = (function(){
         result0 = parse_className();
         if (result0 !== null) {
           result0 = (function(offset, className) {
-        		  return smalltalk.ClassReferenceNode._new()
-        		  	._value_(className)
-        		  })(pos0, result0);
+                             return smalltalk.ClassReferenceNode._new()
+                                    ._value_(className)
+                         })(pos0, result0);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1515,7 +1515,7 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, pairs) {
-        	             var keywords = [];
+                             var keywords = [];
                              var params = [];
                              for(var i=0;i<pairs.length;i++){
                                  keywords.push(pairs[i].key);
@@ -1523,8 +1523,8 @@ smalltalk.parser = (function(){
                              for(var i=0;i<pairs.length;i++){
                                  params.push(pairs[i].arg);
                              }
-        		     return [keywords.join(""), params]
-        	         })(pos0, result0);
+                             return [keywords.join(""), params]
+                         })(pos0, result0);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1693,12 +1693,12 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, first, others) {
-        	       	     var result = [first];
-        		     for(var i=0;i<others.length;i++) {
-        		 	 result.push(others[i]);
-        		     }
-        		     return result;
-        	       })(pos0, result0[0], result0[1]);
+                             var result = [first];
+                             for(var i=0;i<others.length;i++) {
+                                 result.push(others[i]);
+                             }
+                             return result;
+                         })(pos0, result0[0], result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1753,10 +1753,10 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, variable, expression) {
-        	       	     return smalltalk.AssignmentNode._new()
-        	       	     	._left_(variable)
-        	       	     	._right_(expression)
-        		 })(pos0, result0[0], result0[4]);
+                             return smalltalk.AssignmentNode._new()
+                                    ._left_(variable)
+                                    ._right_(expression)
+                         })(pos0, result0[0], result0[4]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1820,9 +1820,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, expression) {
-        	       	     return smalltalk.ReturnNode._new()
-        	       	     	._nodes_([expression])
-        	       })(pos0, result0[2]);
+                             return smalltalk.ReturnNode._new()
+                                    ._nodes_([expression])
+                         })(pos0, result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2264,10 +2264,10 @@ smalltalk.parser = (function(){
           }
           if (result0 !== null) {
             result0 = (function(offset, exps, ret) {
-                	      	  var expressions = exps;
-                		  expressions.push(ret);
-                		  return expressions
-            		})(pos0, result0[0], result0[4]);
+                                 var expressions = exps;
+                                 expressions.push(ret);
+                                 return expressions
+                             })(pos0, result0[0], result0[4]);
           }
           if (result0 === null) {
             pos = pos0;
@@ -2312,8 +2312,8 @@ smalltalk.parser = (function(){
             }
             if (result0 !== null) {
               result0 = (function(offset, expressions) {
-                  	          return expressions || []
-              	        })(pos0, result0[0]);
+                                   return expressions || []
+                               })(pos0, result0[0]);
             }
             if (result0 === null) {
               pos = pos0;
@@ -2358,10 +2358,10 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, temps, statements) {
-        	      	  return smalltalk.SequenceNode._new()
-        	      	  	._temps_(temps || [])
-        	      	  	._nodes_(statements || [])
-        		})(pos0, result0[0], result0[2]);
+                             return smalltalk.SequenceNode._new()
+                                    ._temps_(temps || [])
+                                    ._nodes_(statements || [])
+                         })(pos0, result0[0], result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2438,10 +2438,10 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, params, sequence) {
-        	          return smalltalk.BlockNode._new()
-        	          	._parameters_(params || [])
-        	          	._nodes_([sequence._asBlockSequenceNode()])
-        		})(pos0, result0[2], result0[4]);
+                             return smalltalk.BlockNode._new()
+                                    ._parameters_(params || [])
+                                    ._nodes_([sequence._asBlockSequenceNode()])
+                         })(pos0, result0[2], result0[4]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2506,9 +2506,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, selector) {
-        	      	return smalltalk.SendNode._new()
-        	      		._selector_(selector)
-        	      })(pos0, result0[1]);
+                             return smalltalk.SendNode._new()
+                                    ._selector_(selector)
+                         })(pos0, result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2550,13 +2550,13 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, message, tail) {
-        		  if(tail) {
-                  	      return tail._valueForReceiver_(message);
-              		  }
-              		  else {
-                  	      return message;
-              		  }
-          	      })(pos0, result0[0], result0[2]);
+                             if(tail) {
+                                 return tail._valueForReceiver_(message);
+                             }
+                             else {
+                                 return message;
+                             }
+                         })(pos0, result0[0], result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2592,13 +2592,13 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, receiver, tail) {
-        		  if(tail) {
-                  	      return tail._valueForReceiver_(receiver);
-              		  }
-              		  else {
-                  	      return receiver;
-              		  }
-        	      })(pos0, result0[0], result0[2]);
+                             if(tail) {
+                                 return tail._valueForReceiver_(receiver);
+                             }
+                             else {
+                                 return receiver;
+                             }
+                         })(pos0, result0[0], result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2642,10 +2642,10 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, selector, arg) {
-        	          return smalltalk.SendNode._new()
-        	          	._selector_(selector)
-        	          	._arguments_([arg])
-        	      })(pos0, result0[1], result0[3]);
+                             return smalltalk.SendNode._new()
+                                    ._selector_(selector)
+                                    ._arguments_([arg])
+                         })(pos0, result0[1], result0[3]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2675,13 +2675,13 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, message, tail) {
-              	          if(tail) {
-                  	      return tail._valueForReceiver_(message);
-              		  }
-              		  else {
-                  	      return message;
-              		  }
-          	      })(pos0, result0[0], result0[1]);
+                             if(tail) {
+                                 return tail._valueForReceiver_(message);
+                              }
+                             else {
+                                 return message;
+                             }
+                         })(pos0, result0[0], result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2711,13 +2711,13 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, receiver, tail) {
-        	      	  if(tail) {
-                  	      return tail._valueForReceiver_(receiver);
-              		  }
-              		  else {
-                  	      return receiver;
-              		  }
-        	      })(pos0, result0[0], result0[1]);
+                             if(tail) {
+                                 return tail._valueForReceiver_(receiver);
+                             }
+                             else {
+                                 return receiver;
+                             }
+                         })(pos0, result0[0], result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2795,16 +2795,16 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, pairs) {
-              		  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)
-          	      })(pos0, result0[1]);
+                             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)
+                         })(pos0, result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2833,8 +2833,8 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, receiver, tail) {
-        	          return tail._valueForReceiver_(receiver);
-        	      })(pos0, result0[0], result0[1]);
+                             return tail._valueForReceiver_(receiver);
+                         })(pos0, result0[0], result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -2986,15 +2986,15 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, send, messages) {
-        		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)
-          	      })(pos0, result0[1], result0[2]);
+                             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)
+                         })(pos0, result0[1], result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -3102,9 +3102,9 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, val) {
-        		return smalltalk.JSStatementNode._new()
-        			._source_(val.join(""))
-          	      })(pos0, result0[1]);
+                             return smalltalk.JSStatementNode._new()
+                                   ._source_(val.join(""))
+                         })(pos0, result0[1]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -3158,11 +3158,11 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, pattern, sequence) {
-        	      	return smalltalk.MethodNode._new()
-        		       ._selector_(pattern[0])
-        		       ._arguments_(pattern[1])
-        		       ._nodes_([sequence])
-        	      })(pos0, result0[1], result0[3]);
+                              return smalltalk.MethodNode._new()
+                                    ._selector_(pattern[0])
+                                    ._arguments_(pattern[1])
+                                    ._nodes_([sequence])
+                         })(pos0, result0[1], result0[3]);
         }
         if (result0 === null) {
           pos = pos0;

+ 162 - 162
js/parser.pegjs

@@ -8,51 +8,53 @@ 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()
+                            ._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()
+                             ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
+                  }
 number         = n:(float / integer) {
-		  return smalltalk.ValueNode._new()
-               	   	._value_(n)
-               	 }
+                     return smalltalk.ValueNode._new()
+                            ._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()
+                            ._value_(lits)
+                 }
 dynamicArray   = "{" ws expressions:expressions? ws "."? "}" {
-	       	  return smalltalk.DynamicArrayNode._new()
-		        ._nodes_(expressions)
-		  }
+                     return smalltalk.DynamicArrayNode._new()
+                            ._nodes_(expressions)
+                 }
 dynamicDictionary = "#{" ws expressions: expressions? ws "}" {
-	       	  return smalltalk.DynamicDictionaryNode._new()
-		        ._nodes_(expressions)
-		  }
+                        return smalltalk.DynamicDictionaryNode._new()
+                               ._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()
+                              ._value_(val)
+                   }
 literal        = pseudoVariable / number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block
 
 
 variable       = identifier:varIdentifier {
-		  return smalltalk.VariableNode._new()
-			._value_(identifier)
-		  }
+                     return smalltalk.VariableNode._new()
+                            ._value_(identifier)
+                 }
 classReference = className:className {
-		  return smalltalk.ClassReferenceNode._new()
-		  	._value_(className)
-		  }
+                     return smalltalk.ClassReferenceNode._new()
+                            ._value_(className)
+                 }
 
 reference      = variable / classReference
 
@@ -62,7 +64,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 +72,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 +81,23 @@ 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()
+                            ._left_(variable)
+                            ._right_(expression)
+                 }
 
 ret            = '^' ws expression:expression ws '.'? {
-	       	     return smalltalk.ReturnNode._new()
-	       	     	._nodes_([expression])
-	       }
+                     return smalltalk.ReturnNode._new()
+                            ._nodes_([expression])
+                 }
   
 temps          = "|" vars:(ws variable:identifier ws {return variable})* "|" {return vars}
 
@@ -103,121 +105,119 @@ 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()
+                            ._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;
+                     }
+                 }
+
 
 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()
+                             ._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])
+                 }