Тацу: правила упорядочения - PullRequest
1 голос
/ 08 ноября 2019

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

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

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

1 Ответ

1 голос
/ 09 ноября 2019

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

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

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

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

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

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

...