Как бы вы реализовали встроенное производство в синтаксическом анализаторе LR(1)? Под встроенным производством я подразумеваю производство, но только для синтаксического анализа - оно не будет сгенерировано в дереве синтаксического анализа/AST. Как бы я это реализовал? У меня есть список встроенных производств, и я пробовал это: когда есть действие сокращения, если левая часть, к которой мы сокращаем, отсутствует в списке встроенных, уменьшите его и поместите родительский узел в стек узлов; Если левый находится в списке встроенных, то не извлекайте дочерние элементы стека. Это не сработало.
Парсер LR(1) - создание встроенных производств
Ответы:
В этом заключается разница между деревом синтаксического анализа и абстрактным синтаксическим деревом. Если я правильно интерпретирую то, что вы говорите, вы хотите, чтобы ваш синтаксический анализатор LR(1) выполнял синтаксический анализ, но затем возвращал вам дерево, отличное от дерева синтаксического анализа (в частности, есть некоторые правила, которые вам нужны в синтаксический анализатор, чтобы грамматика работала, но вы не хотите видеть их в выводе).
Обычный способ справиться с этим — заставить парсер LR(1) выполнять семантические действия всякий раз, когда выполняется сокращение. Эти действия будут тем, что на самом деле строит абстрактное синтаксическое дерево, которое вы хотели бы получить после завершения алгоритма. Затем вы могли бы иметь семантическое действие, связанное с вашим встроенным производством, в основном «взять существующее дерево синтаксического анализа и ничего с ним не делать», что соответствует тому, что синтаксический анализатор ничего не выдает для этого правила производства. Для других производств, которым действительно необходимо генерировать часть синтаксического дерева, вы можете настроить семантическое действие на создание части AST на основе производства.