JavaCC在先行查找遇到文件结尾时出现词法错误

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();

为什么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();
        }
    }
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令牌进行词法分析。