2012-11-17 43 views
3

我一直在尋找這個,但在MSDN forums上有這個問題的很多不同的答案。C#被認爲是一種上下文無關語言嗎?

有人說「所有的計算機語言文法上下文」和其他人說,有空格敏感語法的語言可能是上下文敏感的,因此不是上下文無關(F#和Python) 。

應該不錯確定的答案也許一些證明。

+0

字面上來自維基百科:每個上下文無關語言都是上下文敏感的。它來自文章「上下文敏感語言」,「上下文敏感語言的屬性」部分。這裏發生了什麼? – 11684

+0

@ 11684,是的,這就是[Chomsky層次結構](http://en.wikipedia.org/wiki/Chomsky_hierarchy)...所有上下文無關的語言都是上下文相關的,但反之亦然;) –

+0

那麼那種回答你的問題,不是嗎?C#是一種上下文無關的語言,因此也是上下文敏感的。 – 11684

回答

6

我將C#描述爲具有上下文無關語法,但是該語言具有不在語法中表達的上下文敏感規則。

維基百科(Formal grammar):

甲上下文無關文法是一語法,其中每個生產規則的左手側僅由單個非終結符的。

從C#4.0規範,第2.2.1節(語法表示法):

詞法和句法語法使用語法產生呈現。每個語法產品定義了一個非終端符號以及該非終端符號可能擴展成非終端或終端符號的序列。

當我閱讀它時,這意味着定義C#語言的生產規則是上下文無關的。每條生產規則的左側是一個非終端符號。相比之下,上下文敏感語法在生產規則的左側可能有多個終端和非終端符號。

然而,規範中有許多規則是上下文敏感的。例如,「必須在獲取其值的每個位置明確賦予局部變量(第5.3節)。」另外,「方法的簽名在聲明該方法的類中必須是唯一的。」這些都是任何特定片段的有效性取決於其出現的上下文的情況。

當然,許多編程語言都有類似的要求,包括C.我懷疑大多數人會認爲C是一種上下文敏感語言。我認爲this答案總結得很好:

句法正確的程序集幾乎所有語言都是上下文無關的。幾乎所有語言都編譯的程序集不是上下文的。

至於Python和F#,正如我在我的評論中所說的那樣,這些語言通常被描述爲具有語義(或有時是語法)空白而不是上下文敏感。

+0

謝謝,答案也清除了我對語義空白的疑問:D –