Компилятор грамматик занимается тем, что имея модель грамматики строит таблицы для автомата разбора после чего передаёт эти таблицы в модуль формирования текста программы на целевом языке.

Четыре типа модулей:
1) модули считывания грамматик (своя собственная, RFC 5511, GOLD, другие);
2) модуль расчёта таблиц;
3) модули формирования текста программы на целевом языке (КуМир, Яр, другие);
4) модули, использующие сформированные таблицы (написанные уже на целевых языках).

Компилятор грамматик получает на вход текст грамматики в некоторой нотации. Для того, чтобы он это разобрал и создал внутри себя модель грамматики, сам входной текст надо описать. Есть несколько стандартов, где описан синтаксис BNF, например RFC 5511, в парсере GOLD есть свой вариант. Но у каждого компилятора грамматик есть свои особенности (например особенности платформы, на которой написан такой компилятор), поэтому каждый компилятор грамматик содержит свои расширения, а значит и описание формата входного текста у него своё, уникальное.
В принципе, можно на первом этапе конструировать такую модель из кода/исходников программы, создавая нужные стуктуры в памяти при помощи конструкций базового языка, на котором написан компилятор грамматик. Но это не очень удобно делать.

Расчёт таблиц делится на три логических подэтапа:
- расчёт взаимосвязей между нетерминалами грамматики
- построение набора состояний
- построение таблицы переходов и её "упаковка"

Для формирования текстов существует множество движков генерации по шаблонам (но мы не можем их использовать, потому что это другая история)

Отредактировано Лис (2017-09-13 14:17:31)