Грамматика Ньюика для ParseKit - PullRequest
3 голосов
/ 03 ноября 2011

Я строю грамматику для анализа деревьев Ньюика, используя ParseKit для проекта, над которым я работаю, и я дошел до этого. Он основан на грамматике здесь: http://en.wikipedia.org/wiki/Newick_format. Я бы хотел использовать для этого грамматику, а не существующий неуклюжий рекурсивный код, который я сейчас работаю.

Однако я не уверен, как указать узлы имени и длины для учета либо пустых строк, либо обобщенных строк и чисел. Я получил это далеко от примеров и на сайте ParseKit, а также от скимминга книги Bulding Parsers for Java, но что-то упустил. Кто-нибудь может указать мне правильное направление, пожалуйста?

Текущая грамматика:

@start = tree+;
tree = subtree ';' | branch ';';
subtree = leaf | internal;
leaf = name;
internal = '(' branchset ')' name;
branchset = branch | branchset ',' branch;
branch = subtree length;
name = *;
length = * | ':' *

Спасибо!

- Возможный ответ:

Возможно, эти узлы имени и длины будут работать Кто-нибудь может подтвердить?

name = Word | Quoted String;
length = ':' Number;

1 Ответ

2 голосов
/ 03 ноября 2011

Разработчик ParseKit здесь. Ваше предлагаемое решение в конце правильно в основном с одним небольшим исправлением: QuotedString - это одно слово:

name = Word | QuotedString;
length = ':' Number;

Также для дальнейшего использования: если вы хотите использовать сопоставление с подстановочными знаками (то, что вы пытаетесь сделать с помощью * выше), вы можете использовать встроенный синтаксический анализатор: Any. Это будет соответствовать любому токену.

В ParseKit, * - это модификатор, означающий ноль или более.

...