expr = Ref('expr')
block = '{' + Repeat(expr) + '}'
expr = block | Token(re='[0-9]')
START = expr
Вот грамматика с использованием модуля lrparsing
для Python. Модуль не сообщает о конфликтах в грамматике.Модуль python lrparsing; не может разобрать простую рекурсивную грамматику
Он не может разобрать строку {{0}}
с ошибкой lrparsing.ParseError: line 1 column 5: Got '}' when expecting __end_of_input__ while trying to match block in state 11
Стадию стек состояние шагом является:
shift '{'; ItemSet:5='{'
shift '{'; ItemSet:5='{' ItemSet:5='{'
shift /[0-9]/; ItemSet:4=/[0-9]/ ItemSet:5='{' ItemSet:5='{'
reduce '}'; ItemSet:4=/[0-9]/ -- ItemSet:7=expr ItemSet:5='{' ItemSet:5='{'
reduce '}'; ItemSet:7=expr -- ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'
shift '}'; ItemSet:11='}' ItemSet:9=expr ItemSet:5='{' ItemSet:5='{'
Что AFAIK означает, что он смещается {{0
, то при виде }
снижения 0
к expr
, затем уменьшив на }
снова, не переложив его первым, что сбивает меня с меня.
Является ли это ошибкой, или я делаю что-то бесконечно просто и глупо?
Если это моя грамматика, как бы я реорганизовал ее, чтобы удовлетворить мои вечно пышные и страстные желания? Если это ошибка, может ли кто-нибудь направить меня к модулю python, у которого есть синтаксис , наиболее похожий на lrparsing, что делает работы?
EDIT: Рефакторинг как:
blocks = Ref('blocks')
block = Ref('block')
expr = Ref('expr')
blocks = blocks + block | THIS*0 # THIS*0 is the idiomatic way of getting the empty string
block = '{' + expr + '}'
expr = blocks | Token(re='[0-9]')
START = expr
Позволяет для правильного разбора. Теперь вопрос для меня ... почему? Я чувствую, что lrparsing
раньше жаловался на какие-либо проблемы синтаксического анализа ... Repeat
просто не работает так, как я ожидаю?
@Atash: Найден дефект. В конце концов, ваша грамматика не является двусмысленной: сначала нужно использовать 'expr' * * для расширения до' block', тогда 'Repeat' * нуждается в * для расширения. Никакой двусмысленности нет. Тем не менее, pyparsing имеет ошибку, поскольку он неправильно учитывает рекурсивные повторы. Я изменю ответ на это соглашение. (Надеюсь, это правильная вещь. Не стесняйтесь удалять метку ответа.) Извините, об этом. – mknecht
Спасибо за исправление ответа! Итак, я собираюсь удалить метку ответа ... и затем верну ее, потому что ответ правильный. Правильно? :-P – user