Что не так с этим ParseKit BNF? - PullRequest
9 голосов
/ 21 июля 2011

Я использую ParseKit для target-C, который использует BNF-подобный синтаксис для указания грамматики:

@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;

Включение последней строки вызывает ошибку.По сути, я хочу сказать, что объект может быть домом или чем-то еще.Нетерминальный элемент «прочее» должен улавливать любое слово, которое не было хаусом.

Я неправильно понял идею «что-нибудь здесь»?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 14 октября 2011

Разработчик ParseKit здесь.Ответ Кармине выше превосходен, и вы должны принять его совет.Одна небольшая дополнительная заметка:

Если вы хотите, чтобы ваш делегат Parser мог легко заметить, когда «дом» сопоставляется с любым другим случайным словом, я бы изменил последнюю строку вашей грамматики выше на:

object = house | other;
house = 'house';
other = Word;

Затем вы должны реализовать два следующих метода обратного вызова в вашем делегате Parser:

- (void)parser:(PKParser *)p didMatchHouse:(PKAssembly *)a;
- (void)parser:(PKParser *)p didMatchOther:(PKAssembly *)a;

Если вы хотите, чтобы other соответствовал любому токену ввсе (не только слова, но также цифры, символы, строки в кавычках и т. д.), вы можете использовать встроенный тип Any.В этом случае вы бы изменили последнюю строку моего примера выше на:

other = Any;
4 голосов
/ 19 августа 2011

Как предлагается в комментариях, вы должны либо заменить other на Word, либо добавить новое правило:

other = Word;

Поскольку 'house' является Word, вы также можете напрямую заменить правило object на:

object = Word;

A Word в ParseKit представляет собой непрерывную последовательность символов ([a-zA-Z]), чисел ([0-9]) и символов -, _ и ', которая начинается с символа. Вы можете найти больше информации о токенах ParseKit в документации .

...