Я определил очень простую грамматику, но tatsu работает не так, как ожидалось.
Я добавил правило "start" и завершил его символом "$", но я все еще вижу то же поведение.
Если я определю правило "аппликатуры" с помощью регулярного выражения (digit = /[1-5x]/
) вместо отдельных конечных символов, проблема исчезнет.Но не должен ли работать приведенный ниже BNF-подобный синтаксис старой школы?
from pprint import pprint
from tatsu import parse
GRAMMAR = """
@@grammar :: test
@@nameguard :: False
start = sequence $ ;
sequence = {digit}+ ;
digit = 'x' | '1' | '2' | '3' | '4' | '5' ;"""
test = "23"
ast = parse(GRAMMAR, test)
pprint(ast) # Prints ['2', '3']
test = "xx"
ast = parse(GRAMMAR, test)
pprint(ast) # Throws tatsu.exceptions.FailedParse: (1:1) no available options :
Тест "xx" должен выдавать "['x', 'x']" и не вызывать исключение.
Чего мне не хватает?