Семантическая фаза компилятора - PullRequest
4 голосов
/ 03 апреля 2011

Я пытаюсь сделать семантическую фазу для компилятора c, используя lex и yacc.Прямо сейчас проблема в том, что если у меня есть несколько ошибок в программе c, она останавливается после 1-го.Что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Я настоятельно рекомендую выполнять семантический анализ как отдельную фазу, а не как часть фазы синтаксического анализа. Используйте YACC только для построения абстрактного синтаксического дерева , а затем просмотрите это дерево в отдельной функции. Упомянутая функция будет иметь неограниченную свободу, когда дело доходит до перемещения по дереву, в отличие от необходимости «выполнять синтаксический анализ». Что касается конкретной проблемы, которую вы упомянули, то, похоже, комментарий @ pmg точно определил проблему.

1 голос
/ 04 апреля 2011

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

...