java - 定义 token 的 "groups"

标签 java parsing javacc

我正在使用 JavaCC 为一种简单语言开发一个解析器。

在我的 token 声明部分,我有这样的内容

< CONSTANT: < INTEGER > | < FLOAT_NUMBER > | < BOOLEAN > >

< INTEGER: "0" | ("-")? ["1"-"9"](["0"-"9"])* | "0x" (["0"-"9"] | ["a"-"f"]  | ["A"-"F"])+ >
< FLOAT_NUMBER: ("-")? (["0"-"9"])+ "." (["0"-"9"])+ ("E" ("-")? (["0"-"9"])+)? ("D")? >
< BOOLEAN: "true" | "false">

CONSTANT由于其顺序,优先级高于 INTEGER 。然而,语法的某些部分我需要 INTEGER , 具体来说。在这些情况下,解析器会抛出异常,因为 INTEGER被解析为 CONSTANT .

一个简单的解决方案是消除 CONSTANT token 并查找并替换为 (< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >) 。不过,这感觉相当笨拙。

有没有办法定义CONSTANT作为其他标记的简单分组,例如 CONSTANT本身并不是一个标记,而是 (< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >) 的简写形式?

感谢您的宝贵时间。

最佳答案

我认为这里简单的答案是您不应该在分词器中执行此操作。

最好将其放入生产规则中,例如:

Token parseConstant() :
{
    Token t;    
}

{
    (
      t = < INTEGER > | t = < FLOAT_NUMBER > | t = < BOOLEAN >
    )
    {
      return t;
    }

}

关于java - 定义 token 的 "groups",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607588/

相关文章:

C strtok 和 strcpy

Javascript 文本数组解析

java - 如何使用 Jquery 向 spring mvc 应用程序发送 POST 请求

java - 如何将 POJO 插入到键值数据库表中?

windows - 为 XNA 游戏实现基于 XML 的简单脚本语言

javacc本地忽略大小写?

java - 如何根据 JavaCC 中的解析异常创建特定的错误消息

ruby - 哪个是 ANTLR 在 ruby​​ 中创建解析器的最佳对应物?

java - 绘制半透明矩形

java - 如何使用 HTML 中的嵌入 Java 应用程序访问本地文件系统