Bladeren bron

parser: you can write #(4 #(5 6 #()) 7) as #(4 (5 6 ()) 7)

Herbert Vojčík 12 jaren geleden
bovenliggende
commit
96253150d3
2 gewijzigde bestanden met toevoegingen van 146 en 54 verwijderingen
  1. 143 53
      js/parser.js
  2. 3 1
      js/parser.pegjs

+ 143 - 53
js/parser.js

@@ -51,6 +51,8 @@ smalltalk.parser = (function(){
         "float": parse_float,
         "integer": parse_integer,
         "literalArray": parse_literalArray,
+        "bareLiteralArray": parse_bareLiteralArray,
+        "literalArrayRest": parse_literalArrayRest,
         "dynamicArray": parse_dynamicArray,
         "dynamicDictionary": parse_dynamicDictionary,
         "pseudoVariable": parse_pseudoVariable,
@@ -1233,8 +1235,8 @@ smalltalk.parser = (function(){
           return cachedResult.result;
         }
         
-        var result0, result1, result2, result3, result4;
-        var pos0, pos1, pos2, pos3;
+        var result0, result1;
+        var pos0, pos1;
         
         pos0 = clone(pos);
         pos1 = clone(pos);
@@ -1248,72 +1250,160 @@ smalltalk.parser = (function(){
           }
         }
         if (result0 !== null) {
-          result1 = parse_ws();
+          result1 = parse_literalArrayRest();
           if (result1 !== null) {
-            result2 = [];
+            result0 = [result0, result1];
+          } else {
+            result0 = null;
+            pos = clone(pos1);
+          }
+        } else {
+          result0 = null;
+          pos = clone(pos1);
+        }
+        if (result0 !== null) {
+          result0 = (function(offset, line, column, rest) {return rest})(pos0.offset, pos0.line, pos0.column, result0[1]);
+        }
+        if (result0 === null) {
+          pos = clone(pos0);
+        }
+        
+        cache[cacheKey] = {
+          nextPos: clone(pos),
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_bareLiteralArray() {
+        var cacheKey = "bareLiteralArray@" + pos.offset;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = clone(cachedResult.nextPos);
+          return cachedResult.result;
+        }
+        
+        var result0, result1;
+        var pos0, pos1;
+        
+        pos0 = clone(pos);
+        pos1 = clone(pos);
+        if (input.charCodeAt(pos.offset) === 40) {
+          result0 = "(";
+          advance(pos, 1);
+        } else {
+          result0 = null;
+          if (reportFailures === 0) {
+            matchFailed("\"(\"");
+          }
+        }
+        if (result0 !== null) {
+          result1 = parse_literalArrayRest();
+          if (result1 !== null) {
+            result0 = [result0, result1];
+          } else {
+            result0 = null;
+            pos = clone(pos1);
+          }
+        } else {
+          result0 = null;
+          pos = clone(pos1);
+        }
+        if (result0 !== null) {
+          result0 = (function(offset, line, column, rest) {return rest})(pos0.offset, pos0.line, pos0.column, result0[1]);
+        }
+        if (result0 === null) {
+          pos = clone(pos0);
+        }
+        
+        cache[cacheKey] = {
+          nextPos: clone(pos),
+          result:  result0
+        };
+        return result0;
+      }
+      
+      function parse_literalArrayRest() {
+        var cacheKey = "literalArrayRest@" + pos.offset;
+        var cachedResult = cache[cacheKey];
+        if (cachedResult) {
+          pos = clone(cachedResult.nextPos);
+          return cachedResult.result;
+        }
+        
+        var result0, result1, result2, result3;
+        var pos0, pos1, pos2, pos3;
+        
+        pos0 = clone(pos);
+        pos1 = clone(pos);
+        result0 = parse_ws();
+        if (result0 !== null) {
+          result1 = [];
+          pos2 = clone(pos);
+          pos3 = clone(pos);
+          result2 = parse_parseTimeLiteral();
+          if (result2 === null) {
+            result2 = parse_bareLiteralArray();
+          }
+          if (result2 !== null) {
+            result3 = parse_ws();
+            if (result3 !== null) {
+              result2 = [result2, result3];
+            } else {
+              result2 = null;
+              pos = clone(pos3);
+            }
+          } else {
+            result2 = null;
+            pos = clone(pos3);
+          }
+          if (result2 !== null) {
+            result2 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result2[0]);
+          }
+          if (result2 === null) {
+            pos = clone(pos2);
+          }
+          while (result2 !== null) {
+            result1.push(result2);
             pos2 = clone(pos);
             pos3 = clone(pos);
-            result3 = parse_parseTimeLiteral();
-            if (result3 !== null) {
-              result4 = parse_ws();
-              if (result4 !== null) {
-                result3 = [result3, result4];
+            result2 = parse_parseTimeLiteral();
+            if (result2 === null) {
+              result2 = parse_bareLiteralArray();
+            }
+            if (result2 !== null) {
+              result3 = parse_ws();
+              if (result3 !== null) {
+                result2 = [result2, result3];
               } else {
-                result3 = null;
+                result2 = null;
                 pos = clone(pos3);
               }
             } else {
-              result3 = null;
+              result2 = null;
               pos = clone(pos3);
             }
-            if (result3 !== null) {
-              result3 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result3[0]);
+            if (result2 !== null) {
+              result2 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result2[0]);
             }
-            if (result3 === null) {
+            if (result2 === null) {
               pos = clone(pos2);
             }
-            while (result3 !== null) {
-              result2.push(result3);
-              pos2 = clone(pos);
-              pos3 = clone(pos);
-              result3 = parse_parseTimeLiteral();
-              if (result3 !== null) {
-                result4 = parse_ws();
-                if (result4 !== null) {
-                  result3 = [result3, result4];
-                } else {
-                  result3 = null;
-                  pos = clone(pos3);
-                }
+          }
+          if (result1 !== null) {
+            result2 = parse_ws();
+            if (result2 !== null) {
+              if (input.charCodeAt(pos.offset) === 41) {
+                result3 = ")";
+                advance(pos, 1);
               } else {
                 result3 = null;
-                pos = clone(pos3);
-              }
-              if (result3 !== null) {
-                result3 = (function(offset, line, column, lit) {return lit._value()})(pos2.offset, pos2.line, pos2.column, result3[0]);
-              }
-              if (result3 === null) {
-                pos = clone(pos2);
+                if (reportFailures === 0) {
+                  matchFailed("\")\"");
+                }
               }
-            }
-            if (result2 !== null) {
-              result3 = parse_ws();
               if (result3 !== null) {
-                if (input.charCodeAt(pos.offset) === 41) {
-                  result4 = ")";
-                  advance(pos, 1);
-                } else {
-                  result4 = null;
-                  if (reportFailures === 0) {
-                    matchFailed("\")\"");
-                  }
-                }
-                if (result4 !== null) {
-                  result0 = [result0, result1, result2, result3, result4];
-                } else {
-                  result0 = null;
-                  pos = clone(pos1);
-                }
+                result0 = [result0, result1, result2, result3];
               } else {
                 result0 = null;
                 pos = clone(pos1);
@@ -1334,7 +1424,7 @@ smalltalk.parser = (function(){
           result0 = (function(offset, line, column, lits) {
                              return smalltalk.ValueNode._new()
                                     ._value_(lits)
-                         })(pos0.offset, pos0.line, pos0.column, result0[2]);
+                         })(pos0.offset, pos0.line, pos0.column, result0[1]);
         }
         if (result0 === null) {
           pos = clone(pos0);

+ 3 - 1
js/parser.pegjs

@@ -26,7 +26,9 @@ number         = n:(hex / float / integer) {
 hex            = neg:[-]? "16r" num:[0-9a-fA-F]+ {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:parseTimeLiteral ws {return lit._value()})* ws ")" {
+literalArray   = "#(" rest:literalArrayRest {return rest}
+bareLiteralArray   = "(" rest:literalArrayRest {return rest}
+literalArrayRest   = ws lits:(lit:(parseTimeLiteral / bareLiteralArray) ws {return lit._value()})* ws ")" {
                      return smalltalk.ValueNode._new()
                             ._value_(lits)
                  }