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によると、{} は空のリストを生成します。

これが起こらないようにする方法はありますか?

4

1 に答える 1

1

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

これらの式を記述する方法は 2 つ以上あります。

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 に答える