parsing - 有没有办法强制 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;
}
我期望解析器工作但不正确。不应该是这样吗?如果预期会出现此错误,即使使用这种模棱两可的语法,有没有办法让它工作?
注意:我还不想使用前瞻,我的目标是稍后我将解释它如何解决问题时使用它。
解决方案
现在 JavaCC 对此没有任何问题。它会生成正确反映 .jj 文件的警告和 .java 代码。问题是您的 Java 编译器不喜欢无法访问的代码。
你能做的就是这个
void s() :
{}
{
"a" ( LOOKAHEAD({true}) // TODO fix the lookahead
bc()
|
bd() )
<EOF>
}
推荐阅读
- javascript - 使用 GeoFire 获取到多个点的最近点
- python - 遍历python代码中的特定字符串
- c# - 容器化后是否可以修改 C# Web 应用程序?
- graph - SAS 中任何图形输出的问题
- jquery - WordPress 管理中的 AJAX 响应为空,但浏览器响应不为空
- google-bigquery - 根据 Big Query 数据库中的更改在 DataStudio/Tableau 中自动创建仪表板/报告
- nginx - WSO2 API 管理器版本 4.0.0-1 Kubernetes 版本 1.19 上的 Helm 安装问题,它是为低于 VERS1.2 的 K8S 版本制作的
- android - Android:从图像捕获中获取旧图像数据
- google-visualization - 谷歌图表未在轴上显示垂直线
- html - 网页内容随不同字体变化