2016-10-04 67 views
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條件」值得一個空字符串。根據文檔https://pypi.python.org/pypi/grako/3.16.0,{}生成一個空列表。

有沒有辦法來防止這種情況發生?

回答

1

你所看到的不是Grako特有的。您正在使用同一規則的遞歸和閉包。

有(超過)兩種方式來描述這些表達式:

condition = expr { condop expr } ; 

condition = expr [ condop condition ] ; 

condition = expr condop condition | expr; 

其等同於前一個。

左遞歸在Grako的所有情況下都不起作用,所以使用它需要您自擔風險。相當於:

condition = condition condop condition | expr;