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