我正在使用 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/