2

antlrで解析ツリーからASTツリーに変換するための書き換えルールに問題があります。

これが私のantlrコードです:

grammar MyGrammar;

options {
  output= AST;
  ASTLabelType=CommonTree;
  backtrack = true;
}


tokens {
    NP;
    NOUN;
    ADJ;
}

//NOUN PHRASE
np  :    ( (adj)*  n+ (adj)*  -> ^(ADJ adj)*  ^(NOUN n)+ ^(ADJ adj)* )
    ;


adj : 'adj1'|'adj2';
n   : 'noun1';

「adj1noun1adj2」と入力すると、ツリーの解析結果は次のようになります。

ツリーを解析する

しかし、書き換えルール後のASTツリーは、解析ツリーとまったく同じではないように見えます。adjは二重であり、次のように順序付けられていません。

ASTツリー

だから私の質問は、上記の解析ツリーのような結果を得るようにルールをどのように書き直すことができるかということです。

4

1 に答える 1

2

ANTLR は一致したadjs のグループと別のグループを自動的に区別できないため、名詞句ルールはすべての形容詞を収集し、それらを名詞の両側にコピーします。

npルールの内訳は次のとおりです。

np  :    ( 
           (adj)*  //collect some adjectives
             n+ 
           (adj)*  //collect some more adjectives 
               -> ^(ADJ adj)*  //all adjectives written
                  ^(NOUN n)+   //all nouns written
                  ^(ADJ adj)*  //all adjectives written again
         )
    ;

2 つのグループを分離する 1 つの方法は、それらをそれぞれのリストにまとめることです。rule に適用された例を次に示しnpます。

np  :    ( 
           (before+=adj)*  //collect some adjectives into "before"
             n+ 
           (after+=adj)*  //collect some adjectives into "after"
               -> ^(ADJ $before)*  //"before" adjectives written
                  ^(NOUN n)+   //all nouns copied
                  ^(ADJ $after)*  //"after" adjectives written
         )
    ;

このようにして、ANTLRは s のadj前後にどの s を書き出すかを認識しnます。

于 2012-12-20T05:12:37.003 に答える