我已经定义了一个非常简单的语法,但tatsu的行为并不像预期的那样。
我添加了一个"start“规则,并以"$”字符终止它,但我仍然看到相同的行为。
如果我用正则表达式(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'”,并且不会抛出异常。
我遗漏了什么?
发布于 2019-04-21 01:08:51
您可能需要检查与@@nameguard的交互,这在默认情况下处于打开状态。
对于语法的第一个版本,请使用:
@@nameguard :: False您还可以考虑最适合语言和语法的@@whitespace和@@namechars的定义。
发布于 2019-04-21 10:11:17
好的,我认为@@nameguard有问题。参见https://github.com/neogeny/TatSu/issues/95。目前比较简单的解决方法是使用模式表达式来代替单个字母终端。此外,当@@nameguard被修复时,文档应该澄清它只与以字母开头的字母数字有关。显然,这里的数字终端不需要@@nameguard。
https://stackoverflow.com/questions/55769255
复制相似问题