Fix GitHub issue #63 - Handle `+Infinity` properly.
The code handled `Infinity` and `-Infinity` but not `+Infinity`.
This change fixes that so all three are handled.
diff --git a/json5/json5.g b/json5/json5.g
index a33ccd2..2c5c05b 100644
--- a/json5/json5.g
+++ b/json5/json5.g
@@ -98,7 +98,8 @@
| '\u200D'
num_literal = '-' num_literal:n -> '-' + n
- | '+'? dec_literal:d ~id_start -> d
+ | '+' num_literal:n -> n
+ | dec_literal:d ~id_start -> d
| hex_literal
| 'Infinity'
| 'NaN'
diff --git a/json5/parser.py b/json5/parser.py
index 86bc194..eb297fb 100644
--- a/json5/parser.py
+++ b/json5/parser.py
@@ -734,8 +734,8 @@
def _num_literal_(self):
self._choose([self._num_literal__c0_, self._num_literal__c1_,
- self._hex_literal_, self._num_literal__c3_,
- self._num_literal__c4_])
+ self._num_literal__c2_, self._hex_literal_,
+ self._num_literal__c4_, self._num_literal__c5_])
def _num_literal__c0_(self):
self._push('num_literal__c0')
@@ -746,19 +746,22 @@
def _num_literal__c1_(self):
self._push('num_literal__c1')
- self._seq([self._num_literal__c1__s0_,
- lambda: self._bind(self._dec_literal_, 'd'),
- lambda: self._not(self._id_start_),
- lambda: self._succeed(self._get('d'))])
+ self._seq([lambda: self._ch('+'),
+ lambda: self._bind(self._num_literal_, 'n'),
+ lambda: self._succeed(self._get('n'))])
self._pop('num_literal__c1')
- def _num_literal__c1__s0_(self):
- self._opt(lambda: self._ch('+'))
-
- def _num_literal__c3_(self):
- self._str('Infinity')
+ def _num_literal__c2_(self):
+ self._push('num_literal__c2')
+ self._seq([lambda: self._bind(self._dec_literal_, 'd'),
+ lambda: self._not(self._id_start_),
+ lambda: self._succeed(self._get('d'))])
+ self._pop('num_literal__c2')
def _num_literal__c4_(self):
+ self._str('Infinity')
+
+ def _num_literal__c5_(self):
self._str('NaN')
def _dec_literal_(self):
diff --git a/tests/lib_test.py b/tests/lib_test.py
index 68842e7..90e5f56 100644
--- a/tests/lib_test.py
+++ b/tests/lib_test.py
@@ -120,6 +120,7 @@
# names
self.check('Infinity', float('inf'))
+ self.check('+Infinity', float('inf'))
self.check('-Infinity', float('-inf'))
self.assertTrue(math.isnan(json5.loads('NaN')))
self.assertTrue(math.isnan(json5.loads('-NaN')))