Merge pull request #35 from leonsenft/fix-number-lexing
Adds support for signed decimals with leading '.'
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index 063ac34..a14e866 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -97,7 +97,7 @@
case TokenChar.HASH:
return _finishToken(TokenKind.HASH);
case TokenChar.PLUS:
- if (maybeEatDigit()) return finishNumber();
+ if (_nextCharsAreNumber(ch)) return finishNumber();
return _finishToken(TokenKind.PLUS);
case TokenChar.MINUS:
if (inSelectorExpression || unicodeRange) {
@@ -105,7 +105,7 @@
// not part of identifier e.g., interval value range (e.g. U+400-4ff)
// or minus operator in selector expression.
return _finishToken(TokenKind.MINUS);
- } else if (maybeEatDigit()) {
+ } else if (_nextCharsAreNumber(ch)) {
return finishNumber();
} else if (TokenizerHelpers.isIdentifierStart(ch)) {
return finishIdentifier();
diff --git a/lib/src/tokenizer_base.dart b/lib/src/tokenizer_base.dart
index ccdd7be..c2a448f 100644
--- a/lib/src/tokenizer_base.dart
+++ b/lib/src/tokenizer_base.dart
@@ -79,9 +79,9 @@
}
}
- int _peekChar() {
- if (_index < _text.length) {
- return _text.codeUnitAt(_index);
+ int _peekChar([int offset = 0]) {
+ if (_index + offset < _text.length) {
+ return _text.codeUnitAt(_index + offset);
} else {
return 0;
}
@@ -100,6 +100,17 @@
}
}
+ bool _nextCharsAreNumber(int first) {
+ if (TokenizerHelpers.isDigit(first)) return true;
+ var second = _peekChar();
+ if (first == TokenChar.DOT) return TokenizerHelpers.isDigit(second);
+ if (first == TokenChar.PLUS || first == TokenChar.MINUS) {
+ return TokenizerHelpers.isDigit(second) ||
+ (second == TokenChar.DOT && TokenizerHelpers.isDigit(_peekChar(1)));
+ }
+ return false;
+ }
+
Token _finishToken(int kind) {
return new Token(kind, _file.span(_startIndex, _index));
}
diff --git a/test/declaration_test.dart b/test/declaration_test.dart
index 6452819..c0c8f53 100644
--- a/test/declaration_test.dart
+++ b/test/declaration_test.dart
@@ -170,8 +170,8 @@
right: 300px;
bottom: 400cm;
border-width: 2.5mm;
- margin-top: .5in;
- margin-left: 5pc;
+ margin-top: -.5in;
+ margin-left: +5pc;
margin-right: 5ex;
margin-bottom: 5ch;
font-size: 10pt;
@@ -208,8 +208,8 @@
right: 300px;
bottom: 400cm;
border-width: 2.5mm;
- margin-top: .5in;
- margin-left: 5pc;
+ margin-top: -.5in;
+ margin-left: +5pc;
margin-right: 5ex;
margin-bottom: 5ch;
font-size: 10pt;