Использование Parsekit для построения дерева синтаксического анализа

Я использую Parsekit для XCode, но эта проблема вполне может относиться к большинству генераторов парсеров. Разбираю скрипт гаммером и все работает. Однако у меня возникают проблемы со следующим шагом. Рассмотрим грммера:

@старт = строка+; линия = дерево;

дерево = "дерево" фруктовые ветви;

фрукты = 'с' 'фрукты' число; ветки = 'с' 'ветки' Номер;

И скрипт для прохождения:

дерево с плодами 8 с ветвями 12

Если я затем реализую методы для сопоставления, фрукты и ветки будут сопоставляться один раз, это ожидается.

Однако дерево будет совпадать дважды, почему? Это мешает мне построить дерево синтаксического анализа, которое я хочу.

Спасибо за любую помощь!


person FBryant87    schedule 03.08.2011    source источник


Ответы (1)


Разработчик ParseKit здесь. Я думаю, вы могли бы на самом деле задать тот же вопрос, что и этот:

parsekit получил неожиданные вызовы селекторов

Если вы прочитаете комментарии, которые я сделал по этому вопросу, я думаю, вы найдете ответ. Дайте мне знать, если нет.

person Todd Ditchendorf    schedule 03.08.2011
comment
Привет, Тодд, спасибо, но я не мог понять решение. Сохранить то, над чем я работаю, в цели сборки? Как я это видел, я бы сопоставил «дерево», добавил его к дереву проходов, сопоставил «фрукты» и «ветви» и добавил их как дочерние элементы и т. д. Возможно, где-то есть пример, показывающий, как использовать цель решение? Кстати, хорошая работа над Parsekit :) - person FBryant87; 03.08.2011
comment
Я думаю, что ответ заключается в том, чтобы сохранить корневой объект абстрактного дерева/графа, который вы строите (я думаю, передающее дерево?) как текущую цель PKAssembly, а не как ivar. Текущая сборка PKAssembly — это либо та, которую вы создаете для начала, либо та, которая передается в метод -didMatchXXX:. Материал, который вы создаете путем синтаксического анализа, всегда должен быть целью текущей сборки. Материал, который вы создаете, никогда не должен быть ivar или глобальным var. - person Todd Ditchendorf; 04.08.2011