Когда ParseKit пытается распознать мою грамматику, он входит в бесконечный цикл. Что случилось?

Привет, я создаю грамматику для некоторой формулы, использующей рекурсию. Формула намного сложнее, но пока я тестирую только ее часть. После вызова метода parse происходит сбой в методе allMatchesFor. Трассировка стека заполнена вызовами allMatchesFor, поэтому похоже, что это бесконечный цикл. В чем проблема. Это в моей логике построения грамматики или что-то еще? Как я могу сделать то же самое, чтобы избежать этого сбоя

Моя грамматика такая:

@start = formula;
formula = valueTypeResult;
valueTypeResult = (value | concept | arithmeticStatement);
arithmeticStatement = valueTypeResult (arithmeticOperator valueTypeResult)+;
value = 'V';
concept = 'C';
arithmeticOperator = 'A';

Не могли бы вы рассказать мне, как создавать грамматики, использующие рекурсию?

Спасибо


person tetsujin    schedule 13.12.2012    source источник


Ответы (1)


Разработчик ParseKit здесь.

У ParseKit нет проблем с рекурсией, но ваша грамматика неверна. Это скорее проблема грамматики BNF, чем проблема ParseKit.

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

@start = formula;
formula = arithmeticStatement;
arithmeticStatement = valueTypeResult (arithmeticOperator valueTypeResult)+;
valueTypeResult = (value | concept);
value = 'V';
concept = 'C';
arithmeticOperator = 'A';
person Todd Ditchendorf    schedule 14.12.2012
comment
К сожалению, это не работает для меня. Я даю строку «VAC» для синтаксического анализа, и она должна анализироваться без ошибок. Одно значение (V), за которым следует арифметический оператор (A) и понятие в конце (C). - person tetsujin; 14.12.2012
comment
Вы должны поставить пробелы (какие-то) между персонажами. Если вы используете ParseKit grammars, входная строка токенизируется. VAC — это один токен Word. Не 3 отдельных символа. Я предлагаю прочитать документацию по токенизации ParseKit (parsekit.com/tokenization.html). И мой ответ на этот вопрос: stackoverflow.com/questions/13792980/ - person Todd Ditchendorf; 14.12.2012
comment
Спасибо за ваши подсказки. Я хотел бы также спросить вас об одной вещи. Могу ли я настроить parsekit, чтобы он не смотрел с начала строки, а пытался сопоставить всю строку, что-то вроде жадного режима в регулярном выражении? - person tetsujin; 17.12.2012
comment
Если вы хотите поблагодарить меня, пожалуйста, отметьте мой ответ как правильный. :) - person Todd Ditchendorf; 17.12.2012
comment
Спасибо, Тодд. Я отметил ваш ответ как правильный. Не могли бы вы ответить на вопрос в моем последнем комментарии? - person tetsujin; 18.12.2012
comment
Одна маленькая просьба. Не могли бы вы обновить классы RegexKitLite в ParseKit/src? - person tetsujin; 18.12.2012
comment
Я не понимаю ваш первый вопрос. Пожалуйста, опубликуйте его как полностью подробный новый вопрос, и я постараюсь ответить. Re: RegexKit: ParseKit с открытым исходным кодом. Внесите изменения и пришлите мне diff. - person Todd Ditchendorf; 18.12.2012
comment
Как вы сказали, я создал новый вопрос /a> Я также отправил вам diff, чтобы вы могли обновить основную ветку. Спасибо - person tetsujin; 19.12.2012