Skip to content

Commit

Permalink
Fix GitHub issue #63 - Handle +Infinity properly.
Browse files Browse the repository at this point in the history
The code handled `Infinity` and `-Infinity` but not `+Infinity`.
This change fixes that so all three are handled.
  • Loading branch information
dpranke committed May 15, 2023
1 parent 25ca192 commit ff2a072
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 11 deletions.
3 changes: 2 additions & 1 deletion json5/json5.g
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ id_continue = ascii_id_start
| '\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'
Expand Down
23 changes: 13 additions & 10 deletions json5/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,8 +734,8 @@ def _id_continue__c9_(self):

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')
Expand All @@ -746,19 +746,22 @@ def _num_literal__c0_(self):

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__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__c3_(self):
def _num_literal__c4_(self):
self._str('Infinity')

def _num_literal__c4_(self):
def _num_literal__c5_(self):
self._str('NaN')

def _dec_literal_(self):
Expand Down
1 change: 1 addition & 0 deletions tests/lib_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ def test_numbers(self):

# 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')))
Expand Down

0 comments on commit ff2a072

Please sign in to comment.