C#被认为是无上下文的语言吗?

时间:2012-11-17 08:26:29

标签: c# compilation context-free-grammar

我一直在寻找这个,但MSDN forums上对这个问题有很多不同的答案。

有些人说“所有计算机语言语法都是无上下文的”而其他人说任何具有空格敏感语法的语言都可能是上下文敏感的,因此不具备上下文(F#和Python)。

很好明确的答案,也许还有一些证据。

1 个答案:

答案 0 :(得分:6)

我会将C#描述为具有无上下文语法,但该语言具有上下文敏感的规则,这些规则不会在语法中表达。

来自维基百科(Formal grammar):

  

无上下文语法是一种语法,其中每个生产规则的左侧只包含一个非终结符号。

从C#4.0规范,第2.2.1节(语法表示法):

  

词法和句法语法使用语法产生。每个语法产生定义一个非终端符号以及该非终端符号可能扩展为非终端符号或终端符号的序列。

在我阅读时,这意味着定义C#语言的生产规则是无上下文的。每个生产规则的左侧是单个非终端符号。相比之下,上下文敏感语法可能在生产规则的左侧有多个终端和非终端符号。

然而,规范中有许多规则是上下文敏感的。例如,“必须在获得其值的每个位置明确赋予局部变量(第5.3节)。”此外,“方法的签名在声明方法的类中必须是唯一的。”这些都是任何特定片段的有效性取决于它出现的上下文的情况。

当然,许多编程语言都有类似的要求,包括C.我怀疑大多数人会认为C是一种上下文敏感的语言。我认为this回答总结得很好:

  

语法正确的程序集几乎对所有语言都没有上下文。对于几乎所有语言,编译的程序集不是上下文的。

至于Python和F#,正如我在评论中所说,这些语言通常被描述为具有语义(或有时是句法)空白,而不是上下文敏感。