Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Antlr4:如何识别匹配的规则备选方案?_Java_Parsing_Antlr_Antlr4_Grammar - Fatal编程技术网

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;就这样。