2017-08-03 12 views
0

私は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))

この文法はこの入力でうまく動作します。それは完全に私のニーズに合った、次の構文解析ツリーを生成します。

enter image description here

しかし、他のカテゴリが指定されていない場合、「CAT1」のラベルは暗黙的であるDSLの奇妙な場合があります。これは、InferenceCategoryタグがキャッチするもので、この式は後でコード内のカテゴリとして扱われます。

と例えば

、((1または2)およびCAT2 :(4))

Iが(予想通り)を得る:

enter image description here

しかし次の例では、

CAT2 :(4)及び(1または2)

私が取得:

enter image description here

第二ブロックはInferenceCategoryとその代わりに、通常の表現のように識別されないことに注意し、最初のカテゴリの下で。これは、cat2:の後ろにある文法parses(4)が正規表現として存在し、それを超えたものがすべて正規表現として解析されるためです。

これを修正する方法はありますか?

label COLON expression (AND category)* # CategoryBlock (動作しない)

category AND category AND category (「作品」が、非常にハックであり、唯一の私は正確に持っている特定の場合に動作します:私が試してみました3つのカテゴリがあります)。

答えて

1

NOT expression # NotExprのような「代替ラベル」は、解析ツリーに違いはありません。それらは意味論的なものです。コード生成プロセスは、VisitorまたはListenerでオーバーライドできる特定のシグネチャを作成します。

この背後にある論理的根拠は、たとえば、expressionに対して1つの訪問者オーバーライドを取得する代わりに、代替ラベルごとに1つずつ表示されます。そうすれば、expressionを調べる必要はなく、それを実行する前にどのタイプであるかを判断する必要はありません。代わりに# OrExprのオーバーライドを取得し、そのオーバーライドコードを使用するとすぐに、ORトークンの両側にある式でORを処理していることがわかります。

構文解析ツリーは便利ですが、セマンティクスの多くは、リスナーまたはビジターをコード化するときにのみ顕著になります。

+0

こんにちは、リスナー/ビジターと仕事をするまで、代わりのラベルはセマンティックのみであることを知っています。この場合、これらの暗黙的なカテゴリをパーサーレベルで一意に識別する方法は、機能的に同一であるため、実際にはわかりません。これらの暗黙的なカテゴリのうちの1つが私の "label:expression"の右側に来るまで、この問題を無視している現行の実装は動作します。この場合、カテゴリではなく式として解釈されます。兄弟の代わりに他のカテゴリのサブツリーになります(これが主な問題です)。 – thevises

関連する問題