Тацу: порядок правил

Я играю с Татсу, чтобы реализовать парсер для языка, используемого в полупроводниковой промышленности. Этот язык требует, чтобы переменные были определены перед использованием. Так например:

SignalGroup { A: In; B: Out};
Pattern {
   V {A=1, B=1 }
   V {A=1, B=0 }
};

В этом случае блок SignalGroup должен стоять перед блоком Pattern. Как мне обеспечить / реализовать этот "порядок" при написании грамматики в TatSu?

1 ответ

Решение

Хотя для некоторых языков можно написать грамматику, которая проверяет, появляется ли один и тот же символ в разных местах, грамматики обычно оказываются слишком сложными, чтобы быть полезными.

Компиляторы (трансляторы) обычно реализуются с отдельными компонентами лексического, синтаксического и семантического анализатора. На то есть несколько причин:

  • Каждый компонент настолько хорошо сфокусирован, что его проще и понятнее писать.
  • Каждый компонент очень эффективен
  • О наиболее распространенных ошибках (в точности лексических, синтаксических и семантических) можно сообщить раньше.

Имея в виду эти компоненты, проверка того, был ли символ определен ранее, относится к семантическому (смысловому) аспекту программы, и способ проверки - сохранить таблицу символов, которая заполняется при анализе частей определения входных данных., и запрашиваются на использовании части ввода в настоящее время анализируется.

В частности, в TatSu различные компоненты хорошо разделены, но работают параллельно. Для вашего требования вам просто нужно использовать простейшую грамматику, которая позволяет семантические действия, которые хранят и запрашивают символы. ПовышаяFailedSemantics внутри семантических действий любые семантические ошибки будут сообщаться точно так же, как лексические и синтаксические, поэтому пользователю не нужно думать о том, какой компонент пометил каждую ошибку.

Если вы используете генерацию парсера Python в TatSu, переводчик сгенерирует скелет класса семантических действий как часть вывода.

Другие вопросы по тегам