1

正しく解析する次の if ステートメントがあります。

ifStatement
    : 'IF' expression 'THEN' statementBlock 
        (options {greedy=true;} 
            : 'ELSE' statementBlock)?

    ;

ここで、これを AST に解析したいと思います。これが私がやった方法です:

ifStatement
    : 'IF'^ expression 'THEN'! statementBlock 
        (options {greedy=true;} 
            : 'ELSE'! statementBlock)?

    ;

組み立て説明書がうまくいかないようだったので、!とを追加しました。^->

私の結果は、3 つの子を持つ AST です。1 は条件、2 と 3 はステートメント ブロックです。else の部分はオプションです。else がない場合、ノード 3 はありません。

問題は、ステートメント ブロックが常に空であることです。それを修正する方法は?

4

1 に答える 1

0

以下は基本的に私がそれを実装した方法です。'IF'、'THEN'、および'ELSE'は'tokens'セクションで宣言されていることに注意してください

ifStatement
:   IF expression THEN ifStat=statementBlock 
    (   ELSE elseStat=statementBlock  ->  ^(IF expression $ifStat $elseStat)
    |                                 ->  ^(IF expression $ifStat)
    )
;

[編集]または、より明確にすることもできますが、これも機能するはずです

ifStatement
:   IF expression THEN ifStat=statementBlock ELSE elseStat=statementBlock  ->  ^(IF expression $ifStat $elseStat)
|   IF expression THEN ifStat=statementBlock                               ->  ^(IF expression $ifStat)
;
于 2011-03-28T01:44:46.723 に答える