我的语法定义大致相同。
TOKEN:{
<T_INT: "int"> |
<T_STRING: ["a"-"z"](["a"-"z"])*>
}
SKIP: { " " | "\t" | "\n" | "\r" }
/** Main production. */
SimpleNode Start() : {}
{
(LOOKAHEAD(Declaration()) Declaration() | Function())
{ return jjtThis; }
}
void Declaration() #Decl: {}
{
<T_INT> <T_STRING> ";"
}
void Function() #Func: {}
{
<T_STRING> "();"
}
这适用于以下内容:
int a;
foo();
但是当我尝试int();
,这对我来说是合法的并且应该由Function()解析时,它代替了声明。我如何解决这个问题&#34;冲突&#34;?我尝试了各种组合。
答案 0 :(得分:1)
JavaCC FAQ的相关部分标题为&#34; How do I deal with keywords that aren't reserved?&#34;。
我要做的是将关键字替换为标识符,即
(<T_STRING> | <T_INT>) "();"
当关键字很多时,创建一个允许所有关键字的Identifier
制作以及通用标识符令牌可能会有所帮助。
顺便说一下,您可能需要"(" ")" ";"
而不是"();"
。