JavaCC选项冲突错误



我只是在为自己的语言使用JavaCC,很难弄清楚为什么我在下面的代码中不断出现选择冲突错误,

void term() :
{}
{
  factor()
  ( //choice conflict here
    (< PLUS > | < MINUS >) factor()
  )*
}

void id() :
{}
{
  < LETTERS >
  ( //choice conflict here
    < LETTERS > | < NUMBERS >
  )*
} 

字母和数字只是"A"-"Z"、"A"-"Z"one_answers"0"-"9"。如果有人能帮忙,我们将不胜感激。

语法的隐藏部分一定有问题。我使用了您的产品并构建了这个简单的工作语法文件(JavaCC5)。顺便说一下,您不应该使用production(id)来接受标识符。相反,你应该为你的语言的这个"单词"构建单独的标记,比如:

TOKEN:
{
    < SIMPLE_INTEGER: ( <NUMBERS> )+ >
    | < SIMPLE_IDENTIFIER: ( <LETTERS> )+ ( <NUMBERS> | <LETTERS>)* >
}

现在,您可以使用<SIMPLE_INTEGER>来接受整数,或者使用<SIMPLE_IDENTIFIER>来接受标识符来构建产品。

这是你的作品的工作语法文件。

options {
    STATIC = true;
}
PARSER_BEGIN(MyParser)
public class MyParser {
} 
PARSER_END(MyParser)
TOKEN : {
  <PLUS: "+">
| <MINUS: "-">
}
TOKEN: {
    <LETTERS: ["a"-"z", "A"-"Z"] >
|    <NUMBERS: ["0" - "9"] >
}
void factor() : {}
{
  (<NUMBERS>)+
}
void term() : {}
{
  factor() ( (<PLUS> | <MINUS>) factor() )*
}
void id() : {}
{
  <LETTERS> ( <LETTERS> | <NUMBERS> )*
}

术语后面的某些内容可以以加号或减号开头。因此,解析器不能根据下一个令牌来决定是(重新)进入循环,还是停止解析术语并继续进行其他事情。

id也有类似的问题。id后面的东西可以以字母或数字开头。

在你的语言中,可能有两个表达式排成一行。

最新更新