diff --git a/lib/src/parser.dart b/lib/src/parser.dart index f709c3c..cc469e1 100644 --- a/lib/src/parser.dart +++ b/lib/src/parser.dart @@ -19,15 +19,13 @@ class ExpressionParser { .flatten() .map((v) => Identifier(v)); - // Parse simple numeric literals: `12`, `3.4`, `.5`. - Parser get numericLiteral => ((digit() | char('.')).and() & - (digit().star() & - ((char('.') & digit().plus()) | - (char('x') & digit().plus()) | - (anyOf('Ee') & - anyOf('+-').optional() & - digit().plus())) - .optional())) + // Parse simple numeric literals: `12`, `3.4`, `.5`, `0xAB`. + Parser get numericLiteral => + ((char('0') & anyOf('xX') & (digit() | anyOf('abcdefABCDEF')).plus()) | + (digit() | char('.')).and() & + ((digit().star() & (char('.') & digit().plus()).optional()) & + (anyOf('Ee') & anyOf('+-').optional() & digit().plus()) + .optional())) .flatten() .map((v) { return Literal(num.parse(v), v); diff --git a/test/expressions_test.dart b/test/expressions_test.dart index d60f804..a6e7d6e 100644 --- a/test/expressions_test.dart +++ b/test/expressions_test.dart @@ -19,19 +19,29 @@ void main() { }); test('numeric literal', () { - for (var v in ['134', '.5', '43.2', '1e3', '1E-3', '1e+0', '0x01']) { + for (var v in [ + '134', + '.5', + '43.2', + '1e3', + '1E-3', + '1e+0', + '.1e2', + '1.23e4', + '.6e-7', + '0x01', + '0xD3', + '0X1b' + ]) { var w = parser.numericLiteral.end().parse(v); expect(w is Success, isTrue, reason: 'Failed parsing `$v`'); expect(w.value.value, num.parse(v)); expect(w.value.raw, v); } - for (var v in [ - '-134', - '.5.4', - '1e5E3', - ]) { - expect(parser.numericLiteral.end().parse(v) is Success, isFalse); + for (var v in ['-134', '.5.4', '1e5E3', '5.', '12x34']) { + expect(parser.numericLiteral.end().parse(v) is Success, isFalse, + reason: 'Expected to fail parsing `$v`'); } });