Что не так с этим 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;
Другие вопросы по тегам