1

我有一个大致这样定义的语法。

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() 解析时,它会改为声明。我该如何解决这个“冲突”?我尝试了各种组合。

4

1 回答 1

1

JavaCC 常见问题解答部分的标题为“如何处理未保留的关键字?”。

我要做的是允许关键字替代标识符,即

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

当有许多关键字时,创建一个Identifier允许所有关键字以及通用标识符令牌的产品可能是有益的。

顺便说一句,您可能想要"(" ")" ";"而不是"();".

于 2012-06-05T08:45:50.793 回答