我正在使用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 >)
的简写?
感谢您的时间。
答案 0 :(得分:2)
我认为这里的简单答案是你不应该在tokenizer中这样做。
最好将其纳入生产规则,例如:
Token parseConstant() :
{
Token t;
}
{
(
t = < INTEGER > | t = < FLOAT_NUMBER > | t = < BOOLEAN >
)
{
return t;
}
}