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

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

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

应该是一个明确的答案 ,也许是一些证据。

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

来自维基百科( 正式语法 ):

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

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

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

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

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

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

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

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