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

标签 java javacc

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

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

我尝试使用 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/

相关文章:

JavaCC - XPath 解析器

java - 删除选择冲突而不向前看 - JavaCC

JavaCC 识别 token 中的 token

java - 尝试使用 JDBC 测试 MySQL 数据库中是否存在特定表时出错

java - 如何通过网络浏览器使用分段上传到S3?

java - 在Android中如何获取联系人并保存到数据库实现?

java - gradle 生成的文件编译失败

java - 一对多单向关系的外键约束问题

Java 8 流 HashMap<String, ArrayList<String>> 到 SortedMap<String, Integer>

Java, JavaCC : How to parse characters outside the BMP?