2

antlrの「*+」を使用したAST書き換えルールでのdevidegroupテクニックを使用したAST書き換えルールに関する問題の後。

ANTLRでのASTの生成に問題があります:)これが私のantlrコードです:

start   :   noun1+=n (prep noun2+=n (COMMA noun3+=n)*)*
        ->  ^(NOUN $noun1) (^(PREP prep) ^(NOUN $noun2) ^(NOUN $noun3)*)*
    ;
n       :    'noun1'|'noun2'|'noun3'|'noun4'|'noun5';
prep    :    'and'|'in';
COMMA   :     ',';

さて、入力: "noun1 and noun2、noun3 in noun4、noun5"で、予期しないASTをたどりました:

ここに画像の説明を入力してください

ANLRworkの「解析ツリー」と比較してください。

ここに画像の説明を入力してください

「COMMAnoun3+=n」のすべての「n」のリストを保持している$noun3変数だと思います。したがって、ASTパーサー^(NOUN $ noun3)*は、どの「n」が実際に「prep」に属しているかを特定せずに、すべての「n」を描画します。

"(^(PREP prep)^(NOUN $ noun2)^(NOUN $ noun3)"で分離できる方法はありますか。私がやりたいのは、ASTがANTLRworkの「ParseTree」を使用して、トークンCOMMAなしで正確に描画する必要があることです。

手伝ってくれてありがとう !

4

1 に答える 1

2

startルールを分割すると、必要な分離を取得するのが最も簡単になります。次に例を示します(COMMAASTにsを書き込まない場合)。

start   :   prepphrase             //one prepphrase is required.
            (COMMA! prepphrase)*   //"COMMA!" means "match a COMMA but don't write it to the AST"
        ;

prepphrase: noun1=n                //You can use "noun1=n" instead of "noun1+=n" when you're only using it to store one value
            (prep noun2=n)? 
            -> ^(NOUN $noun1) ^(PREP prep)? ^(NOUN $noun2)?
        ;

Aprepphraseは名詞であり、その後に別の名詞の前置詞が続く場合があります。startルールはコンマ区切りのを探しますprepphrase

出力は解析ツリー画像のように見えますが、コンマはありません。


でASTを明示的に書き出すことを好む場合、->またはのような構文が気に入らない場合は、代わりにこのようなルールCOMMA!を書くことができます。start2つの異なる形式は機能的に同等です。

start   :   prepphrase             //one prepphrase is required.
            (COMMA prepphrase)*
            -> prepphrase+         //write each prepphrase, which doesn't include commas
        ;
于 2012-12-20T18:18:26.983 に答える