Как включить буквальное "#" в грамматику тацу?
Я не могу заставить Тацу разобрать грамматику, которая включает в себя буквальное "#".
Вот минимальный пример:
G = r'''
atom = /[0-9]+/
| '#' atom
;
'''
p = tatsu.compile(G)
p.parse('#345', trace=True)
Анализ разбрасывает исключение FailedParse. Трассировка, кажется, показывает, что синтаксический анализатор не соответствует литералу '#':
<atom ~1:1
#345
!'' /[0-9]+/
!'#'
!atom ~1:1
#345
Если я изменю грамматику на символ, отличный от "#", он будет работать нормально. Например, это работает:
G1 = r'''
atom = /[0-9]+/
| '@' atom
;
'''
tatsu.parse(G1, '@345') --> ['@', '345']
К сожалению, я не могу изменить формат входных данных.
1 ответ
Вероятно, это ошибка в используемой вами версии TatSu.
Если вам нужно придерживаться этой версии, попробуйте включить @@eol_comments :: //
или подобный образец в грамматике.
Это работает для меня:
[ins] In [1]: import tatsu
[ins] In [2]: G = r'''
...: atom = /[0-9]+/
...: | '#' atom
...: ;
...: '''
...:
...: p = tatsu.compile(G)
...: p.parse('#345', trace=True)
↙atom ~1:1
#345
≢'' /[0-9]+/
#345
≡'#'
345
↙atom↙atom ~1:2
345
≡'345' /[0-9]+/
≡atom↙atom
≡atom
Out[2]: ('#', '345')
AFTERNOTE: Да, вышеуказанный вывод master
версия Татсу (последовательности возвращаются tuple
), но я только что проверил против v4.4.0, и это эквивалентно.