我已经定义了一个非常简单的语法,但是达不到预期的表现。
我添加了一个“开始”规则,并以“ $”字符终止了该规则,但是我仍然看到相同的行为。
如果我使用正则表达式(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']”,并且不会引发异常。
我想念什么?
答案 0 :(得分:0)
您可能需要检查与@@nameguard的交互,该交互默认情况下处于启用状态。
对于第一版语法,请使用:
@@nameguard :: False
您还可以考虑最适合语言和语法的@@whitespace和@@namechars的定义。
答案 1 :(得分:0)
好的,我认为@@ nameguard存在问题。参见https://github.com/neogeny/TatSu/issues/95。目前,一种简单的解决方法是使用模式表达式来代替各个字母终端。同样,在修复@@ nameguard时,文档应阐明它仅与以字母开头的字母数字有关。显然,这里的数字终端不需要@@ nameguard。