mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-07 01:18:02 +00:00
Added some more detailed error messages in parser
This commit is contained in:
1 parent
d20fb2039a
commit
c755dc3ed9
1 file changed
+36
-35
+36
-35
@@ -1080,11 +1080,11 @@ if (!exports.acorn) {
|
||||
}
|
||||
|
||||
// Expect a token of a given type. If found, consume it, otherwise,
|
||||
// raise an unexpected token error.
|
||||
// raise with errorMessage or an unexpected token error.
|
||||
|
||||
function expect(type) {
|
||||
function expect(type, errorMessage) {
|
||||
if (tokType === type) next();
|
||||
else unexpected();
|
||||
else errorMessage ? raise(tokStart, errorMessage) : unexpected();
|
||||
}
|
||||
|
||||
// Raise an unexpected token error.
|
||||
@@ -1184,7 +1184,7 @@ if (!exports.acorn) {
|
||||
labels.push(loopLabel);
|
||||
node.body = parseStatement();
|
||||
labels.pop();
|
||||
expect(_while);
|
||||
expect(_while, "Expected 'while' at end of do statement");
|
||||
node.test = parseParenExpression();
|
||||
semicolon();
|
||||
return finishNode(node, "DoWhileStatement");
|
||||
@@ -1200,7 +1200,7 @@ if (!exports.acorn) {
|
||||
case _for:
|
||||
next();
|
||||
labels.push(loopLabel);
|
||||
expect(_parenL);
|
||||
expect(_parenL, "Expected '(' after 'for'");
|
||||
if (tokType === _semi) return parseFor(node, null);
|
||||
if (tokType === _var) {
|
||||
var init = startNode();
|
||||
@@ -1241,7 +1241,7 @@ if (!exports.acorn) {
|
||||
next();
|
||||
node.discriminant = parseParenExpression();
|
||||
node.cases = [];
|
||||
expect(_braceL);
|
||||
expect(_braceL, "Expected '{' in switch statement");
|
||||
labels.push(switchLabel);
|
||||
|
||||
// Statements under must be grouped (by label) in SwitchCase
|
||||
@@ -1260,7 +1260,7 @@ if (!exports.acorn) {
|
||||
if (sawDefault) raise(lastStart, "Multiple default clauses"); sawDefault = true;
|
||||
cur.test = null;
|
||||
}
|
||||
expect(_colon);
|
||||
expect(_colon, "Expected ':' after case clause");
|
||||
} else {
|
||||
if (!cur) unexpected();
|
||||
cur.consequent.push(parseStatement());
|
||||
@@ -1286,11 +1286,11 @@ if (!exports.acorn) {
|
||||
while (tokType === _catch) {
|
||||
var clause = startNode();
|
||||
next();
|
||||
expect(_parenL);
|
||||
expect(_parenL, "Expected '(' after 'catch'");
|
||||
clause.param = parseIdent();
|
||||
if (strict && isStrictBadIdWord(clause.param.name))
|
||||
raise(clause.param.start, "Binding " + clause.param.name + " in strict mode");
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after catch");
|
||||
clause.guard = null;
|
||||
clause.body = parseBlock();
|
||||
node.handlers.push(finishNode(clause, "CatchClause"));
|
||||
@@ -1337,7 +1337,7 @@ if (!exports.acorn) {
|
||||
node.superclassname = parseIdent(true);
|
||||
else if (eat(_parenL)) {
|
||||
node.categoryname = parseIdent(true);
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after category name");
|
||||
}
|
||||
if (eat(_braceL)) {
|
||||
node.ivardeclarations = [];
|
||||
@@ -1349,6 +1349,7 @@ if (!exports.acorn) {
|
||||
}
|
||||
node.body = [];
|
||||
while(!eat(_end)) {
|
||||
if (tokType === _eof) raise(tokPos, "Expected '@end' after '@implementation'");
|
||||
node.body.push(parseClassElement());
|
||||
}
|
||||
}
|
||||
@@ -1430,12 +1431,12 @@ if (!exports.acorn) {
|
||||
switch(config.name) {
|
||||
case "property":
|
||||
case "getter":
|
||||
expect(_eq);
|
||||
expect(_eq, "Expected '=' after 'getter' accessor attribute");
|
||||
decl.accessors[config.name] = parseIdent(true);
|
||||
break;
|
||||
|
||||
case "setter":
|
||||
expect(_eq);
|
||||
expect(_eq, "Expected '=' after 'setter' accessor attribute");
|
||||
var setter = parseIdent(true);
|
||||
decl.accessors[config.name] = setter;
|
||||
if (eat(_colon))
|
||||
@@ -1454,7 +1455,7 @@ if (!exports.acorn) {
|
||||
}
|
||||
if (!eat(_comma)) break;
|
||||
}
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after accessor attributes");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1476,7 +1477,7 @@ if (!exports.acorn) {
|
||||
element.action = true;
|
||||
if (!eat(_parenR)) {
|
||||
element.returntype = parseObjectiveJType();
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after method return type");
|
||||
}
|
||||
}
|
||||
// Now we parse the selector
|
||||
@@ -1491,17 +1492,17 @@ if (!exports.acorn) {
|
||||
if (first && tokType !== _colon) break;
|
||||
} else
|
||||
selectors.push(null);
|
||||
expect(_colon);
|
||||
expect(_colon, "Expected ':' in selector");
|
||||
var argument = {};
|
||||
args.push(argument);
|
||||
if (eat(_parenL)) {
|
||||
argument.type = parseObjectiveJType();
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after method argument type");
|
||||
}
|
||||
argument.identifier = parseIdent(false);
|
||||
if (tokType === _braceL || eat(_semi)) break;
|
||||
if (eat(_comma)) {
|
||||
expect(_dotdotdot);
|
||||
expect(_dotdotdot, "Expected '...' after ',' in method declaration");
|
||||
element.parameters = true;
|
||||
break;
|
||||
}
|
||||
@@ -1524,9 +1525,9 @@ if (!exports.acorn) {
|
||||
// parentheses around their expression.
|
||||
|
||||
function parseParenExpression() {
|
||||
expect(_parenL);
|
||||
expect(_parenL, "Expected '(' before expression");
|
||||
var val = parseExpression();
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after expression");
|
||||
return val;
|
||||
}
|
||||
|
||||
@@ -1537,7 +1538,7 @@ if (!exports.acorn) {
|
||||
function parseBlock(allowStrict) {
|
||||
var node = startNode(), first = true, strict = false, oldStrict;
|
||||
node.body = [];
|
||||
expect(_braceL);
|
||||
expect(_braceL, "Expected '{' before block");
|
||||
while (!eat(_braceR)) {
|
||||
var stmt = parseStatement();
|
||||
node.body.push(stmt);
|
||||
@@ -1557,11 +1558,11 @@ if (!exports.acorn) {
|
||||
|
||||
function parseFor(node, init) {
|
||||
node.init = init;
|
||||
expect(_semi);
|
||||
expect(_semi, "Expected ';' in for statement");
|
||||
node.test = tokType === _semi ? null : parseExpression();
|
||||
expect(_semi);
|
||||
expect(_semi, "Expected ';' in for statement");
|
||||
node.update = tokType === _parenR ? null : parseExpression();
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' in for statement");
|
||||
node.body = parseStatement();
|
||||
labels.pop();
|
||||
return finishNode(node, "ForStatement");
|
||||
@@ -1572,7 +1573,7 @@ if (!exports.acorn) {
|
||||
function parseForIn(node, init) {
|
||||
node.left = init;
|
||||
node.right = parseExpression();
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' in for statement");
|
||||
node.body = parseStatement();
|
||||
labels.pop();
|
||||
return finishNode(node, "ForInStatement");
|
||||
@@ -1643,7 +1644,7 @@ if (!exports.acorn) {
|
||||
var node = startNodeFrom(expr);
|
||||
node.test = expr;
|
||||
node.consequent = parseExpression(true);
|
||||
expect(_colon);
|
||||
expect(_colon, "Expected ':' in conditional expression");
|
||||
node.alternate = parseExpression(true, noIn);
|
||||
return finishNode(node, "ConditionalExpression");
|
||||
}
|
||||
@@ -1732,7 +1733,7 @@ if (!exports.acorn) {
|
||||
node.object = base;
|
||||
node.property = expr;
|
||||
node.computed = true;
|
||||
expect(_bracketR);
|
||||
expect(_bracketR, "Expected closing ']' in subscript");
|
||||
return parseSubscripts(finishNode(node, "MemberExpression"), noCalls);
|
||||
} else if (!noCalls && eat(_parenL)) {
|
||||
var node = startNodeFrom(base);
|
||||
@@ -1778,7 +1779,7 @@ if (!exports.acorn) {
|
||||
}
|
||||
if (options.ranges)
|
||||
val.range = [tokStart1, tokEnd];
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' in expression");
|
||||
return val;
|
||||
|
||||
case _bracketL:
|
||||
@@ -1807,9 +1808,9 @@ if (!exports.acorn) {
|
||||
case _selector:
|
||||
var node = startNode();
|
||||
next();
|
||||
expect(_parenL);
|
||||
expect(_parenL, "Expected '(' after '@selector'");
|
||||
parseSelector(node, _parenR);
|
||||
expect(_parenR);
|
||||
expect(_parenR, "Expected closing ')' after selector");
|
||||
return finishNode(node, "SelectorLiteralExpression");
|
||||
|
||||
default:
|
||||
@@ -1834,7 +1835,7 @@ if (!exports.acorn) {
|
||||
selectors.push(parseIdent(true).name);
|
||||
if (first && tokType === close) break;
|
||||
}
|
||||
expect(_colon);
|
||||
expect(_colon, "Expected ':' in selector");
|
||||
selectors.push(":");
|
||||
if (tokType === close) break;
|
||||
first = false;
|
||||
@@ -1857,7 +1858,7 @@ if (!exports.acorn) {
|
||||
} else {
|
||||
selectors.push(null);
|
||||
}
|
||||
expect(_colon);
|
||||
expect(_colon, "Expected ':' in selector");
|
||||
args.push(parseExpression(true));
|
||||
if (eat(close))
|
||||
break;
|
||||
@@ -1895,7 +1896,7 @@ if (!exports.acorn) {
|
||||
next();
|
||||
while (!eat(_braceR)) {
|
||||
if (!first) {
|
||||
expect(_comma);
|
||||
expect(_comma, "Expected ',' in object literal");
|
||||
if (options.allowTrailingCommas && eat(_braceR)) break;
|
||||
} else first = false;
|
||||
|
||||
@@ -1946,9 +1947,9 @@ if (!exports.acorn) {
|
||||
else node.id = null;
|
||||
node.params = [];
|
||||
var first = true;
|
||||
expect(_parenL);
|
||||
expect(_parenL, "Expected '(' before function parameters");
|
||||
while (!eat(_parenR)) {
|
||||
if (!first) expect(_comma); else first = false;
|
||||
if (!first) expect(_comma, "Expected ',' between function parameters"); else first = false;
|
||||
node.params.push(parseIdent());
|
||||
}
|
||||
|
||||
@@ -1994,7 +1995,7 @@ if (!exports.acorn) {
|
||||
if (allowEmpty && tokType === _comma && !firstExpr) elts.push(null);
|
||||
else elts.push(firstExpr);
|
||||
} else {
|
||||
expect(_comma);
|
||||
expect(_comma, "Expected ',' between expressions");
|
||||
if (allowTrailingComma && options.allowTrailingCommas && eat(close)) break;
|
||||
if (allowEmpty && tokType === _comma) elts.push(null);
|
||||
else elts.push(parseExpression(true));
|
||||
|
||||
Reference in new issue
Block a user