Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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 状态和访问者模式_Java_State_Antlr_Antlr4_Visitor - Fatal编程技术网

Java 状态和访问者模式

Java 状态和访问者模式,java,state,antlr,antlr4,visitor,Java,State,Antlr,Antlr4,Visitor,在我正在构建的应用程序中,我试图使用访问者模式收集大量的状态,这些模式稍后将被操作。这是使用ANTLR 4收集状态的典型方法还是反模式?如果不是,你能提供一个如何处理状态的例子吗 您还应该在遍历时更新域对象,还是在遍历访问者外部后实现所有业务逻辑 我所看到的所有ANTLR 4示例都太小了,我正在寻找如何在真实场景中使用它 多谢各位 public class JavaClassVisitor extends JavaBaseVisitor < String > { priva

在我正在构建的应用程序中,我试图使用访问者模式收集大量的状态,这些模式稍后将被操作。这是使用ANTLR 4收集状态的典型方法还是反模式?如果不是,你能提供一个如何处理状态的例子吗

您还应该在遍历时更新域对象,还是在遍历访问者外部后实现所有业务逻辑

我所看到的所有ANTLR 4示例都太小了,我正在寻找如何在真实场景中使用它

多谢各位

public class JavaClassVisitor extends JavaBaseVisitor < String > {

    private JavaClassVisitorState jcvs = new JavaClassVisitorState();

    @Override
    public List < String > visitParseContext(ParseContext ctx) {
        visitChildren(ctx);
        return jvcs.getAccessSpecifiers().toString();
    }

    @Override
    public List < String > visitClassDeclaration(ClassDeclarationContext ctx) {
        IdentifierContext idCtx = ctx.Identifier();
        if (idCtx != null) {
            String accessSpecifier = idCtx.getText();
            List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
            accessSpecifiers.add(accessSpecifier);
        }
        return visitChildren(ctx);
    }

    @Override
    public List < String > visitMethodDeclaration(MethodDeclarationContext ctx) {
        IdentifierContext idCtx = ctx.Identifier();
        if (idCtx != null) {
            String accessSpecifier = idCtx.getText();
            List < String > accessSpecifiers = jcvs.getAccessSpecifiers();
            accessSpecifiers.add(accessSpecifier);
        }
        return visitChildren(ctx);
    }

}
public类JavaClassVisitor扩展了JavaBaseVisitor{
私有JavaClassVisitorState jcvs=新JavaClassVisitorState();
@凌驾
公共列表visitParseContext(ParseContext ctx){
探视儿童(ctx);
返回jvcs.getAccessSpecifiers().toString();
}
@凌驾
公共列表visitClassDeclaration(ClassDeclarationContext ctx){
IdentifierContext idCtx=ctx.Identifier();
if(idCtx!=null){
String accessSpecifier=idCtx.getText();
ListaccessSpecifiers=jcvs.getAccessSpecifiers();
add(accessSpecifier);
}
回访儿童(ctx);
}
@凌驾
公共列表<字符串>访问方法声明(MethodDeclarationContext ctx){
IdentifierContext idCtx=ctx.Identifier();
if(idCtx!=null){
String accessSpecifier=idCtx.getText();
ListaccessSpecifiers=jcvs.getAccessSpecifiers();
add(accessSpecifier);
}
回访儿童(ctx);
}
}

为了保持Stackoverflow的典型问答风格,我回答了一个问题,这是本文的核心

我不知道ANTLR4的“典型”访问者模式。这一切都取决于背景和你想要实现的目标。如果您需要更新域对象,并决定在访问者中进行更新,那么就这样做吧


访问者模式并不局限于收集数据。更新也是一个有效的操作。ANTLR4中的访问者和侦听器的工作方式非常相似,都是在解析树上遍历深度优先。这两种调用方法都特定于它们在树中看到的每个解析上下文。主要区别在于,侦听器执行一般的漫游,而访问者可以返回自定义值(适用于评估器之类的事情,即使您也可以在访问者的成员变量中保留中间值)。

这里有多个问题,所有问题都是基于意见的。询问“如何处理访问者的状态”太宽了。而是针对你看到的具体问题提出具体问题。