我只是在为自己的语言使用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后面的东西可以以字母或数字开头。
在你的语言中,可能有两个表达式排成一行。