问题标签 [dangling-else]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
995 浏览

antlr - ANTLR中树表示的if语句

我有以下正确解析的 if 语句:

现在,我想将其解析为 AST。我是这样做的:

添加!and ^,因为->构建指令似乎不起作用。

我的结果是一个有 3 个孩子的 AST:1 是条件,2 和 3 是语句块。else 部分是可选的:如果没有 else,则缺少节点 3。

问题是语句块总是空的。如何解决?

0 投票
1 回答
2186 浏览

compiler-construction - 用于悬空 else 的 LL(1) 语法

在编译器构造中,主要的歧义问题之一是悬空 else。正如 Aho、Lam、Sethi 和 Ullman 在编译器:原理、技术和工具一书中所提到的,悬空 else 的语法不能与 LL(1) 解析器一起使用。

真的不能处理为LL(1)吗?

0 投票
0 回答
904 浏览

parsing - LL1 和悬空 else 的明确语法

我正在尝试使用用于扫描仪的 Flex 和一个名为 PGen 的特殊工具来定义语法来编写一个简单的编译器。

现在,我正在尝试解决悬而未决的明确语法问题。我已经搜索过了。

这是一个带有悬空 else 问题的语法:

这是解决此问题的语法(通过Berkeley 的幻灯片):

但是这个语法仍然不是 LL1 并且仍然是模棱两可的。

当我试图解决这种歧义并将其设为 LL1 时,我再次面临悬而未决的 else 问题。

谁能帮我找到一个明确的 LL1 嵌套 if 语法?

在 Stack Overflow 上的问答中读到此语法不能成为 LL1。但我无法意识到如何解决这种歧义。

0 投票
0 回答
506 浏览

parsing - Lex 和 Yacc 的悬空 else 语法

我正在编写一个小型解析器来识别 Java 的一个子集,我遇到了一个我认为称为悬空 else 问题的问题。

我匹配 if-else 语句的语法是这样开始的:

但是我收到了 shift/reduce 错误,并且想要修复这些错误,而不仅仅是像大多数人推荐的那样让它们静音。

我已经将我的语法修改为这个语法,它消除了 shift/reduce 错误,但现在,它没有正确解析 else 语句。

我已经坚持了好几天了,无法解决如何解决它。

这是它应该解析的示例:

0 投票
1 回答
255 浏览

parsing - 如何解决 Coco/R 中的悬空问题?

我在 Coco/R 中有一个悬空的问题。我尝试了解Coco/R 用户手册并询问 Google,但我无法自己解决问题。

我将问题简化为以下 Coco/R 语法(保存在 中new4.atg):

当我想用 构建编译器时coco.bat,我得到了这个答案:

在Google的最佳结果中,我读到我可以声明IF(isXXXFollowYYY())声明,但我不知道它如何以及是否是最佳解决方案。(在我的例子中:Expr = Test | If(isTestFollowID)Id Test。但是在哪里isTestFollowID声明?)

当我开始时,我不想收到任何警告coco.bat

0 投票
2 回答
899 浏览

ambiguous - 去除 LL(1) 语法中悬空 Else 引起的歧义

在编译器设计的悬空 else 问题的情况下,是否有理由在消除歧义之前将其保留?

我们正在将 CFG 转换为 LL(1) 语法,因此我的教授要求我们首先消除递归,然后消除左因子,然后消除语法中的歧义。但是,根据我的阅读,通常首先消除歧义。我不确定如何在左分解后消除歧义。

这就是我在左分解后得到的结果:

但是,据我了解,消除歧义需要重写语法,因此语法总是会产生类似的结果,对吧?

还是有其他方法可以做到这一点?据我所知,这是从悬空的 else 中消除歧义的唯一方法。

0 投票
1 回答
212 浏览

kotlin - 在 Kotlin 中悬挂其他

我有这个疑问,伙计们,我不知道;任何要理解的例子都会很棒。Kotlin 编程语言是否存在“悬空的 else”问题?如果存在问题,那么在这种情况下的原因是什么?

0 投票
2 回答
80 浏览

c - 悬空 else 查询(或阅读错误代码的练习)

我正在阅读的书(C How to Program with an into to C++ Global Edition,Deitel&Dietel,2016)提供了以下代码:请注意,这本书是在练习部分中呈现代码的方式,故意没有大括号和缩进。我会假设教你使用正确的缩进使阅读代码更容易。

输出是

这本书指出编译器总是将一个 else 与前一个 if 关联起来,除非通过放置大括号来告诉它这样做,所以通过那个逻辑,else 与之相关联

这是真的,否则不应该执行,给出的输出

并不是

所以我的问题是为什么这条线

在输出中?

0 投票
1 回答
104 浏览

c - c 中的 dangling-else 问题到底是什么?

代码怎么能这样工作?哪些 if-else 语句相互关联?那么为什么输出是这样的“$$$$$”?

0 投票
1 回答
175 浏览

compiler-construction - 在没有关联性声明的情况下解决 Bison 中的悬空 if、elsif 和 else

我正在为具有 if-elsif-else 语句并且似乎无法使我的语法明确的语言实现解析器。我们的编译器类获得了一份关于使用匹配/不匹配方法解决 if-else 语句的悬空 else 问题的讲义,如下所示:

为我们的语言提供的语法文档被定义为具有涉及 if - elsif- else 的产生式,其中:

其中小写字母是产生式,大写字母是终结符。

这些提供的产生式是模棱两可的,必须在野牛的语法实现中解决。这是我在将其实际实施到 Bison 中所取得的进展:

关于更改语法以适应 elsif 产生式的任何建议,类似于使用匹配和不匹配的语句来解决悬空的 if-else 问题并摆脱任何移位/减少和减少/减少错误?

编辑 1:我在更简单的语法版本上取得了更多进展,以确保 elsifLists 只能遵循匹配的语句:

但我仍然遇到转移/减少冲突:

编辑 2:我在简单语法方面取得了足够的进展,以确保 elsif 语句之前有匹配的语句。生成的语法是:

我已经更新了实际语言的解析器的实际语法,以确保不匹配的语句不能跟在 elsifList 之后,并且 elsifLists 只能跟在匹配的语句之后:

不过,由此产生的语法仍然给我 2 次移位/减少冲突: