我不敢相信我是第一个问这个问题的人!使用 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()
只返回 as 的第一次出现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*
上面所有带有'*'的解析器规则模式。