Моя логика EBNF здесь неверна? - PullRequest
1 голос
/ 30 марта 2011

Я использую SimpleParse в программе на Python для анализа довольно простой лингвистики. Должна быть возможность проанализировать следующий пример текста (каждая строка отдельно):

d6
(d4 + d8 + 5) + 6
{5d20}+12
[d10 + 6d6] + 9
(d10 + d12) + 8d8

Я написал следующий EBNF для вышеупомянутого, но парсер продолжает сбой, даже в простом случае "d6":

# 'number' is already predefined in SimpleParse to parse exactly what you think it will parse
root          := roll
roll          := space,operations,space
operations    := function+
function      := ((dice,op,function)/(grouping,op,function)/(function,op,grouping))/(dice/grouping/constant) #just to clarify, the '/' is a FirstOf operator
constant      := number
grouping      := ([[(],operations,[])])/'{',dice,'}'
dice          := number?,[dD],number
op            := space,[-+],space
space         := [ \t]*

Я начинаю задаваться вопросом, возможно, я где-то неправильно понял логику в моем EBNF.

РЕДАКТИРОВАТЬ: Для любопытных, вот как выглядит окончательный EBNF:

roll          := space,operations,space
operations    := function
function      := (dice,op,operations)/(grouping,op,operations)/dice/constant/grouping
constant      := number
grouping      := ('(',operations,')')/('{',dice,'}')/('[',operations,']')
dice          := number?,[dD],number
op            := space,[-+],space
space         := [ \t]*

1 Ответ

2 голосов
/ 30 марта 2011

Вы не определили number, и я не вижу его предопределенным в документах.

...