如何在 Tatsu 语法中包含文字“#”?
How to include a literal '#' in a Tatsu grammar?
我无法让 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']
很遗憾,我无法更改输入数据的格式。
这可能是您使用的 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(序列 return tuple
),但我只是对照 v4.4.0 检查,它是等价的。
我无法让 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']
很遗憾,我无法更改输入数据的格式。
这可能是您使用的 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(序列 return tuple
),但我只是对照 v4.4.0 检查,它是等价的。