Java 重写ANTLR解析器类中的规则_返回类
我想更改生成的返回类的getTree()方法的定义,如语句\u return(参见下面的示例)。请参见下面的示例解析器语法和生成的代码,其中包括statement()和statement\u return() 语法分析器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_
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)