忽略递归规则中{}匹配的空元素
Ignoring empty elements matched by {} in recursive rule
我想描述一个可嵌套的条件。这是我正在处理的内容:
expr = ( /[_a-zA-Z][a-zA-Z0-9_-]*/ ) ;
condop = ( "AND" | "OR" ) ;
condition = expr { condop condition } ;
start = condition ;
我可以用如下行生成 AST:
foo AND bar
这里是 AST :
[
"foo",
[
[
"AND",
[
"bar",
[]
]
]
]
]
但是"bar"后面有一个空列表,因为我猜最后一次匹配条件规则,"condop condition"值一个空字符串。根据文档 https://pypi.python.org/pypi/grako/3.16.0,{} 生成一个空列表。
有没有办法防止这种情况发生?
您看到的不是 Grako 特有的。您在同一规则上同时使用递归和闭包。
有(超过)两种方式来描述这些表达式:
condition = expr { condop expr } ;
或
condition = expr [ condop condition ] ;
或
condition = expr condop condition | expr;
相当于上一个
左递归并非在所有情况下都适用于 Grako,因此使用它需要您自担风险。等价于:
condition = condition condop condition | expr;
我想描述一个可嵌套的条件。这是我正在处理的内容:
expr = ( /[_a-zA-Z][a-zA-Z0-9_-]*/ ) ;
condop = ( "AND" | "OR" ) ;
condition = expr { condop condition } ;
start = condition ;
我可以用如下行生成 AST:
foo AND bar
这里是 AST :
[
"foo",
[
[
"AND",
[
"bar",
[]
]
]
]
]
但是"bar"后面有一个空列表,因为我猜最后一次匹配条件规则,"condop condition"值一个空字符串。根据文档 https://pypi.python.org/pypi/grako/3.16.0,{} 生成一个空列表。
有没有办法防止这种情况发生?
您看到的不是 Grako 特有的。您在同一规则上同时使用递归和闭包。
有(超过)两种方式来描述这些表达式:
condition = expr { condop expr } ;
或
condition = expr [ condop condition ] ;
或
condition = expr condop condition | expr;
相当于上一个
左递归并非在所有情况下都适用于 Grako,因此使用它需要您自担风险。等价于:
condition = condition condop condition | expr;