Набросок LALR генераторa

00: S → C C
01: C → c C
02: C → d

.cd$SC
0s3s2..1
1s3s2..4
2r2r2r2..
3s3s2..5
4..r0..
5r1r1r1..

Самая самая первая версия

Пока что происходит простая генерация с выводом результатов. Не читается файл с живой граматикой, граматика зашита в исходник. Не создаются файлы с рабочими таблицами, просто выводится результат. Не рассматриваются приоритеты операций. В приоритетах в целом нет ничего особого, простой устдаление конфликта, Происходит простая генерация результата. Более того исходник я просто буквально набрал и работу его не проверял, но он очень неплохо работает. Записываются два файла: HTML с таблицей парсера, и dot файл с графом конечного автомата. Немного применяется stl (на минимальном уровне).

В парсере нет такого состояния как accept. Для того чтобы его приделать нужно иметь отдельную строку в граматике (какой-то корневой элемент). Иногда можно взять существующий нетерминал как корень (если он не содержит рекурсии), в таком случае ввод дополнительного корня будет избыточен. Описывать подробно все рассуждения не охота. Проще говоря accept происходит автоматом внутри самого парсера в тот момент, когда в тексте появляется конец файла, а на стеке остаётся один символ. В целом нормально работает.

Первый пре релиз

файлы будут обновляться, по мере исправления мелких ошибок. Некоторые места достаточно грубо переделывались. Вообще пока всё сыровато, но будет доведено до ума по мере того как я буду применять эту штуку: В целом всё работает. Только сжатие не слишком быстрым получилось. И обработка ошибок сложнее чем хотелось бы. Из планов только привести всё это в более приличный вид. Особенно сделать более аккуратный парсер и часть генерирующую исходник. Не ещё некоторые недоработки, до которых руки не дошли.

Для использования достаточно указать программе файл с граматикой: lalr.exe +d work.y.

Есть так же пара недоделанных механизмов. Один из них это снижение нагрузки на стек, который я даже и делать уже не хочу. Суть этих механизмов проста. В процессе работы самого автомата, некоторые из терминалов не несут в себе никаких значений, и не влияют на дальнейшую работу, изменяется только состояние конечного автомата. На подобные терминалы можно не расходовать стек. Например:

expr: ( expr ) ;
S: if expr then S;

В данном случае не обязательно заносить на стек такие токены как if, then, (, ), достаточно просто изменять состояние автомата. Конешно если ( ) используется для восстановления ошибок, то одну скобку на стек засунуть придётся.

Текущая бетта (последний исходник)

Немного навёл порядок внутри исходников генератора. Растащил всё по разным файлам. STL почти убран, остались только вектора. Строки, карты, списки, устроены по своему. Строки разделяют данные в памяти, отдельные копии отслаиваются в момент модификации. Вобщем меняю много и уже не слежу за этим. Пока что залил исходник на sf.net, но заниматься им некогда, хотя ещё буду. Можно брать текущую версию здесь (в названии опечатался когда проект создавал, но это не важно):
svn co https://casini.svn.sourceforge.net/svnroot/casini casini

Немного о структурах

Запись исходника

Для создания таблицы в исходнике используется промежуточное представление.
Hosted by uCoz