Буквы алфавита, не распознаваемые при разборе татсу
Я определил очень простую грамматику, но тацу ведет себя не так, как ожидалось.
Я добавил правило "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']" и не выдавать исключение.
Что мне не хватает?
2 ответа
Возможно, вам нужно проверить взаимодействие с @@ nameguard, который включен по умолчанию.
Для первой версии грамматики используйте:
@@nameguard :: False
Вы также можете рассмотреть определения @@ пробелов и @@ namechars, которые лучше всего подходят для языка и грамматики.
Хорошо, я думаю, что есть проблема с @@ nameguard. См. https://github.com/neogeny/TatSu/issues/95. В настоящее время простой обходной путь - использовать шаблонное выражение вместо отдельных буквенных терминалов. Кроме того, когда @@ nameguard исправлен, в документации следует уточнить, что она относится только к буквенно-цифровым цифрам, начинающимся с букв. Понятно, что нам здесь не нужна @@ nameguard для числовых терминалов.