Использование первого набора в парсере рекурсивного спуска - PullRequest
1 голос
/ 15 сентября 2011

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

statement: labeled-statement | compound-statement | expression-statement | selection-statement | iteration-statement | jump-statement

Я читал о «первом» наборе, который сравнивает лок-токен / символ с возможными терминалами, которые стоят первыми в производстве. В настоящее время я застрял в использовании первого набора в парсере рекурсивного спуска, потому что у меня есть только функция и ничего больше, нет объекта для каждого правила или чего-либо еще, с чем я могу идентифицировать правило / продукцию.

1 Ответ

1 голос
/ 15 сентября 2011

Ваша грамматика недопустима для парсеров рекурсивного спуска, потому что она неоднозначна с левой стороны:

  • labeled-statement начинается с идентификатора
  • compound-statement начинается с {(это нормально)
  • expression-statement начинается с идентификатора или числа (или ()

Здесь можно остановиться, есть конфликт между помеченным выражением и выражением выражения,Вам нужно трансформировать свой грамматик, чтобы избавиться от левой неоднозначности (через временные узлы грамматики, содержащие общие части, чтобы при переходе можно было определить, к какой ветви переходить, используя только упреждающий просмотр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...