有没有办法强制 JavaCC 接受不明确的非 LL(1) 语法?
Is there a way to force JavaCC to accept ambiguous non-LL(1) grammar?
我正在尝试在 JavaCC 中创建一个教学分析器来解释我的家庭作业中前瞻的使用。我正在考虑在 porpose 上创建一个有歧义的语法来显示解析器在这种情况下的行为。我的语法如下:
void s() :
{}
{
"a" ( bc() | bd() ) <EOF>
}
void bc() :
{}
{
"b" "c"
}
void bd() :
{}
{
"b" "d"
}
阅读关于前瞻的 JavaCC Tutorials 我了解到,在创建解析器时,将显示有关使用前瞻的警告(好的),如果忽略,解析器仍将工作,但始终选择第一个选项。我认为最后一部分是因为教程说 "The generated parser will still work using the default lookahead algorithm, but it may not do what you expect of it."
但是,当我尝试创建解析器时显示此错误:
$ javac *.java
ExampleABCD.java:18: error: unreachable statement
}{
^
1 error
原因是:
case 6:{
bc();
break;
}{ //Here
bd();
break;
}
我希望解析器能正常工作,但没有正常工作。不应该是这样吗?如果这个错误是预料之中的,有没有办法让它在这种有歧义的语法下也能正常工作?
注意:我还不想使用 lookahead,我的目标是稍后在解释它如何解决问题时使用它。
现在 JavaCC 对此没有问题。它会生成正确反映 .jj 文件的警告和 .java 代码。问题是您的 Java 编译器不喜欢无法访问的代码。
见Is there a way to ignore the 'Unreachable statement' error?
你能做的就是这个
void s() :
{}
{
"a" ( LOOKAHEAD({true}) // TODO fix the lookahead
bc()
|
bd() )
<EOF>
}
我正在尝试在 JavaCC 中创建一个教学分析器来解释我的家庭作业中前瞻的使用。我正在考虑在 porpose 上创建一个有歧义的语法来显示解析器在这种情况下的行为。我的语法如下:
void s() :
{}
{
"a" ( bc() | bd() ) <EOF>
}
void bc() :
{}
{
"b" "c"
}
void bd() :
{}
{
"b" "d"
}
阅读关于前瞻的 JavaCC Tutorials 我了解到,在创建解析器时,将显示有关使用前瞻的警告(好的),如果忽略,解析器仍将工作,但始终选择第一个选项。我认为最后一部分是因为教程说 "The generated parser will still work using the default lookahead algorithm, but it may not do what you expect of it."
但是,当我尝试创建解析器时显示此错误:
$ javac *.java
ExampleABCD.java:18: error: unreachable statement
}{
^
1 error
原因是:
case 6:{
bc();
break;
}{ //Here
bd();
break;
}
我希望解析器能正常工作,但没有正常工作。不应该是这样吗?如果这个错误是预料之中的,有没有办法让它在这种有歧义的语法下也能正常工作?
注意:我还不想使用 lookahead,我的目标是稍后在解释它如何解决问题时使用它。
现在 JavaCC 对此没有问题。它会生成正确反映 .jj 文件的警告和 .java 代码。问题是您的 Java 编译器不喜欢无法访问的代码。
见Is there a way to ignore the 'Unreachable statement' error?
你能做的就是这个
void s() :
{}
{
"a" ( LOOKAHEAD({true}) // TODO fix the lookahead
bc()
|
bd() )
<EOF>
}