【问题标题】:JJTree Token Manager DeclarationsJJTree 令牌管理器声明
【发布时间】:2018-12-15 19:45:02
【问题描述】:

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

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

}

【问题讨论】:

    标签: java token abstract-syntax-tree javacc


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2017-09-28
      • 2021-08-19
      相关资源
      最近更新 更多