我正在解析一个格式可以包括的文件:
INT32 price min 10 max 100 alertIfSold ;
min、max 和 alertIfSold 标记都是可选的,可以以任何顺序出现。那是
INT32 price max 100 alertIfSold ;
INT32 price max 100 min 10 alertIfSold ;
INT32 price alertIfSold ;
INT32 price;
都是有效的例子。
下面是我正在测试的语法的简单版本。运行 python test.py 生成此错误:
lark.common.ParseError:检测到无限递归!(规则 <__anon_star_1 : __anon_star_1>)
我尝试使用其他语法规则表达相同的可选标记,结果相似(无限递归)。
表达可选参数的正确语法是什么?
#test.py
from lark import lark
simplified_grammar = """
start: line+
line: TYPE CNAME [MIN MAX ALERT]* ";" -> foo
TYPE: "INT32" | "INT64"
MIN: "min" /[0-9]+/
MAX: "max" /[0-9]+/
ALERT: "alertIfSold"
%import common.CNAME
%import common.WS
%ignore WS
"""
sample = """
INT32 price max 100 alertIfSold ;
INT32 price max 100 min 10 alertIfSold ;
INT32 price alertIfSold ;
INT32 price;
"""
parser = lark.Lark(simplified_grammar)
def main():
parse_tree = parser.parse(sample)
if __name__ == '__main__':
main()