WedX - журнал о программировании и компьютерных науках

Парсер LR(1) - создание встроенных производств

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


Ответы:


1

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

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

09.05.2020
  • Хм... попробую. 09.05.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]