C++是上下文无关还是上下文相关的?

14 浏览
0 Comments

C++是上下文无关还是上下文相关的?

我经常听到关于C++是一种上下文敏感语言的说法。拿下面的例子来说:\n

a b(c);

\n这是一个变量定义还是一个函数声明?这取决于符号c的含义。如果c是一个变量,那么a b(c);定义了一个名为b、类型为a的变量。它直接用c进行初始化。但是如果c是一个类型,那么a b(c);声明了一个名为b、接受一个c并返回一个a的函数。\n如果你查阅上下文无关语言的定义,基本上会告诉你所有语法规则的左侧必须只包含一个非终结符号。而上下文敏感语法则允许左侧包含任意终结符号和非终结符号的字符串。\n浏览《C++程序设计语言》附录A时,我发现没有一个语法规则的左侧除了一个单一的非终结符号外还有其他东西。这意味着C++是上下文无关的。(当然,每个上下文无关语言在某种意义上也是上下文敏感的,因为上下文无关语言是上下文敏感语言的一个子集,但这不是重点。)\n所以,C++是上下文无关的还是上下文敏感的?

0
0 Comments

C++是一种上下文有关的语言,这意味着在解析代码时,需要考虑代码的上下文信息。这个问题的出现是因为C++中的操作顺序会根据类型解析的上下文而有所不同。在上述代码中,根据不同的类型解析上下文,表达式的运算顺序也会有所不同。

解决这个问题的方法之一是将编译器的任务分为独立的步骤,比如先创建一个解析树,然后进行类型分析。但是C++要求我们要么将这些步骤合并为一步,要么根据所有可能的解析方式解析代码,并允许类型解析阶段将其缩小到正确的解析方式。

对于C语言,我们可以通过记住哪些类型定义在作用域内的方式来解决类似的问题。但是对于C++来说,这种方法行不通。因此,C++相比C语言更难解决这个问题。

有一篇与此问题相关的博士论文可以更好地解释为什么C++比C语言更难处理这个问题。你可以在这里找到这篇论文的链接:[stackoverflow.com/a/243447/53974](http://stackoverflow.com/a/243447/53974)

0
0 Comments

C++是一种编程语言,其语法在C++标准中被定义为上下文无关(context-free)的。然而,这个语法并不能准确地描述C++语言,因为它会产生非C++的程序。在C++中,要求变量必须声明,这使得C++语言不再是上下文无关的,而是上下文敏感(context-sensitive)的。此外,C++模板的存在使得程序的合法性可以基于其结果来判断,因此C++语言甚至不是上下文敏感的。

有些人通常使用“不是上下文无关的”这个术语时,它们的意思可能是以下几种情况:

- 不是二义性的

- 不能使用Bison解析

- 不是LL(k)、LR(k)、LALR(k)或其他某种特定的解析器定义的语言类

C++标准中的语法不满足这些条件(即存在二义性,不满足LL(k)等),所以对于这些人来说,C++语法是“不是上下文无关的”。从某种意义上说,他们是对的,因为编写一个有效的C++解析器确实非常困难。

需要注意的是,这些属性与上下文无关语言只有弱关联。二义性与上下文敏感性无关(事实上,上下文敏感的规则通常有助于消除二义性),而其他两个属性只是上下文无关语言的子集。解析上下文无关语言并不是一个线性过程(尽管解析确定性上下文无关语言是线性的)。

根据以上讨论,我们可以得出结论:C++语言既不是上下文无关的,也不是上下文敏感的。它是一种上下文敏感的语言,但不是上下文敏感的上下文无关的语言。

0
0 Comments

C++语言是一种非常复杂的编程语言,其语法规则非常复杂。所以有人提出了一个问题:C++是上下文无关的还是上下文敏感的?下面的讨论将回答这个问题并解释原因。

C++语法非常复杂,可能会导致语法分析的困难。一种方法是将C++语言的语法定义为上下文无关文法(CFG),这是一种常用的语法形式。但是,许多人认为C++的语法规则超出了上下文无关文法的能力。他们认为C++是上下文敏感的,需要更强大的语法形式来描述。

上下文敏感的文法(CSG)比上下文无关的文法要强大。在CSG中,一个产生式的左边可以有多个符号,但是右边的产生式必须有相同的上下文。这使得CSG能够描述更复杂的语言特性。

然而,将C++语法定义为上下文敏感的文法是不实际的。这是因为C++语法非常复杂,编写一个能够识别它的CSG几乎是不可能的任务。为了解决这个问题,C++标准并没有尝试提供完整的正式语法定义,而是使用了一些技术性的英文规则来描述语法。

此外,C++语言规范中的某些表达式的歧义性问题并不是一个真正的问题。歧义性是特定文法的一个特征,而不是一种语言本身的特征。即使一个语言没有明确的无歧义文法,只要它可以被一个上下文无关的文法识别,它就是上下文无关的。同样的,如果一个语言不能被上下文无关的文法识别,但是可以被上下文敏感的文法识别,那么它就是上下文敏感的。这里的歧义性并不重要。

总之,C++语言可以被计算机解析,所以它肯定可以被图灵机解析。因此,一个上下文无限制的文法可以识别它。但是,编写这样的文法是不切实际的,这就是为什么C++标准没有尝试这样做的原因。C++语言规范中的一些规则使用了技术英文来描述,而不是提供完整的正式文法定义。因此,C++既不是上下文无关的,也不是上下文敏感的。

所以,C++是一种非常复杂的语言,其语法规则超出了上下文无关文法的能力。尽管C++可以被上下文敏感的文法识别,但编写这样的文法是不实际的。因此,C++的语法定义在C++标准中使用了一些技术性的英文规则来描述。

0