aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/parser.js10
-rw-r--r--test/JsonSpec.js7
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'.");