Что не так с этим ParseKit BNF?
Я использую ParseKit для target-C, который использует BNF-подобный синтаксис для задания грамматики:
@start = command+;
command = new;
new = 'new' object ';';
object = 'house' | other;
Включение последней строки вызывает ошибку. По сути, я хочу сказать, что объект может быть домом или чем-то еще. Предполагается, что нетерминальный элемент "прочее" должен улавливать любое слово, которое не было домом.
Я иду о идее "что-нибудь здесь" неправильно?
Спасибо!
2 ответа
Как предлагается в комментариях, вы должны либо заменить other
с Word
или добавьте новое правило:
other = Word;
поскольку 'house'
это Word
Вы также можете напрямую заменить object
править с:
object = Word;
Word
в ParseKit есть непрерывная последовательность символов ([a-zA-Z]
), цифры ([0-9]
) и символы -
, _
, а также '
, который начинается с символа. Вы можете найти более подробную информацию о токенах ParseKit в документации.
Разработчик 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;