私がこの質問をした最初の男だとは信じられません! ANTLR4 を使用する場合、ビジターが解析ツリーをウォークスルーして変更を加える必要があるため、各ツリー ノード内のサブツリーにアクセスする必要があります。ここに私の Fortran 文法のスニペットがあります:
ifStatement
: IF_KEYWORD expression
( ( THEN_KEYWORD
executableStatement*
elseIfStatement* // <--- problem is here
elseStatement?
END_KEYWORD IF_KEYWORD
) | executableStatement )
;
elseIfStatement
: ELSE_KEYWORD IF_KEYWORD expression THEN_KEYWORD executableStatement*
;
ご覧のとおり、 には繰り返しサブツリーelseIfStatement
がありifStatement
ます。elseIfStatement
解析ツリーのビジターを作成するときに、解析されるすべてのコンテキストにアクセスしたいと考えています。
public Void visitIfStatement(FortranParser.IfStatementContext ctx) {
...
for (FortranParser.ElseIfStatementContext elsIf : ctx.elseIfStatement()) // ERROR!!!
visitElseIfStatement(elseIf);
...
return null;
}
ただしctx.elseIfStatement()
、次のように最初に出現したもののみを返しますelseIfStatement
。
if (a == 1) then
a = 2
else if (b == 1) then |
b = 3 | -> returned by ctx.elseIfStatement()
else if (c == 1) then \
c = 4 \ -> ignored??
else
d = 4
end if
elseIfStatement
では、すべてのサブツリーにアクセスするにはどうすればよいでしょうか? この質問は、上記の「*」を含むすべてのパーサー ルール パターンに適用されexecutableStatement*
ます。