📜  悬空其他歧义

📅  最后修改于: 2022-05-13 01:57:02.261000             🧑  作者: Mango

悬空其他歧义

编译器和解释器使用语法来构建数据结构以处理程序。所以理想情况下,一个程序应该有一个派生树。解析树或派生树是一种图形表示,它显示了语法的字符串是如何使用产生式规则派生的。但是存在一些模棱两可的字符串。

如果输入字符串存在多个最左推导或多个最右推导或多个分析树,则称该文法不明确。模棱两可的语法或字符串可以有多种含义。歧义通常被视为语法错误,在编程语言中,这大多是无意的。

悬空其他歧义

句法歧义中的悬空 else 问题。当我们使用嵌套 if时会发生这种情况。当有多个“if”语句时, “else”部分并不清楚它应该与哪个“ if ”组合。

例如:

if (condition) {
}
if (condition 1) {
}
 if (condition 2) {
}
   else
   {
       }

在上面的例子中,有多个带有多个条件的“ ifs” ,在这里我们想要将最外面的 if 与 else 部分配对。但是 else 部分并没有清楚地看到它应该与哪个“ if”条件配对。这会导致编程中出现不适当的结果。

Dangling-else 的问题:

悬空 else 会导致严重的问题。它可能导致编译器的错误解释并最终导致错误的结果。

例如:

Initialize k=0 and o=0
if(ch>=3) 
if(ch<=10) 
k++;
else
o++;

在这种情况下,我们不知道变量“ o ”何时会递增。第一个“ if ”条件可能无法满足,或者第二个“ if ”条件可能无法满足。即使第一个“ if ”条件得到满足,第二个“ if”条件也可能失败,这可能导致“ else”部分的执行。因此,它会导致错误的结果。

为了解决这个问题,C、C++、 Java等编程语言将“ else”部分与最里面的“ if”语句结合在一起。但有时我们希望最外面的“ if”语句与“ else”部分结合起来。

解决悬空问题

第一种方法是设计明确的编程语言。

其次,我们可以通过使用大括号和缩进来解决编程语言中的 dangling-else 问题。

例如:

if (condition) {
     if (condition 1) {
          if (condition 2) {}
}
}
 else {
 }

在上面的示例中,我们使用了大括号和缩进以避免混淆。

第三,我们还可以使用“if-else if-else”的格式,来具体指明哪个“ else”属于哪个“ if”

例如

if(condition) {
}
else if(condition-1) {
}
else if(condition-2){
}
else{
}