JavaCC在先行查找遇到文件结尾时出现词法错误
为什么JavaCC总是在带有lookahead的终端上给出错误?就像这个例子一样JavaCC在先行查找遇到文件结尾时出现词法错误,javacc,lookahead,Javacc,Lookahead,为什么JavaCC总是在带有lookahead的终端上给出错误?就像这个例子一样 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();
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()上有两个选项,一个是读取“b”并移动到q0,或者读取“b”并结束读取。但如果我给一个输入“ab”,它将给出一个错误,即使它有前瞻选项。但如果我给出“(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"
}
有没有办法在不给出错误的情况下建立这种产生式规则
我正在使用javaccver。6.0_1
谢谢
编辑:
显然,如果产生式规则是
{
"terminal_x"
| "terminal_x" non-terminal()
}
错误不会发生。但是,是什么原因导致了此错误?您建议的示例规则:
{
"terminal_x"
| "terminal_x" non-terminal()
}
实际上是说“必须有”终端
,后跟零或一个非终端()。使用?
运算符(零或一)可以更轻松地完成此操作,如下所示:
{
"terminal_x" (non-terminal())?
}
通过这种方式,无需先行查找,因为它将始终查找“terminal_x”
,然后允许零或一个“non-terminal()”
,从而完全消除了问题。问题在于输入字符串包含lexer不期望的返回字符。这与外表无关;前瞻与解析有关,而不是词法分析。我建议制定这样的规则
SKIP : { " " | "\t" | "\r" | "\n" }
是的,那张表格比较简单,但是错误仍然出现。我明白了,我的错。谢谢,这对我有用。虽然如果我直接从命令提示符输入,它会一直等待输入。有什么方法可以判断读取完成了吗?在UNIX或Mac上,使用cntl-d。在DOS或Windows上使用cntl-z。这将作为EOF令牌进行词法分析。