首页 > 解决方案 > 有没有办法强制 JavaCC 接受模棱两可的非 LL(1) 语法?

问题描述

我正在尝试在 JavaCC 中创建一个教学解析器来解释我的作业中使用前瞻。我正在考虑在 porpose 上创建一个模棱两可的语法来显示解析器在这种情况下的行为。我的语法如下:

void s() : 
{}
{
    "a" ( bc() | bd() ) <EOF>   
}

void bc() :
{}
{
    "b" "c"
}

void bd() :
{}
{
    "b" "d"
}

阅读有关前瞻的JavaCC 教程后,我了解到,在创建解析器时,将显示有关使用前瞻的警告(好的),如果忽略,解析器仍然可以工作,但始终选择第一个选项。我认为是最后一部分,因为教程说“生成的解析器仍将使用默认的前瞻算法工作,但它可能无法达到您的预期。”

但是,当我尝试创建解析器时,会显示此错误:

$ javac *.java
ExampleABCD.java:18: error: unreachable statement
        }{
         ^
1 error

原因是:

case 6:{
        bc();
        break;
        }{        //Here
        bd();
        break;
        }

我期望解析器工作但不正确。不应该是这样吗?如果预期会出现此错误,即使使用这种模棱两可的语法,有没有办法让它工作?

注意:我还不想使用前瞻,我的目标是稍后我将解释它如何解决问题时使用它。

标签: parsingcompiler-errorscompiler-constructioncompiler-warningsjavacc

解决方案


现在 JavaCC 对此没有任何问题。它会生成正确反映 .jj 文件的警告和 .java 代码。问题是您的 Java 编译器不喜欢无法访问的代码。

请参阅有没有办法忽略“无法访问的语句”错误?

你能做的就是这个

void s() : 
{}
{
    "a" ( LOOKAHEAD({true})  // TODO fix the lookahead
          bc()
        | 
          bd() )
    <EOF>   
}

推荐阅读