Java Antlr4:如何识别匹配的规则备选方案?
我的语法如下:Java Antlr4:如何识别匹配的规则备选方案?,java,parsing,antlr,antlr4,grammar,Java,Parsing,Antlr,Antlr4,Grammar,我的语法如下: node: '{' type ',' '"expression"' ':' rightSide '}' ; rightSide: call # callAlternative | identifier # identifierAlternative ; 现在在我的visitor中,我实现了visitNodeParser.NodeContext ctx方法,并希望访问右侧规则的正确方法,无论哪种方法匹配。标签用于为每个备
node: '{' type ',' '"expression"' ':' rightSide '}' ;
rightSide:
call # callAlternative
| identifier # identifierAlternative
;
现在在我的visitor中,我实现了visitNodeParser.NodeContext ctx方法,并希望访问右侧规则的正确方法,无论哪种方法匹配。标签用于为每个备选方案生成专用方法,righSide规则不再具有访问方法。此外,visitNode中的ctx只有ctx.rightSide,没有ctx.callAlternative和/或ctx.identifierAlternative
如何做到这一点
@凌驾
public SomeObj visitNodeParser.NodeContext ctx{
//如何检测两个备选方案中的哪一个匹配?ctx只有ctx.rightSide
//ctx中的某物是什么?
如果……{//这里怎么决定??
visitIdentifierAlternativectx.something;
}否则访问CallAlternativeCx.something;
返回新的SomeObj;
}
@凌驾
public SomeObj visitIdentifierAlternativeParser.IdentifierAlternativeContext ctx{
//做事情只是为了做替代品
返回新的SomeObj;
}
@凌驾
公共SomeObj visitCallAlternativeParser.CallAlternativeContext ctx{
//只为自己而做的事情
返回新的SomeObj;
}
您不能直接调用visitIdentifierAlternative或visitCallAlternative。您只需调用visit,visit将自行选择适当的方法。您不直接调用visitIdentifierAlternative或VisitCalAlternative。您只需调用visit,然后visit将自行选择适当的方法。我从概念的角度理解您的意思,即实现访客模式和使用双重分派visit。但是,当涉及到实际实现时,由于Antlr自动生成的类/方法,我无法让它正常工作。visitParseTree树需要ParseTree对象,但只有上下文对象可用。这应该如何正确地完成?你能为给定的语法提供一个MVCE吗?我已经在谷歌上搜索过了,但找不到任何有用的东西。@avermaet所有的上下文类都继承自ParseTree。您实际上只是将if语句替换为visitctx.something;就这样,我从概念的角度理解你的意思,就是实现访问者模式和使用双重访问调度。但是,当涉及到实际实现时,由于Antlr自动生成的类/方法,我无法让它正常工作。visitParseTree树需要ParseTree对象,但只有上下文对象可用。这应该如何正确地完成?你能为给定的语法提供一个MVCE吗?我已经在谷歌上搜索过了,但找不到任何有用的东西。@avermaet所有的上下文类都继承自ParseTree。您实际上只是将if语句替换为visitctx.something;就这样。