[PEG] Добавил в сниппеты еще один пример.
От: hardcase Пират http://nemerle.org
Дата: 08.07.10 08:28
Оценка: 112 (2)
Интересу ради решил попробовать в деле генератор парсеров.
Задачу выбрал синтетическую — разбор некоего подмножества 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)?
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.