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

C#被认为是上下文无关的语言吗?,c#,compilation,context-free-grammar,C#,Compilation,Context Free Grammar,我一直在寻找这个问题,但是网上有很多不同的答案 有人说“所有的计算机语言语法都是上下文无关的”,还有人说任何具有空格敏感语法的语言都可能是上下文敏感的,因此不是上下文无关的(F#和Python) 最好是一个明确的答案,也许还有一些证据。我会把C描述成一个上下文无关的语法,但是这种语言有上下文敏感的规则,而这些规则在语法中没有表达出来 来自维基百科(): 上下文无关语法是一种语法,其中每个产生式规则的左侧仅由一个非终结符符号组成 根据C#4.0规范第2.2.1节(语法符号): 词汇语法和句法语法是

我一直在寻找这个问题,但是网上有很多不同的答案

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

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

我会把C描述成一个上下文无关的语法,但是这种语言有上下文敏感的规则,而这些规则在语法中没有表达出来

来自维基百科():

上下文无关语法是一种语法,其中每个产生式规则的左侧仅由一个非终结符符号组成

根据C#4.0规范第2.2.1节(语法符号):

词汇语法和句法语法是使用语法结果来表示的。每个语法产品定义一个非终端符号以及该非终端符号可能扩展为非终端或终端符号序列

在我看来,这意味着定义C语言的产生式规则是上下文无关的。每个产生式规则的左侧是一个非终结符符号。相比之下,上下文敏感语法在产生式规则的左侧可能有多个终端和非终端符号

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

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

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


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

从维基百科字面上看:每种上下文无关的语言都是区分上下文的。它来自“上下文敏感语言”一文“上下文敏感语言的属性”一节。这是怎么回事?@11684,是的,这是。。。所有上下文无关语言都是上下文敏感的,但反之亦然;)那么这就回答了你的问题,不是吗?C#是一种与上下文无关的语言,因此也是上下文敏感的。这些语言(F#和python)通常被描述为具有语义空白,而不是上下文敏感的(从语法的技术意义上)。完整的python语法在这里,似乎是一个BNF:@11684:No,如果C#是contet-free,那么这不是答案,为什么。我不是在问上下文无关语言是否是上下文敏感的汉克,答案也消除了我对语义空白的疑问:D