Буквы алфавита, не распознаваемые при разборе татсу - PullRequest
1 голос
/ 20 апреля 2019

Я определил очень простую грамматику, но 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']" и не вызывать исключение.

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Хорошо, я думаю, что есть проблема с @@ nameguard.См. https://github.com/neogeny/TatSu/issues/95.. В настоящее время простым обходным путем является использование выражения шаблона вместо отдельных буквенных терминалов.Кроме того, когда @@ nameguard исправлен, в документации следует уточнить, что она относится только к буквенно-цифровым цифрам, начинающимся с букв.Понятно, что нам здесь не нужен @@ nameguard для числовых терминалов.

0 голосов
/ 20 апреля 2019

Возможно, вам нужно проверить взаимодействие с @@ nameguard , который включен по умолчанию.

Для первой версии грамматики используйте:

@@nameguard :: False

Можно также рассмотреть определения @@ пробелов и @@ namechars , которые лучше всего подходят для языка и грамматики.

...