編譯原理 什麼是上下文無關文法?

2021-10-25 16:47:10 字數 755 閱讀 9411

上下文無關是指,一句話的含義與其前後的內容沒有或者幾乎沒有關係,只由自己決定,把它剪下到其他任何位置,也還是原有的意思。

例如:

...

a =0;.

..

這是乙個賦值語句,無論此語句的前後是什麼**,此語句所代表的操作是確定的。即:

給變數a賦予值0

換句話說,cpu遇到什麼語句就執行什麼語句,不用管其他的。

程式語言為什麼不用人類的語言(自然語言),而是用上下文無關的文法呢?

因為便於設計編譯器。

試想一下,如果可以用自然語言寫**,那不就是實現了人工智慧了嗎?客觀上技術目前無法實現。

便於**開發維護。

如果開發出來的**像高考的語文閱讀理解一樣,每個人都有不同的理解,那麼,到底哪個才是作者真正想要表達的?如果人類都確定不了含義,那計算機同樣也確定不了,最終結果就是錯誤執行或無法執行。

組合語言/機器語言是上下文無關的。cpu執行指令時,讀到哪條執行哪條。如果cpu需要考慮上下文,來決定乙個語句到底要做什麼,那麼cpu執行一條語句會比現在慢千倍萬倍。考慮上下文的事情,完全可以使用者在程式設計的時候用演算法實現。既然機器語言是上下文無關的,那高階語言也基本上是上下文無關的,可能有某些個別語法為了方便使用,設計成了上下文相關的,比如指令碼語言的弱型別。在便於使用的同時,增加了解析器的複雜度。

綜上:程式語言基本上都採用上下文無關的原則設計語法。

附:上下文無關文法—維基百科

編譯原理 上下文無關文法

學完了詞法分析,我們知道詞法分析器將正規表示式轉換成詞法單元流,但對於這個記號流我們不知道是否能由正確的文法產生,因此我們需要通過語法分析器來檢測其合法性。語法分析器的輸出是一棵語法分析樹 無論顯性還是隱性 並且進行一些語法糾錯處理。語法分析的整個過程大概就是我們先定義乙個語法,再用相應的演算法來檢...

到底什麼是上下文無關文法?

在龍書compilers principles,techniques,tools英文版第2版42頁中,提到上下文無關文法有以下的特點 乙個終結符的有限集 a set of terminal symbols 構成文法的最基本的字元就是這個文法的終結符,例如乙個能夠產生個位數的文法規則digit 0 1...

上下文無關文法

1 上下文無關文法又稱cfg。許多cfg由幾個較簡單的cfg合併起來。可以先構造每個部分的cfg,比如 s1,s2,s3.sk。然後加入新的規則s s1 s2 sk 2 例如 構造語言 的cfg,1 構造 s1 0 s1 1 2 s2 1 s2 0 3 整合 s s1 s2 3 如果語言是正則的,可...