当lookahead遇到文件末尾时,JavaCC出现了Lexical错误

时间:2017-04-13 19:56:52

标签: javacc lookahead

为什么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()
}

错误不会发生。但是,导致这个错误的原因是什么?

2 个答案:

答案 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()",完全消除问题。