Хотя для некоторых языков можно написать грамматики, которые проверяют, появляется ли один и тот же символ в разных местах, грамматики обычно оказываются слишком сложными, чтобы быть полезными.
Компиляторы (переводчики) обычно реализуются с помощьюотдельные компоненты лексического, синтаксического и семантического анализатора. Для этого есть несколько причин:
- Каждый компонент настолько хорошо сфокусирован, что его проще и легче писать.
- Каждый компонент очень эффективен
- НаиболееОб общих ошибках (которые являются точно лексическими, синтаксическими и семантическими) можно сообщать ранее
С учетом этих компонентов проверка того, принадлежит ли ранее определенный символ, относится к семантическому (смысловому) аспектупрограмма, и способ проверки состоит в том, чтобы сохранить таблицу символов, которая заполняется, когда определение части ввода анализируются, и запрашиваются использование частей ввода. parsed.
В TatSu , в частности, различные компоненты хорошо разделены, но работают параллельно. Для ваших требований вам просто нужно использовать простейшую грамматику, которая позволяет семантические действия , которые хранят и запрашивают символы. Поднимая FailedSemantics
из семантических действий, любые семантические ошибки будут сообщаться в точности как лексические и синтаксические, поэтому пользователю не нужно думать о том, какой компонент помечал каждую ошибку.
Если вы используете PythonПри генерации синтаксического анализатора в TatSu транслятор сгенерирует каркас класса семантических действий как часть вывода.