大家好,我的.jjt文件中的抽象语法树包含以下代码,用于检查是否在传递给它的文件中的节点位置,但是我无法从语义检查器类访问此变量。 该代码是波纹管,任何帮助,将不胜感激!我已经尽了一切努力,在这个阶段我失去了希望。 这是我要访问的.jjt文件中的整数 TOKEN_MGR_DECLS:
{
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()
}
我的语义检查器类
public class SemanticCheckVisitor implements "My jjt file visitor" {
public Object visit(VariableDeclaration node, Object data) {
node.childrenAccept(this, data);
return data;
}
如何获得声明该节点的行号? 谢谢大家。
}
答案 0 :(得分:1)
您可以在教学机器的Java解析器here中看到一个示例。
首先,您需要修改SimpleNode
类型以包括行号字段。在TM中,我添加了一个声明
private SourceCoords myCoords ;
其中SourceCoords
是一种类型,它不仅包含行号,而且还包含有关该行所在文件的信息。您可以仅使用int
字段。同样在SimpleNode
中,您需要声明一些类似的方法
public void setCoords( SourceCoords toSet ) { myCoords = toSet ; }
public SourceCoords getCoords() { return myCoords ; }
您可能也想在Node
接口中声明它们。
在您的.jjt
文件中,使用选项
NODE_SCOPE_HOOK=true;
并在解析器类中声明两个方法
void jjtreeOpenNodeScope(Node n) {
((SimpleNode)n).setCoords( new SourceCoords( file, getToken(1).beginLine ) ) ;
}
void jjtreeCloseNodeScope(Node n) {
}
嗯。我可能应该已经在Node
中声明了方法,以避免进行这种丑陋的转换。
还有一件事,您自己要统计行数。最好像我一样从令牌中获取行号。您的柜台通常会提前一个令牌。但是当解析器向前看时,它可能在前面几个令牌。
如果令牌管理器没有正确记录行数,请使用您自己的计数,而是通过Token
类中额外添加的字段将其传达给解析器。
通常,在令牌管理器中计算任何内容然后在解析器中使用它是一个坏主意,除非您将其信息存储在令牌中。