ソースを参照

Fixed a bug in float parsing

Nicolas Petton 12 年 前
コミット
e9277011ea
2 ファイル変更57 行追加7 行削除
  1. 56 6
      js/parser.js
  2. 1 1
      js/parser.pegjs

+ 56 - 6
js/parser.js

@@ -996,17 +996,42 @@ smalltalk.parser = (function(){
         var savedPos0 = pos;
         var savedPos1 = pos;
         if (input.substr(pos).match(/^[\-]/) !== null) {
-          var result7 = input.charAt(pos);
+          var result9 = input.charAt(pos);
           pos++;
         } else {
-          var result7 = null;
+          var result9 = null;
           if (reportMatchFailures) {
             matchFailed("[\\-]");
           }
         }
-        var result3 = result7 !== null ? result7 : '';
+        var result3 = result9 !== null ? result9 : '';
         if (result3 !== null) {
-          var result4 = parse_integer();
+          if (input.substr(pos).match(/^[0-9]/) !== null) {
+            var result8 = input.charAt(pos);
+            pos++;
+          } else {
+            var result8 = null;
+            if (reportMatchFailures) {
+              matchFailed("[0-9]");
+            }
+          }
+          if (result8 !== null) {
+            var result4 = [];
+            while (result8 !== null) {
+              result4.push(result8);
+              if (input.substr(pos).match(/^[0-9]/) !== null) {
+                var result8 = input.charAt(pos);
+                pos++;
+              } else {
+                var result8 = null;
+                if (reportMatchFailures) {
+                  matchFailed("[0-9]");
+                }
+              }
+            }
+          } else {
+            var result4 = null;
+          }
           if (result4 !== null) {
             if (input.substr(pos, 1) === ".") {
               var result5 = ".";
@@ -1018,7 +1043,32 @@ smalltalk.parser = (function(){
               }
             }
             if (result5 !== null) {
-              var result6 = parse_integer();
+              if (input.substr(pos).match(/^[0-9]/) !== null) {
+                var result7 = input.charAt(pos);
+                pos++;
+              } else {
+                var result7 = null;
+                if (reportMatchFailures) {
+                  matchFailed("[0-9]");
+                }
+              }
+              if (result7 !== null) {
+                var result6 = [];
+                while (result7 !== null) {
+                  result6.push(result7);
+                  if (input.substr(pos).match(/^[0-9]/) !== null) {
+                    var result7 = input.charAt(pos);
+                    pos++;
+                  } else {
+                    var result7 = null;
+                    if (reportMatchFailures) {
+                      matchFailed("[0-9]");
+                    }
+                  }
+                }
+              } else {
+                var result6 = null;
+              }
               if (result6 !== null) {
                 var result1 = [result3, result4, result5, result6];
               } else {
@@ -1038,7 +1088,7 @@ smalltalk.parser = (function(){
           pos = savedPos1;
         }
         var result2 = result1 !== null
-          ? (function(neg, int, dec) {return parseFloat((neg+int+"."+dec), 10)})(result1[0], result1[1], result1[3])
+          ? (function(neg, int, dec) {return parseFloat((neg + int.join("") + "." + dec.join("")), 10)})(result1[0], result1[1], result1[3])
           : null;
         if (result2 !== null) {
           var result0 = result2;

+ 1 - 1
js/parser.pegjs

@@ -22,7 +22,7 @@ number         = n:(float / integer) {
 		  return smalltalk.ValueNode._new()
                	   	._value_(n)
                	 }
-float          = neg:[-]?int:integer "." dec:integer {return parseFloat((neg+int+"."+dec), 10)}
+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()