gpt4 book ai didi

Javacc 如何使扫描器和解析器可以访问变量

转载 作者:行者123 更新时间:2023-11-30 06:47:38 27 4
gpt4 key购买 nike

我正在尝试创建一个包含所有函数名称的映射。我可以在扫描阶段或解析阶段执行此操作,但似乎无法获得两者都可以访问的相同变量。

我需要的是在开始解析之前将所有函数名称保存在映射中,因为函数可以在其调用点下方声明。所以我需要检查该函数是否存在。

我尝试使用 token 管理器声明,它允许我在每次看到 map 时将 token 添加到 map 中。但是我需要解析器看到 funcs 变量,以便它可以检查函数是否存在。

    TOKEN_MGR_DECLS : {
public static Map funcs = new HashMap();
}
TOKEN : {
<FNAME: (["A"-"Z"])+ > { funcs.put(matchedToken.image, "..");}
}

这是我得到的最接近的,我在 .jj 文件中尝试了一个全局变量,就在 PARSER_BEGIN(..) 下方,并且还在主函数中声明了它。当尝试将函数名称添加到 map 时,这两种情况都会导致“无法找到符号”错误。

感谢您的帮助。

最佳答案

首先,我不得不说,我建议不要在解析器和词法分析器之间共享任何变量。这是因为词法分析器可以远远领先于解析器,这意味着:

  • 如果变量由词法分析器写入并由解析器读取,则当解析器读取该信息时,该信息可能已过时(即被覆盖)。

  • 如果变量由解析器写入并由词法分析器读取,则词法分析器需要的信息可能尚未由解析器写入。

也就是说。如果你需要这样做。这是一种方法。像这样在 token 管理器中声明您的变量

TOKEN_MGR_DECLS : {
Map funcs = new HashMap();
}

然后,在解析器中,您可以通过 token_source.funcs 访问该变量。

如果您使用STATIC=true选项,则变量应该是static

关于Javacc 如何使扫描器和解析器可以访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412413/

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