我不敢相信我是第一個問這個問題的人!當使用ANTLR4時,我需要訪問者遍歷分析樹並進行一些修改,所以我需要訪問每個樹節點中的子樹。這裏是我的Fortran語法的一個片段:如何通過訪問者訪問ANTLR4中的重複子樹?
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*
;
正如你所看到的,有在ifStatement
重複子樹elseIfStatement
。當我創建解析樹訪問者,我想訪問被解析的所有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*
。
巴特,感謝您的幫助!我遵循你的建議,並在'class IfMultipleStatementsContext'中得到了'public List elseIfStatement()'。我認爲ANTLR4不喜歡我以前的規則風格?無論如何我會報告這個問題。 –
@LiDong,不客氣。 –
我還有一個問題。由於我們已經標記了其他規則,如果我們有另一個規則包含'ifStatement',那麼我們該如何回到'ifMultipleStatements'或'ifSingleStatement'。我在IfStatementContext類中看不到它們。 –