我只是在用我自己的语言搞乱JavaCC,并且无法弄清楚为什么我在下面的代码中不断出现选择冲突错误,
void term() :
{}
{
factor()
( //choice conflict here
(< PLUS > | < MINUS >) factor()
)*
}
void id() :
{}
{
< LETTERS >
( //choice conflict here
< LETTERS > | < NUMBERS >
)*
}
字母和数字只是“A” - “Z”,“a” - “z”和“0” - “9”。如果有人可能会帮助,我们将非常感激。
答案 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的东西可以以字母或数字开头。
可能在你的语言中,有两个表达式可能在行中。