【问题标题】:JavaCC grammar conflictJavaCC 语法冲突
【发布时间】:2012-06-05 05:15:18
【问题描述】:

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

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

【问题讨论】:

    标签: parsing parser-generator javacc


    【解决方案1】:

    JavaCC 常见问题解答部分的标题为“How do I deal with keywords that aren't reserved?”。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多