Написание грамматики ParseKit с различным количеством полей (по порядку)

У меня нет большого опыта в написании грамматик, но, скажем, у меня есть такой тип записи: (примеры)

record # 1 source ages params A = 1 and b = 2 fields are A, B, C with values 1, 2, 3;
record # 2;
record # 3 source ages;
record # 4 params A = 1 and b = 2 fields are A, B, C with values 1, 2, 3;
record # 5 source ages fields are A, B, C with values 1, 2, 3;
record # 6 with values 1, 2, 3;

В основном:

  1. Должен начинаться с «номер записи» и заканчиваться точкой с запятой.
  2. Может содержать 0 или 1 захват в следующем порядке:
  3. исходный набор данных
  4. параметры набора данных
  5. поля из набора данных
  6. значения из набора данных

Вот моя грамматика, она не работает:

--- начать грамматику:

@start = record;

record = 'record' '#' numeric rest* ';';
rest = 'source' alphanumeric paramsAndOrFieldsAndOrWithValues*;
paramsAndOrFieldsAndOrWithValues = (paramsList)? (fieldsList)? (valuesList)?;
paramsList = 'params' alpha expr numeric ('and' alpha expr numeric)*;
fieldsList = 'fields' 'are' alpha (comma alpha)*;
valuesList = 'with' 'values' numeric (comma numeric)*;


alpha = Word;
numeric = Number;
alphanumeric = (alpha | numeric | '_' | '.');
comma = ',';
expr = '=';

--- конец грамматики

@"Разработчик из ParseKit", не могли бы вы мне помочь?

Спасибо :)


person Mike Trelinski    schedule 03.04.2012    source источник


Ответы (1)


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

Ваша грамматика немного не в порядке. Я разработал грамматику, которая соответствует вводу вашего примера. Я запустил это, используя цель DebugApp, и могу подтвердить, что это работает для вашего примера.

@start = records;
records = record+;
record = prefix source? params? fields? values? suffix;

prefix = 'record' '#' Number;
suffix = ';';

// source
source = 'source' Word;

// params
params = 'params' expr ('and' expr)*;
expr = name '=' Number;
name = Word;

// fields
fields = 'fields' 'are' name (',' name)*;

// values
values = 'with' 'values' val (',' val)*;

val = Number;
person Todd Ditchendorf    schedule 03.04.2012
comment
исходные поля приветствия записи № 1: A, B, C ; не удается разобрать поля, есть идеи, почему? используя вашу грамматику - person Mike Trelinski; 04.04.2012
comment
Хм, это отлично работает для меня против моей грамматики. Вот распечатка моего обратного вызова Record: -[DebugAppDelegate parser:didMatchRecord:] [record, #, 1, source, hello, fields, are, A, ,, B, ,, C, ;]record/#/1/source/hello/fields/are/A/,/B/,/C/;^ - person Todd Ditchendorf; 04.04.2012
comment
Как ни странно, в демо-версии ParseKit не отображается ветвь/дерево «полей»… возможно, ошибка в демо-приложении PK? Вот скриншот: imgur.com/bjb10 - person Mike Trelinski; 05.04.2012
comment
О, да. Извините, это дерево DemoApp действительно не завершено. Не верьте тому, что он вам показывает, так как он не может достоверно отрисовать все грамматики. На самом деле это довольно глючно. Просто добавьте методы обратного вызова Ассемблера в свой класс Ассемблера, и вы увидите, что они вызываются правильно для моей грамматики выше (по крайней мере, они здесь). - person Todd Ditchendorf; 05.04.2012
comment
Полно ли PKParseTree? Кстати, я очень люблю ParseKit. Вы должны подумать о принятии пожертвований... - person Mike Trelinski; 05.04.2012
comment
Извините, нет, материал PKParseTree действительно не завершен. Вы заметите, что этот материал находится только в DemoApp и не включен в собственно ParseKit. Я так и не удосужился его завершить. И это глючит. Что касается пожертвований, спасибо, рад, что вам нравится PK. Но я бы предпочел, чтобы вы отметили мой ответ выше как «Принятый», чтобы я мог получить кредит StackOverflow :). - person Todd Ditchendorf; 05.04.2012