Java JJTree令牌管理器声明

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*/

大家好,我在抽象语法树的.jjt文件中有以下代码,用于检查节点在传递给它的文件中的位置,但我无法从语义检查器类访问此变量。 代码如下,任何帮助都将不胜感激!我什么都试过了,现阶段我正在失去希望。 这是我要访问的.jjt文件中的整数 代币经理声明:

{
    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) {
}