Как включить буквальное «#» в грамматику тацу? - PullRequest
0 голосов
/ 30 мая 2019

Я не могу заставить Тацу разобрать грамматику, которая включает в себя литерал '#'.

Вот минимальный пример:

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 Ответ

1 голос
/ 31 мая 2019

Вероятно, это ошибка в используемой вами версии 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 версии TatSu (последовательности возвращают tuple), но я только что проверил v4.4.0, и это эквивалентно.

...