From 0e17ade959cc77369dc102d180e43be2af68505a Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 5 Apr 2011 11:00:26 -0700 Subject: Cleanup parser code to expose smaller API --- src/JSON.js | 9 ++------- src/Scope.js | 1 - src/parser.js | 53 ++++++++++++++++++----------------------------------- 3 files changed, 20 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/JSON.js b/src/JSON.js index 186bdb1c..942ce7c0 100644 --- a/src/JSON.js +++ b/src/JSON.js @@ -35,19 +35,14 @@ function toJson(obj, pretty) { function fromJson(json, useNative) { if (!isString(json)) return json; - var obj, p, expression; + var obj; try { if (useNative && window.JSON && window.JSON.parse) { obj = JSON.parse(json); return transformDates(obj); } - - p = parser(json, true); - expression = p.primary(); - p.assertAllConsumed(); - return expression(); - + return parser(json, true).primary()(); } catch (e) { error("fromJson error: ", json, e); throw e; diff --git a/src/Scope.js b/src/Scope.js index bf582474..1ab583e8 100644 --- a/src/Scope.js +++ b/src/Scope.js @@ -92,7 +92,6 @@ function expressionCompile(exp){ if (!fn) { var p = parser(exp); var fnSelf = p.statements(); - p.assertAllConsumed(); fn = compileCache[exp] = extend( function(){ return fnSelf(this);}, {fnSelf: fnSelf}); diff --git a/src/parser.js b/src/parser.js index 8d7e607c..59d7899a 100644 --- a/src/parser.js +++ b/src/parser.js @@ -240,22 +240,29 @@ function parser(text, json){ function (){ throwError("is not valid json", {text:text, index:0}); }; } return { - assertAllConsumed: assertAllConsumed, - assignable: assignable, - primary: primary, - statements: statements, - validator: validator, - formatter: formatter, - filter: filter, - //TODO: delete me, since having watch in UI is logic in UI. (leftover form getangular) - watch: watch + assignable: assertConsumed(assignable), + primary: assertConsumed(primary), + statements: assertConsumed(statements), + validator: assertConsumed(validator), + formatter: assertConsumed(formatter), + filter: assertConsumed(filter) }; + function assertConsumed(fn) { + return function(){ + var value = fn(); + if (tokens.length !== 0) { + throwError("is an unexpected token", tokens[0]); + } + return value; + }; + } + /////////////////////////////////// function throwError(msg, token) { - throw Error("Parse Error: Token '" + token.text + + throw Error("Syntax Error: Token '" + token.text + "' " + msg + " at column " + - (token.index + 1) + " of expression [" + + (token.index + 1) + " of the expression [" + text + "] starting at [" + text.substring(token.index) + "]."); } @@ -313,12 +320,6 @@ function parser(text, json){ return tokens.length > 0; } - function assertAllConsumed(){ - if (tokens.length !== 0) { - throwError("is extra token not part of expression", tokens[0]); - } - } - function statements(){ var statements = []; while(true) { @@ -639,24 +640,6 @@ function parser(text, json){ }; } - //TODO: delete me, since having watch in UI is logic in UI. (leftover form getangular) - function watch () { - var decl = []; - while(hasTokens()) { - decl.push(watchDecl()); - if (!expect(';')) { - assertAllConsumed(); - } - } - assertAllConsumed(); - return function (self){ - for ( var i = 0; i < decl.length; i++) { - var d = decl[i](self); - self.addListener(d.name, d.fn); - } - }; - } - function watchDecl () { var anchorName = expect().text; consume(":"); -- cgit v1.2.3