Парсер LR (1) - Создание встроенных производств - PullRequest
0 голосов
/ 08 мая 2020

Как бы вы реализовали встроенное производство в парсере LR (1)? Под встроенным производством я подразумеваю, что продукция существует, но только для синтаксического анализа - она ​​не будет сгенерирована в дереве синтаксического анализа / AST. Как мне это реализовать? У меня есть список встроенных производств, и я пробовал это: когда есть действие reduce, если lhs, до которого мы сокращаем, нет в списке inlines, уменьшите его и pu sh родительский узел в стеке узлов; Если lhs находится в списке встроенных, не выталкивайте дочерние элементы стека. Это не сработало.

1 Ответ

1 голос
/ 09 мая 2020

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

Типичный способ обработки этого - выполнение парсером LR (1) semanti c действий при выполнении сокращения. Эти действия будут тем, что на самом деле создает абстрактное синтаксическое дерево, которое вы хотели бы получить после завершения алгоритма. Тогда у вас может быть действие semanti c, связанное с вашим встроенным производством, в основном, как «взять существующее дерево синтаксического анализа и ничего с ним не делать», что соответствует тому, что синтаксический анализатор ничего не испускает для этого рабочего правила. Для других производств, которым действительно необходимо сгенерировать часть синтаксического дерева, вы можете настроить действие semanti c на создание части AST на основе продукции.

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