我正在使用 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">
CONSTANT
,由于其顺序,优先级高于INTEGER
。但是,在语法的某些部分我需要一个INTEGER
,特别是。在这些情况下,解析器会抛出异常,因为INTEGER
被解析为CONSTANT
.
一个简单的解决方案是消除CONSTANT
令牌并将其查找并替换为 (< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >)
. 不过,这感觉相当笨拙。
有没有办法将CONSTANT
其他标记简单地定义为一组,这样它CONSTANT
本身就不是一个标记,而是 的简写(< INTEGER > | < FLOAT_NUMBER > | < BOOLEAN >)
?
感谢您的时间。