为什么JavaCC总是在终端上出现错误?就像这个例子一样,
options{
LOOKAHEAD = 2;
}
PARSER_BEGIN(GS)
public class GS{
public static void main(String args[]) throws ParseException {
GS parser = new GS(System.in);
parser.q0();
}
}
PARSER_END(GS)
void q0():
{}
{
"a" q1() |
"c"
}
void q1():
{}
{
"b" q0()
| "b"
}
在q1()上有2个选项,一个是阅读" b"并移至q0,或阅读" b"并结束阅读。但是如果我给出一个输入" ab"即使它具有前瞻选项,它也会出错。但如果我给#34;(ab)* c",JavaCC接受它就好了。
Exception in thread "main" TokenMgrError: Lexical error at line 1, column 3. Encountered: "\r" (13), after : ""
当生产规则为
时,总会发生同样的错误{
"terminal_x" non-terminal()
| "terminal_x"
}
有没有办法制作这种制作规则而不会出错?
我正在使用JavaCC ver。 6.0_1。
感谢。
编辑:
显然,如果制作规则的格式为
{
"terminal_x"
| "terminal_x" non-terminal()
}
错误不会发生。但是,导致这个错误的原因是什么?
答案 0 :(得分:1)
问题是您的输入字符串包含词法分析器不期望的返回字符。它与lookhahead无关;前瞻与解析有关,而不是lexing。我建议制定类似这样的规则。
<input type="text" name="SearchTerm" class="form-control"/>
答案 1 :(得分:0)
您建议的示例规则:
{
"terminal_x"
| "terminal_x" non-terminal()
}
实际上是说&#34;必须有"terminal_x"
后跟0或non-terminal()
&#34;。通过使用?
运算符(零或一),可以更轻松地完成此操作:
{
"terminal_x" (non-terminal())?
}
这样就不需要前瞻,因为它总是会查找"terminal_x"
,然后允许零或一"non-terminal()"
,完全消除问题。