0

我想描述一个可嵌套的条件。这是我正在使用的:

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,{} 生成一个空列表。

有没有办法防止这种情况发生?

4

1 回答 1

1

您所看到的并非 Grako 特有的。您在同一规则上同时使用递归和闭包。

有(不止)两种方式来描述这些表达式:

condition = expr { condop expr } ;

或者

condition = expr [ condop condition ] ;

或者

condition = expr condop condition | expr;

这相当于前一个。

左递归并非在所有情况下都适用于 Grako,因此使用它需要您自担风险。相当于:

condition = condition condop condition | expr;
于 2016-10-05T12:37:34.877 回答