上下文無關是指,一句話的含義與其前後的內容沒有或者幾乎沒有關係,只由自己決定,把它剪下到其他任何位置,也還是原有的意思。
例如:
...
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 如果語言是正則的,可...