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

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

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. Должен начинаться с«record # Number» и заканчиваются точкой с запятой.
  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", не могли бы вы мне помочь?

Спасибо:)

1 Ответ

1 голос
/ 03 апреля 2012

Разработчик 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;
...