aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShyam Seshadri2010-10-08 17:11:45 -0700
committerMisko Hevery2010-10-08 20:41:19 -0700
commit8490bb921bd03239f5856cd44b7e21ef6db23eca (patch)
tree2bc58b6247ab1f68796ccb0570365e3ae8c48e72
parente3ea980c819f62b8c2021f813e3534e4e5731d7d (diff)
downloadangular.js-8490bb921bd03239f5856cd44b7e21ef6db23eca.tar.bz2
Fix bug with Lexer not recognizing exponential values and values starting with dots
-rw-r--r--src/Parser.js21
-rw-r--r--test/ParserTest.js32
2 files changed, 52 insertions, 1 deletions
diff --git a/src/Parser.js b/src/Parser.js
index 74815cd1..2c681be0 100644
--- a/src/Parser.js
+++ b/src/Parser.js
@@ -53,6 +53,9 @@ function lex(text, parseStrings){
tokens.push({index:index, text:ch});
index++;
canStartRegExp = false;
+ } else if (ch == '.' && isNumber(peek())) {
+ readNumber();
+ canStartRegExp = false;
} else if ( ch == ':' || ch == '.' || ch == ',' || ch == ';') {
tokens.push({index:index, text:ch});
index++;
@@ -104,6 +107,9 @@ function lex(text, parseStrings){
'A' <= ch && ch <= 'Z' ||
'_' == ch || ch == '$';
}
+ function isExpOperator(ch) {
+ return ch == '-' || ch == '+';
+ }
function readNumber() {
var number = "";
var start = index;
@@ -112,7 +118,20 @@ function lex(text, parseStrings){
if (ch == '.' || isNumber(ch)) {
number += ch;
} else {
- break;
+ var peekCh = peek();
+ if (ch == 'E' && isExpOperator(peekCh)) {
+ number += ch;
+ } else if (isExpOperator(ch) &&
+ peekCh && isNumber(peekCh) &&
+ number.charAt(number.length - 1) == 'E') {
+ number += ch;
+ } else if (isExpOperator(ch) &&
+ (!peekCh || !isNumber(peekCh)) &&
+ number.charAt(number.length - 1) == 'E') {
+ throw 'Lexer found invalid exponential value "' + text + '"';
+ } else {
+ break;
+ }
}
index++;
}
diff --git a/test/ParserTest.js b/test/ParserTest.js
index 6a70bce8..916beb26 100644
--- a/test/ParserTest.js
+++ b/test/ParserTest.js
@@ -141,6 +141,38 @@ LexerTest.prototype.testNumber = function(){
expect(tokens[0].text).toEqual(0.5);
};
+LexerTest.prototype.testNegativeNumber = function(){
+ var value = createScope().$eval("-0.5");
+ expect(value).toEqual(-0.5);
+
+ value = createScope().$eval("{a:-0.5}");
+ expect(value).toEqual({a:-0.5});
+};
+
+LexerTest.prototype.testNumberExponent = function(){
+ var tokens = lex("0.5E-10");
+ expect(tokens[0].text).toEqual(0.5E-10);
+ expect(createScope().$eval("0.5E-10")).toEqual(0.5E-10);
+
+ tokens = lex("0.5E+10");
+ expect(tokens[0].text).toEqual(0.5E+10);
+};
+
+LexerTest.prototype.testNumberExponentInvalid = function(){
+ assertThrows('Lexer found invalid exponential value "0.5E-"', function(){
+ lex("0.5E-");
+ });
+ assertThrows('Lexer found invalid exponential value "0.5E-A"', function(){
+ lex("0.5E-A");
+ });
+};
+
+LexerTest.prototype.testNumberStartingWithDot = function(){
+ var tokens = lex(".5");
+ expect(tokens[0].text).toEqual(0.5);
+};
+
+
ParserTest = TestCase('ParserTest');
ParserTest.prototype.testExpressions = function(){