[IMP] compiler: improve error message for tokenization errors

This commit is contained in:
Samuel Degueldre
2022-03-08 09:37:09 +01:00
committed by Géry Debongnie
parent e4fdd32f22
commit 14d2328c88
2 changed files with 24 additions and 18 deletions
+19 -13
View File
@@ -199,24 +199,30 @@ const TOKENIZERS = [
export function tokenize(expr: string): Token[] { export function tokenize(expr: string): Token[] {
const result: Token[] = []; const result: Token[] = [];
let token: boolean | Token = true; let token: boolean | Token = true;
let error: any;
let current = expr;
while (token) { try {
expr = expr.trim(); while (token) {
if (expr) { current = current.trim();
for (let tokenizer of TOKENIZERS) { if (current) {
token = tokenizer(expr); for (let tokenizer of TOKENIZERS) {
if (token) { token = tokenizer(current);
result.push(token); if (token) {
expr = expr.slice(token.size || token.value.length); result.push(token);
break; current = current.slice(token.size || token.value.length);
break;
}
} }
} else {
token = false;
} }
} else {
token = false;
} }
} catch (e) {
error = e; // Silence all errors and throw a generic error below
} }
if (expr.length) { if (current.length || error) {
throw new Error(`Tokenizer error: could not tokenize "${expr}"`); throw new Error(`Tokenizer error: could not tokenize \`${expr}\``);
} }
return result; return result;
} }
+5 -5
View File
@@ -65,14 +65,14 @@ describe("tokenizer", () => {
}); });
test("strings", () => { test("strings", () => {
expect(() => tokenize("'")).toThrow("Invalid expression"); expect(() => tokenize("'")).toThrow("Tokenizer error: could not tokenize `'`");
expect(() => tokenize("'\\")).toThrow("Invalid expression"); expect(() => tokenize("'\\")).toThrow("Tokenizer error: could not tokenize `'\\`");
expect(() => tokenize("'\\'")).toThrow("Invalid expression"); expect(() => tokenize("'\\'")).toThrow("Tokenizer error: could not tokenize `'\\'`");
expect(tokenize("'hello ged'")).toEqual([{ type: "VALUE", value: "'hello ged'" }]); expect(tokenize("'hello ged'")).toEqual([{ type: "VALUE", value: "'hello ged'" }]);
expect(tokenize("'hello \\'ged\\''")).toEqual([{ type: "VALUE", value: "'hello \\'ged\\''" }]); expect(tokenize("'hello \\'ged\\''")).toEqual([{ type: "VALUE", value: "'hello \\'ged\\''" }]);
expect(() => tokenize('"')).toThrow("Invalid expression"); expect(() => tokenize('"')).toThrow('Tokenizer error: could not tokenize `"`');
expect(() => tokenize('"\\"')).toThrow("Invalid expression"); expect(() => tokenize('"\\"')).toThrow('Tokenizer error: could not tokenize `"\\"`');
expect(tokenize('"hello ged"')).toEqual([{ type: "VALUE", value: '"hello ged"' }]); expect(tokenize('"hello ged"')).toEqual([{ type: "VALUE", value: '"hello ged"' }]);
expect(tokenize('"hello ged"}')).toEqual([ expect(tokenize('"hello ged"}')).toEqual([
{ type: "VALUE", value: '"hello ged"' }, { type: "VALUE", value: '"hello ged"' },