JJTree令牌管理器声明

时间:2018-12-15 19:45:03

标签: java token abstract-syntax-tree javacc

大家好,我的.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;
    }

如何获得声明该节点的行号? 谢谢大家。

}

1 个答案:

答案 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类中额外添加的字段将其传达给解析器。

通常,在令牌管理器中计算任何内容然后在解析器中使用它是一个坏主意,除非您将其信息存储在令牌中。