1

トークンの簡単なリストを含むASTがあります...

バランスの取れたパラメーターのペアをネストされたツリーにグループ化するだけです。

いろいろなルールを試してきましたが、なかなかうまくいきません...

bottomup : findParams;

findParams
: ^(LIST left+=expression* LPARAM inner? RPARAM right+=expression*)
-> ^(LIST  $left* ^(PARAMS inner?) $right*);

inner : (left+=expression* LPARAM inner? RPARAM right+=expression*)
-> $left* ^(PARAMS inner?) $right*) | (a+=expression* -> $a*);

fragment expression = INT;

これはディック言語のようなものですが、ソースではなくツリー上にあります。また、リモートデバッグを使用してパターンマッチングツリーの文法をデバッグすることはできません。これは障害です。

4

1 に答える 1

2

あなたのアプローチは正しい方向に進んでいますが、トップダウンのアプローチとボトムアップのアプローチを混ぜ合わせています。トップダウンは物事を分解するのに適しています:「このリストは大きいので、いくつかの小さいリストにします。」ボトムアップは、物事を分割するのに適してます。「これはリストになる可能性のある最も単純なものなので、1つにします。」

ノードをグループ化するためのボトムアップソリューションは次のとおりです。

bottomup
    : exit_list
    ;

exit_list
    : ^(LIST pre* LPAR reduced* RPAR post+=.*) -> ^(LIST pre* ^(LIST reduced*) $post*)
    ;

pre : INT
    | LPAR 
    | ^(LIST .*)
    ;   

reduced
    : INT
    | ^(LIST .*)
    ;    

他の括弧を含まない括弧のセットごとに、そのセットの内容を新しいリストに変換します。このルールは、括弧がなくなるまで繰り返されます。

例:

入力

1(3(4))5

ベースラインAST

ベースラインAST

最終AST

グループ化されたAST

ルールbottomupは再帰的に2回適用されました。

applied to (4):    (LIST 1 '(' 3 '(' 4 ')' ')' 5) -> (LIST 1 '(' 3 (LIST 4) ')' 5)

applied to (3(4)): (LIST 1 '(' 3 (LIST 4) ')' 5) -> (LIST 1 (LIST 3 (LIST 4)) 5)
于 2012-12-16T19:22:37.620 に答える