2016-10-04 10 views
0

ネスト可能な条件について説明します。再帰的ルールで{}でマッチした空の要素を無視する

ここ
foo AND bar 

AST:

[ 
    "foo", 
    [ 
    [ 
     "AND", 
     [ 
     "bar", 
     [] 
     ] 
    ] 
    ] 
] 

しかし、後に空のリストがある私のようなラインを持つASTを生成することができます

expr = (/[_a-zA-Z][a-zA-Z0-9_-]*/) ; 

condop = ("AND" | "OR") ; 
condition = expr { condop condition } ; 

start = condition ; 

:ここでは私が働いているものです"bar"は条件ルールが最後に合致したと思うので、空の文字列の価値がある "condop condition"。ドキュメントhttps://pypi.python.org/pypi/grako/3.16.0によれば、{}は空のリストを生成します。

これを防ぐ方法はありますか?

答えて

1

あなたが見ているのはGrako特有のものではありません。同じルールで再帰とクロージャの両方を使用しています。

それらの式を説明するための二つの方法(以上)があります

condition = expr { condop expr } ; 

又は

condition = expr [ condop condition ] ; 

又は

condition = expr condop condition | expr; 

は、前のものに相当します。

Gracoでは、すべてのケースで左回帰が機能しないため、自己責任で使用してください。同等のものは次のとおりです。

condition = condition condop condition | expr; 
関連する問題