Тацу: порядок правил
Я играю с Татсу, чтобы реализовать парсер для языка, используемого в полупроводниковой промышленности. Этот язык требует, чтобы переменные были определены перед использованием. Так например:
SignalGroup { A: In; B: Out};
Pattern {
V {A=1, B=1 }
V {A=1, B=0 }
};
В этом случае блок SignalGroup должен стоять перед блоком Pattern. Как мне обеспечить / реализовать этот "порядок" при написании грамматики в TatSu?
1 ответ
Хотя для некоторых языков можно написать грамматику, которая проверяет, появляется ли один и тот же символ в разных местах, грамматики обычно оказываются слишком сложными, чтобы быть полезными.
Компиляторы (трансляторы) обычно реализуются с отдельными компонентами лексического, синтаксического и семантического анализатора. На то есть несколько причин:
- Каждый компонент настолько хорошо сфокусирован, что его проще и понятнее писать.
- Каждый компонент очень эффективен
- О наиболее распространенных ошибках (в точности лексических, синтаксических и семантических) можно сообщить раньше.
Имея в виду эти компоненты, проверка того, был ли символ определен ранее, относится к семантическому (смысловому) аспекту программы, и способ проверки - сохранить таблицу символов, которая заполняется при анализе частей определения входных данных., и запрашиваются на использовании части ввода в настоящее время анализируется.
В частности, в TatSu различные компоненты хорошо разделены, но работают параллельно. Для вашего требования вам просто нужно использовать простейшую грамматику, которая позволяет семантические действия, которые хранят и запрашивают символы. ПовышаяFailedSemantics
внутри семантических действий любые семантические ошибки будут сообщаться точно так же, как лексические и синтаксические, поэтому пользователю не нужно думать о том, какой компонент пометил каждую ошибку.
Если вы используете генерацию парсера Python в TatSu, переводчик сгенерирует скелет класса семантических действий как часть вывода.