Java JJTree令牌管理器声明
大家好,我在抽象语法树的.jjt文件中有以下代码,用于检查节点在传递给它的文件中的位置,但我无法从语义检查器类访问此变量。 代码如下,任何帮助都将不胜感激!我什么都试过了,现阶段我正在失去希望。 这是我要访问的.jjt文件中的整数 代币经理声明:Java JJTree令牌管理器声明,java,token,abstract-syntax-tree,javacc,Java,Token,Abstract Syntax Tree,Javacc,大家好,我在抽象语法树的.jjt文件中有以下代码,用于检查节点在传递给它的文件中的位置,但我无法从语义检查器类访问此变量。 代码如下,任何帮助都将不胜感激!我什么都试过了,现阶段我正在失去希望。 这是我要访问的.jjt文件中的整数 代币经理声明: { static int commentNesting = 0; public static int linenumber = 0; } SKIP : /*STRUCTURES AND CHARACTERS TO SCAPE*/
{
static int commentNesting = 0;
public static int linenumber = 0;
}
SKIP : /*STRUCTURES AND CHARACTERS TO SCAPE*/
{
" "
| "\t"
| "\n" {linenumber++;}
| "\r"
| "\f"
}
我的一个节点的示例
void VariableDeclaration() #VariableDeclaration : {Token t; String id; String type;}
{
t = <VARIABLE> id = Identifier() <COLON> type = Type()
}
如何获取声明此节点的行号?
谢谢大家
}您可以在教学机器的Java解析器中看到一个例子,它是 首先,您需要修改SimpleNode类型以包含行号字段。在TM中,我添加了一个声明
private SourceCoords myCoords ;
其中SourceCoords是一种类型,它不仅包括行号,还包括有关该行所在文件的信息。您可以只使用int字段。同样在SimpleNode中,您需要声明一些类似这样的方法
public void setCoords( SourceCoords toSet ) { myCoords = toSet ; }
public SourceCoords getCoords() { return myCoords ; }
您可能也希望在节点接口中声明它们
在.jjt文件中,使用选项
NODE_SCOPE_HOOK=true;
并在解析器类中声明两个方法
void jjtreeOpenNodeScope(Node n) {
((SimpleNode)n).setCoords( new SourceCoords( file, getToken(1).beginLine ) ) ;
}
void jjtreeCloseNodeScope(Node n) {
}
嗯,我可能应该在Node中声明方法以避免那个丑陋的强制转换
还有一件事,你自己在数台词。最好像我一样从令牌中获取行号。您的柜台通常会提前一个令牌。但是当解析器向前看时,前面可能有几个标记
如果令牌管理器没有正确地记录行数,则使用您自己的计数,但通过令牌类中额外添加的字段将其传递给解析器
通常,在令牌管理器中计算任何内容,然后在解析器中使用它是一个坏主意,除非它的信息存储在令牌中
void jjtreeOpenNodeScope(Node n) {
((SimpleNode)n).setCoords( new SourceCoords( file, getToken(1).beginLine ) ) ;
}
void jjtreeCloseNodeScope(Node n) {
}