3

私は節約を使用していくつかの解析を行っていますが、最初の文字を順序付けられていない離れた場所で共有する代替を適切に解析する方法を理解するのに苦労しています:

例えば:

文章:

2 > 3
2 >= 3

文法:

expr = ~"[0-9]+" space operator space ~"[0-9]+"
operator = ">" / "==" / "<" / ">=" / "<="
space = ~"[\\s]*"

テキストの 1 行目は正しく解析されますが、2 行目は正しく解析されません。">" に一致するように見えますが、"=" が表示されるためスタックします。全体として ">=" に一致することはありません。これらを慎重な順序で指定することなく、どうすればそれを行うことができますか? 先読みマッチングに「&」を使用してみましたが、うまくいかないようです。

4

1 に答える 1

3

倹約はペグに基づいています。PEG の優れた特性の 1 つは、代替演算子が順序付けられることです。つまり、代替選択は常に左から右に試行され、最初に成功した一致が勝ちます。したがって、PEG 文法は決してあいまいではありませんが、文法を記述し、それに応じて代替案を注文するときは、この特性に注意する必要があります。PEG は、実際には再帰降下パーサーの仕様です。

あなたの場合、最初に試行operatorされるように、本番環境で一致を実際に並べ替える必要があります。>=他の解決策は>=. これは、構文述語を使用して実現されNotます。倹約では で示される!ため、これも機能するはずです。 operator = ">" !"=" / "==" / "<" / ">=" / "<=" これは一般に、すべての PEG パーサーに適用されます。それは倹約的な特定ではありません。

于 2016-11-28T14:22:33.843 に答える