feat(parser): throw when expected an identifier
This commit is contained in:
parent
c41f59c794
commit
8a829d346b
|
@ -241,6 +241,9 @@ class _ParseAST {
|
||||||
|
|
||||||
parseIdentifier():string {
|
parseIdentifier():string {
|
||||||
var n = this.next;
|
var n = this.next;
|
||||||
|
if (!n.isIdentifier() && !n.isKeyword()) {
|
||||||
|
this.error(`Unexpected token ${n}, expected identifier or keyword`)
|
||||||
|
}
|
||||||
this.advance();
|
this.advance();
|
||||||
return n.toString();
|
return n.toString();
|
||||||
}
|
}
|
||||||
|
@ -249,7 +252,7 @@ class _ParseAST {
|
||||||
if (isBlank(index)) index = this.index;
|
if (isBlank(index)) index = this.index;
|
||||||
|
|
||||||
var location = (index < this.tokens.length)
|
var location = (index < this.tokens.length)
|
||||||
? `at column ${tokens[index].index + 1} in`
|
? `at column ${this.tokens[index].index + 1} in`
|
||||||
: `at the end of the expression`;
|
: `at the end of the expression`;
|
||||||
|
|
||||||
throw new ParserError(`Parser Error: ${message} ${location} [${this.input}]`);
|
throw new ParserError(`Parser Error: ${message} ${location} [${this.input}]`);
|
||||||
|
|
|
@ -10,6 +10,12 @@ class TestData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ContextWithErrors {
|
||||||
|
get boo() {
|
||||||
|
throw new Error("boo to you");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
function td(a = 0, b = 0) {
|
function td(a = 0, b = 0) {
|
||||||
return new TestData(a, b);
|
return new TestData(a, b);
|
||||||
|
@ -145,6 +151,18 @@ export function main() {
|
||||||
it('should throw on incorrect ternary operator syntax', () => {
|
it('should throw on incorrect ternary operator syntax', () => {
|
||||||
expectEvalError("true?1").toThrowError(new RegExp('Parser Error: Conditional expression true\\?1 requires all 3 expressions'));
|
expectEvalError("true?1").toThrowError(new RegExp('Parser Error: Conditional expression true\\?1 requires all 3 expressions'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should pass exceptions', () => {
|
||||||
|
expect(() => {
|
||||||
|
createParser().parse('boo').eval(new ContextWithErrors(), null);
|
||||||
|
}).toThrowError('boo to you');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should only allow identifier or keyword as member names', () => {
|
||||||
|
expectEvalError('x.(').toThrowError(new RegExp('identifier or keyword'));
|
||||||
|
expectEvalError('x. 1234').toThrowError(new RegExp('identifier or keyword'));
|
||||||
|
expectEvalError('x."foo"').toThrowError(new RegExp('identifier or keyword'));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue