在达解析中无法识别字母字符

时间:2019-04-20 00:38:58

标签: tatsu

我已经定义了一个非常简单的语法,但是达不到预期的表现。

我添加了一个“开始”规则,并以“ $”字符终止了该规则,但是我仍然看到相同的行为。

如果我使用正则表达式(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']”,并且不会引发异常。

我想念什么?

2 个答案:

答案 0 :(得分:0)

您可能需要检查与@@nameguard的交互,该交互默认情况下处于启用状态。

对于第一版语法,请使用:

@@nameguard :: False

您还可以考虑最适合语言和语法的@@whitespace@@namechars的定义。

答案 1 :(得分:0)

好的,我认为@@ nameguard存在问题。参见https://github.com/neogeny/TatSu/issues/95。目前,一种简单的解决方法是使用模式表达式来代替各个字母终端。同样,在修复@@ nameguard时,文档应阐明它仅与以字母开头的字母数字有关。显然,这里的数字终端不需要@@ nameguard。