Browse Source

Merge pull request #281 from mkroehnert/hex

add support for hexadeximal numbers in the parser grammar
Nicolas Petton 12 years ago
parent
commit
6fda4e2cc2
5 changed files with 383 additions and 288 deletions
  1. 0 0
      js/lib/peg-0.6.2.min.js
  2. 7 0
      js/lib/peg-0.7.0.min.js
  3. 203 122
      js/parser.js
  4. 164 163
      js/parser.pegjs
  5. 9 3
      st/Makefile

File diff suppressed because it is too large
+ 0 - 0
js/lib/peg-0.6.2.min.js


File diff suppressed because it is too large
+ 7 - 0
js/lib/peg-0.7.0.min.js


+ 203 - 122
js/parser.js

@@ -47,6 +47,7 @@ smalltalk.parser = (function(){
         "string": parse_string,
         "symbol": parse_symbol,
         "number": parse_number,
+        "hex": parse_hex,
         "float": parse_float,
         "integer": parse_integer,
         "literalArray": parse_literalArray,
@@ -627,9 +628,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 +756,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;
@@ -770,15 +771,94 @@ smalltalk.parser = (function(){
         var pos0;
         
         pos0 = pos;
-        result0 = parse_float();
+        result0 = parse_hex();
         if (result0 === null) {
-          result0 = parse_integer();
+          result0 = parse_float();
+          if (result0 === null) {
+            result0 = parse_integer();
+          }
         }
         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;
+        }
+        return result0;
+      }
+      
+      function parse_hex() {
+        var result0, result1, result2, result3;
+        var pos0, pos1;
+        
+        pos0 = pos;
+        pos1 = pos;
+        if (/^[\-]/.test(input.charAt(pos))) {
+          result0 = input.charAt(pos);
+          pos++;
+        } else {
+          result0 = null;
+          if (reportFailures === 0) {
+            matchFailed("[\\-]");
+          }
+        }
+        result0 = result0 !== null ? result0 : "";
+        if (result0 !== null) {
+          if (input.substr(pos, 3) === "16r") {
+            result1 = "16r";
+            pos += 3;
+          } else {
+            result1 = null;
+            if (reportFailures === 0) {
+              matchFailed("\"16r\"");
+            }
+          }
+          if (result1 !== null) {
+            if (/^[0-9a-zA-Z]/.test(input.charAt(pos))) {
+              result3 = input.charAt(pos);
+              pos++;
+            } else {
+              result3 = null;
+              if (reportFailures === 0) {
+                matchFailed("[0-9a-zA-Z]");
+              }
+            }
+            if (result3 !== null) {
+              result2 = [];
+              while (result3 !== null) {
+                result2.push(result3);
+                if (/^[0-9a-zA-Z]/.test(input.charAt(pos))) {
+                  result3 = input.charAt(pos);
+                  pos++;
+                } else {
+                  result3 = null;
+                  if (reportFailures === 0) {
+                    matchFailed("[0-9a-zA-Z]");
+                  }
+                }
+              }
+            } else {
+              result2 = null;
+            }
+            if (result2 !== null) {
+              result0 = [result0, result1, result2];
+            } else {
+              result0 = null;
+              pos = pos1;
+            }
+          } else {
+            result0 = null;
+            pos = pos1;
+          }
+        } else {
+          result0 = null;
+          pos = pos1;
+        }
+        if (result0 !== null) {
+          result0 = (function(offset, neg, num) {return parseInt((neg + num.join("")), 16)})(pos0, result0[0], result0[2]);
         }
         if (result0 === null) {
           pos = pos0;
@@ -1055,9 +1135,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 +1216,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 +1282,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 +1351,9 @@ 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 +1397,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 +1415,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 +1596,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 +1604,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 +1774,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 +1834,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 +1901,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 +2345,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 +2393,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 +2439,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 +2519,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 +2587,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 +2631,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 +2673,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 +2723,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 +2756,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 +2792,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 +2876,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 +2914,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 +3067,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 +3183,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 +3239,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;

+ 164 - 163
js/parser.pegjs

@@ -8,51 +8,54 @@ 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, '"')))
-               	 }
-number         = n:(float / integer) {
-		  return smalltalk.ValueNode._new()
-               	   	._value_(n)
-               	 }
+                         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:(hex / float / integer) {
+                     return smalltalk.ValueNode._new()
+                            ._value_(n)
+                 }
+hex            = neg:[-]? "16r" num:[0-9a-zA-Z]+ {return parseInt((neg + num.join("")), 16)}
 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 +65,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 +73,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 +82,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 +106,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])
+                 }
 

+ 9 - 3
st/Makefile

@@ -3,10 +3,10 @@
 # javascript files from them, for both debug and deployment.
 #
 # Where we find the current runnable code and where we put our js files on install
-JS	:= ../js/
+JS      := ../js/
 
 # The compiler script
-AMBERC	:= ../bin/amberc
+AMBERC  := ../bin/amberc
 
 # Generic flags to AMBERC
 FLAGS   := -d
@@ -23,9 +23,15 @@ all: $(OBJECTS)
 # First we copy the core javascript files from current working files
 # into this directory. These files are hand written or generated using
 # other tools (parser.js). $@ is the target name.
-boot.js init.js parser.js:
+boot.js init.js:
 	cp ../js/$@ .
 
+# generate the parser
+# $@ is the target
+# $< is the prerequisite
+parser.js: ../js/parser.pegjs
+	pegjs -e smalltalk.parser $< $@
+
 # Then we compile Kernel-*.st files depending on having boot.js, init.js and parser.js
 # $< means the first dependency - in other words Kernel-*.st
 Kernel-Objects.js: Kernel-Objects.st boot.js init.js parser.js

Some files were not shown because too many files changed in this diff