Буквы алфавита, не распознаваемые при разборе татсу

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

Я добавил правило "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 для числовых терминалов.

Другие вопросы по тегам