Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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 重写ANTLR解析器类中的规则_返回类_Java_Parsing_Antlr_Antlr3 - Fatal编程技术网

Java 重写ANTLR解析器类中的规则_返回类

Java 重写ANTLR解析器类中的规则_返回类,java,parsing,antlr,antlr3,Java,Parsing,Antlr,Antlr3,我想更改生成的返回类的getTree()方法的定义,如语句\u return(参见下面的示例)。请参见下面的示例解析器语法和生成的代码,其中包括statement()和statement\u return() 语法分析器 options { output = AST; } statement : rule* -> ^(STATEMENT rule* ) ; public static class statement_

我想更改生成的返回类的getTree()方法的定义,如语句\u return(参见下面的示例)。请参见下面的示例解析器语法和生成的代码,其中包括statement()和statement\u return()

语法分析器

options {
    output          = AST;
}

statement
    :   rule*  
       -> ^(STATEMENT rule* )
   ;
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            return tree;
        }
    };


    public final Grammar.statement_return statement() throws RecognitionException {
           ...
           ...
    }
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            /*
             start - Add some code in generated class 
            */
              PLSQLTree plsqlTree = (PLSQLTree) tree;

              Token start = this.start;
              plsqlTree.params.put(ParserConstants.START_TOKEN, start);
              Token stop = this.stop;
              plsqlTree.params.put(ParserConstants.STOP_TOKEN, stop);

            /*
             end - Add some code in generated class 
            */
            return plsqlTree;
        }
    };
生成的树解析器

options {
    output          = AST;
}

statement
    :   rule*  
       -> ^(STATEMENT rule* )
   ;
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            return tree;
        }
    };


    public final Grammar.statement_return statement() throws RecognitionException {
           ...
           ...
    }
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            /*
             start - Add some code in generated class 
            */
              PLSQLTree plsqlTree = (PLSQLTree) tree;

              Token start = this.start;
              plsqlTree.params.put(ParserConstants.START_TOKEN, start);
              Token stop = this.stop;
              plsqlTree.params.put(ParserConstants.STOP_TOKEN, stop);

            /*
             end - Add some code in generated class 
            */
            return plsqlTree;
        }
    };
我想更改生成类的getTree()方法的定义,如语句\u return,其中PLSQLTree(extensedcommontree)是自定义对象。我有一个定制的treeAdoptor,它创建了PLSQLTree类型的对象,我想为树解析器中需要的每个解析器规则捕获开始和结束标记。我希望语法中的所有规则都是一样的

我的覆盖定义

options {
    output          = AST;
}

statement
    :   rule*  
       -> ^(STATEMENT rule* )
   ;
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            return tree;
        }
    };


    public final Grammar.statement_return statement() throws RecognitionException {
           ...
           ...
    }
    public static class statement_return extends ParserRuleReturnScope {
        Object tree;

        public Object getTree() {
            /*
             start - Add some code in generated class 
            */
              PLSQLTree plsqlTree = (PLSQLTree) tree;

              Token start = this.start;
              plsqlTree.params.put(ParserConstants.START_TOKEN, start);
              Token stop = this.stop;
              plsqlTree.params.put(ParserConstants.STOP_TOKEN, stop);

            /*
             end - Add some code in generated class 
            */
            return plsqlTree;
        }
    };

请帮助我如何做到这一点?

恐怕您必须修改用于生成Java代码的StringTemplate才能做到这一点。也许详细说明为什么需要这样的更改是一个好主意——也许有另一种方法可以用另一种方法实现您的目标。@JiriTousek:我有重写方法的示例代码。还添加了相同的说明。如果您需要其他详细信息,请告诉我。@JiriTousek:如果您可以指导修改用于生成Java代码的StringTemplate来完成此操作,那将非常有用。我知道的唯一方法是基本上创建一个新的“目标语言”这将复制现有Java模板的几乎所有内容,并且只修改负责树返回的相关部分。请参阅以获取指南。我个人不喜欢这个解决方案,但我想不出任何更好的方法来实际修改解析器生成的这一部分。我的方法可能是使用后处理添加开始和结束标记。谢谢@jiri..将尝试创建新语言。我还更喜欢使用后处理添加开始和结束标记。可能是通过面向方面编程(AOP)