Может ли Bison проверить область действия и синтаксис? - PullRequest
1 голос
/ 06 марта 2012

Я использую Lex / Bison для создания простого языка сценариев, который переводится на C. Транскомпилятор.

Я знаю, что Bison может проверять синтаксис, но как насчет области видимости?Может ли он подтвердить, что используемый идентификатор был объявлен ранее?Это должно быть сделано вручную?И если да, то на каком этапе?

Например, это синтаксически правильно. Но это не должно компилироваться , потому что сообщение находится в неправильной области.Кроме того, message2 никогда не объявлялось.

String s1
if (s1=='knock on door')
   String message1='Hello';

print message1;
print message2;

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Нашел ответ. На самом деле существует третий этап, называемый семантическим анализом. Шаги:

  1. Лекс (получить токены)
  2. Parse (убедитесь, что токен используется в правильном контексте)
  3. Семантический анализ (проверка типов / определение объема)

Семантический анализ анализирует дерево разбора, созданное на шаге 2.

1 голос
/ 06 марта 2012

Синтаксические анализаторы (как бы они ни создавались) обычно не могут проверять правила области видимости.

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

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

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

0 голосов
/ 06 марта 2012

Бизон не обрабатывает определение и поиск идентификатора.Вы должны предоставить эту функциональность в действиях правил.

...