JavaCC选择冲突错误

时间:2013-12-08 21:49:09

标签: compiler-construction javacc

我只是在用我自己的语言搞乱JavaCC,并且无法弄清楚为什么我在下面的代码中不断出现选择冲突错误,

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


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

字母和数字只是“A” - “Z”,“a” - “z”和“0” - “9”。如果有人可能会帮助,我们将非常感激。

2 个答案:

答案 0 :(得分:1)

你的语法隐藏部分一定有问题。我使用了你的作品并构建了这个简单的工作语法文件(JavaCC 5)。 顺便说一句,你不应该使用产品( 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> )*
}

答案 1 :(得分:0)

可以遵循一个术语的东西可以以加号或减号开头。因此,解析器无法根据下一个标记来决定是(重新)进入循环还是停止解析该术语并继续进行其他操作。

id存在类似问题。可以跟随id的东西可以以字母或数字开头。

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