diff options
| -rw-r--r-- | src/parser.js | 10 | ||||
| -rw-r--r-- | test/JsonSpec.js | 7 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/parser.js b/src/parser.js index 8dc8f9c2..77800209 100644 --- a/src/parser.js +++ b/src/parser.js @@ -101,26 +101,26 @@ function lex(text, parseStringsForObjects){ '_' == ch || ch == '$'; } function isExpOperator(ch) { - return ch == '-' || ch == '+'; + return ch == '-' || ch == '+' || isNumber(ch); } function readNumber() { var number = ""; var start = index; while (index < text.length) { - var ch = text.charAt(index); + var ch = lowercase(text.charAt(index)); if (ch == '.' || isNumber(ch)) { number += ch; } else { var peekCh = peek(); - if (ch == 'E' && isExpOperator(peekCh)) { + if (ch == 'e' && isExpOperator(peekCh)) { number += ch; } else if (isExpOperator(ch) && peekCh && isNumber(peekCh) && - number.charAt(number.length - 1) == 'E') { + number.charAt(number.length - 1) == 'e') { number += ch; } else if (isExpOperator(ch) && (!peekCh || !isNumber(peekCh)) && - number.charAt(number.length - 1) == 'E') { + number.charAt(number.length - 1) == 'e') { throw 'Lexer found invalid exponential value "' + text + '"'; } else { break; diff --git a/test/JsonSpec.js b/test/JsonSpec.js index 052c239c..e91f50cd 100644 --- a/test/JsonSpec.js +++ b/test/JsonSpec.js @@ -109,6 +109,13 @@ describe('json', function(){ expect(fromJson("{neg:-2.55, pos:+.3, a:[-2, +.1, -.2, +.3]}")).toEqual({neg:-2.55, pos:+.3, a:[-2, +.1, -.2, +.3]}); }); + it('should parse exponents', function() { + expect(fromJson("{exp:1.2E10}")).toEqual({exp:1.2E10}); + expect(fromJson("{exp:1.2E-10}")).toEqual({exp:1.2E-10}); + expect(fromJson("{exp:1.2e+10}")).toEqual({exp:1.2E10}); + expect(fromJson("{exp:1.2e-10}")).toEqual({exp:1.2E-10}); + }); + describe('security', function(){ it('should not allow naked expressions', function(){ expect(function(){fromJson('1+2');}).toThrow("Did not understand '+2' while evaluating '1+2'."); |
