1

我无法让 Tatsu 解析包含文字“#”的语法。

这是一个最小的例子:

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']

不幸的是,我无法更改输入数据的格式。

4

1 回答 1

2

这可能是您使用的 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')

附注:是的,上面的输出来自masterTatSu 的版本(序列返回tuple),但我只是检查了 v4.4.0,它是等价的。

于 2019-05-31T16:55:53.937 回答