gpt4 book ai didi

java - JJTree 代币管理器声明

转载 作者:行者123 更新时间:2023-12-02 10:27:50 26 4
gpt4 key购买 nike

大家好,我的 .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 解析器中看到这样的示例,即 here .

首先,您需要修改 SimpleNode 类型以包含行号字段。在TM中我添加了一个声明

private SourceCoords myCoords ;

其中 SourceCoords 是一种类型,不仅包含行号,还包含有关该行所在文件的信息。您可以只使用 int 字段。同样在 SimpleNode 中,您需要声明一些像这样的方法

public void setCoords( SourceCoords toSet ) { myCoords = toSet ; }
public SourceCoords getCoords() { return myCoords ; }

您可能也想在 Node 接口(interface)中声明它们。

在您的 .jjt 文件中,使用该选项

NODE_SCOPE_HOOK=true;

并在解析器类中声明两个方法

void jjtreeOpenNodeScope(Node n) {
((SimpleNode)n).setCoords( new SourceCoords( file, getToken(1).beginLine ) ) ;
}
void jjtreeCloseNodeScope(Node n) {
}

嗯。我可能应该在 Node 中声明这些方法,以避免这种丑陋的转换。

<小时/>

还有一件事,你自己计算行数。最好像我一样从 token 中获取行号。您的计数器通常会领先一个 token 。但是当解析器向前看时,可能会领先几个标记。

如果 token 管理器没有正确记录行数,则使用您自己的计数,但通过 Token 类中额外添加的字段将其传达给解析器。

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

关于java - JJTree 代币管理器声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53796668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com