Интересу ради решил попробовать в деле генератор парсеров.
Задачу выбрал синтетическую — разбор некоего подмножества JavaScript.
Парсер, доступный в ревизии
8980 умеет разбирать псевдопрограммы вроде этой:
var x1 = "asfasdasdf"; // comment
x2.bla = 'dfasdf"asdfsd" asds';
x = y.z = t ? a : 0x23 * 7 + 1;
; //empty statement !
function Foo(
a1 /* a1 arg*/ ,
b,
c) {
var s = t ? true : false ? h ? 7 : 8++ : g ? 3 + bar(1, 2).f : 4;
var tmp = this.xxx(/* no args! */)(a1, /* passing b*/ b, c /*and c*/).result;
return function(k, t) { return ++0x45ff+++1; };
}
На выходе он в презентабельном виде отображает AST:
var x1 = "asfasdasdf";
x2.bla = 'dfasdf"asdfsd" asds';
x = y.z = (t ? a : (0x23 * (7 + 1)));;
function Foo(a1, b, c)
{
var s = (t ? true : (false ? (h ? 7 : (8++)) : (g ? (3 + bar(1, 2).f) : 4)));
var tmp = this.xxx()(a1, b, c).result;
return function (k, t)
{
return ((++(0x45ff++)) + 1);
};
}
Основная проблема с которой пришлось бороться — это ликвидация в правилах левой рекурсии без продвижения по строке.
Возникли два вопроса:
1) Как обрабатывать ошибки?
2) Что делать если в языке ключевые слова регистронезависимые (Pascal, SQL)?