1
0
Prechádzať zdrojové kódy

parser.pegjs: support smalltalk style hex numbers

Manfred Kroehnert 12 rokov pred
rodič
commit
2c4c3c3dac
2 zmenil súbory, kde vykonal 90 pridanie a 8 odobranie
  1. 88 7
      js/parser.js
  2. 2 1
      js/parser.pegjs

+ 88 - 7
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,
@@ -770,9 +771,12 @@ 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) {
@@ -786,6 +790,82 @@ smalltalk.parser = (function(){
         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;
+        }
+        return result0;
+      }
+      
       function parse_float() {
         var result0, result1, result2, result3, result4;
         var pos0, pos1;
@@ -1271,7 +1351,8 @@ smalltalk.parser = (function(){
         }
         if (result0 !== null) {
           result0 = (function(offset, val) {
-                               return smalltalk.ValueNode._new()._value_(val)
+                               return smalltalk.ValueNode._new()
+                                      ._value_(val)
                            })(pos0, result0);
         }
         if (result0 === null) {
@@ -3103,7 +3184,7 @@ smalltalk.parser = (function(){
         if (result0 !== null) {
           result0 = (function(offset, val) {
                              return smalltalk.JSStatementNode._new()
-                                   ._source_(val.join(""))
+                                    ._source_(val.join(""))
                          })(pos0, result0[1]);
         }
         if (result0 === null) {
@@ -3159,9 +3240,9 @@ smalltalk.parser = (function(){
         if (result0 !== null) {
           result0 = (function(offset, pattern, sequence) {
                               return smalltalk.MethodNode._new()
-                                    ._selector_(pattern[0])
-                                    ._arguments_(pattern[1])
-                                    ._nodes_([sequence])
+                                     ._selector_(pattern[0])
+                                     ._arguments_(pattern[1])
+                                     ._nodes_([sequence])
                          })(pos0, result0[1], result0[3]);
         }
         if (result0 === null) {

+ 2 - 1
js/parser.pegjs

@@ -19,10 +19,11 @@ symbol         = "#"val:(
                       return smalltalk.ValueNode._new()
                              ._value_(smalltalk.symbolFor(val.join("").replace(/\"/ig, '"')))
                   }
-number         = n:(float / integer) {
+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 ")" {