JavaCC语法冲突

时间:2012-06-05 05:15:19

标签: parsing parser-generator javacc

我的语法定义大致相同。

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;?我尝试了各种组合。

1 个答案:

答案 0 :(得分:1)

JavaCC FAQ的相关部分标题为&#34; How do I deal with keywords that aren't reserved?&#34;。

我要做的是将关键字替换为标识符,即

(<T_STRING> | <T_INT>) "();"

当关键字很多时,创建一个允许所有关键字的Identifier制作以及通用标识符令牌可能会有所帮助。

顺便说一下,您可能需要"(" ")" ";"而不是"();"