1

我已经定义了一个非常简单的语法,但是 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']" 并且不会抛出异常。

我错过了什么?

4

2 回答 2

1

您可能需要检查与默认打开的@@nameguard的交互。

对于语法的第一个版本,使用:

@@nameguard :: False

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

于 2019-04-20T17:08:50.910 回答
1

好的,我认为@@nameguard 有问题。请参阅https://github.com/neogeny/TatSu/issues/95。暂时的简单解决方法是使用模式表达式代替单个字母终端。此外,当@@nameguard 已修复时,文档应阐明它仅与以字母开头的字母数字相关。显然,这里的数字终端不需要@@nameguard。

于 2019-04-21T02:11:16.630 回答