Java 定义;“团体”;代币

Java 定义;“团体”;代币,java,parsing,javacc,Java,Parsing,Javacc,我正在使用JavaCC为一种简单语言编写解析器 在我的令牌声明部分,我有类似的内容 < CONSTANT: < INTEGER > | < FLOAT_NUMBER > | < BOOLEAN > > < INTEGER: "0" | ("-")? ["1"-"9"](["0"-"9"])* | "0x" (["0"-"9"] | ["a"-"f"] | ["A"-"F"])+ > < FLOAT_NUMBER: ("-")?

我正在使用JavaCC为一种简单语言编写解析器

在我的令牌声明部分,我有类似的内容

< 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">
||>

<浮点数:(“-”)?([“0”-“9”])+”([“0”-“9”])+((“E”(“-”)([“0”-“9”])+)?(“D”)?>

常量
,由于其顺序,其优先级高于
整数
。然而,语法的某些部分需要一个
整数
。在这些情况下,解析器抛出异常,因为
整数
被解析为
常量

一个简单的解决方案是消除
常量
标记,找到并替换
||
。不过,这感觉相当笨拙

有没有办法将
常量
简单地定义为一组其他标记,这样
常量
本身就不是一个标记,而是
)的简写形式


谢谢您的时间。

我认为这里的简单答案是您不应该在标记器中这样做

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

Token parseConstant() :
{
    Token t;    
}

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

}
Token parseConstant():
{
令牌t;
}
{
(
t=| t=| t=
)
{
返回t;
}
}