私はAntlr4を使ってブール値のようなDSLを解析しています。ここAntlr4文法 - 文法の識別に問題があります
は私の文法である:ここ
grammar filter;
filter: overall EOF;
overall
: LPAREN overall RPAREN
| category
;
category
: expression # InferenceCategory
| category AND category # CategoryAndBlock
| label COLON expression # CategoryBlock
| LPAREN category RPAREN # NestedCategory
;
expression
: NOT expression # NotExpr
| expression AND expression # AndExpr
| expression OR expression # OrExpr
| atom # AtomExpr
| LPAREN expression RPAREN # NestedExpression
;
label
: ALPHANUM
;
atom
: ALPHANUM
;
を解析するための例示の入力ストリングである:
(CAT1:(1または2)およびCAT2 :(4))
この文法はこの入力でうまく動作します。それは完全に私のニーズに合った、次の構文解析ツリーを生成します。
しかし、他のカテゴリが指定されていない場合、「CAT1」のラベルは暗黙的であるDSLの奇妙な場合があります。これは、InferenceCategoryタグがキャッチするもので、この式は後でコード内のカテゴリとして扱われます。
と例えば
、((1または2)およびCAT2 :(4))
Iが(予想通り)を得る:
しかし次の例では、
CAT2 :(4)及び(1または2)
私が取得:
第二ブロックはInferenceCategoryとその代わりに、通常の表現のように識別されないことに注意し、最初のカテゴリの下で。これは、cat2:の後ろにある文法parses(4)が正規表現として存在し、それを超えたものがすべて正規表現として解析されるためです。
これを修正する方法はありますか?
label COLON expression (AND category)* # CategoryBlock
(動作しない)
と
category AND category AND category
(「作品」が、非常にハックであり、唯一の私は正確に持っている特定の場合に動作します:私が試してみました3つのカテゴリがあります)。
こんにちは、リスナー/ビジターと仕事をするまで、代わりのラベルはセマンティックのみであることを知っています。この場合、これらの暗黙的なカテゴリをパーサーレベルで一意に識別する方法は、機能的に同一であるため、実際にはわかりません。これらの暗黙的なカテゴリのうちの1つが私の "label:expression"の右側に来るまで、この問題を無視している現行の実装は動作します。この場合、カテゴリではなく式として解釈されます。兄弟の代わりに他のカテゴリのサブツリーになります(これが主な問題です)。 – thevises