關於C編譯器詞法分析中的「貪心法」

2021-08-20 19:30:17 字數 767 閱讀 6875

我們都知道,c語言中有單字元符號和多字元符號之分,那麼,當c編譯器讀入乙個字元『/』後又跟了乙個字元『*』,那麼編譯器就必須做出判斷:是將其作為兩個分別的符號對待,還是合起來作為乙個符號對待。c語言對這個問題的解決方案可以歸納為乙個很簡單的規則:每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成乙個有意義的符號。這個處理策略有時被稱為「貪心法」。當然,這與演算法中的貪心法不同。k&r對這個方法的表述如下,「如果(編譯器的)輸入流截止至某個字元之前都已經被分解為乙個個符號,那麼下乙個符號將包括從該字元之後可能組成乙個符號的最長字串。」

y = x/*p    /* p指向除數 */ 

y = x / *p /* p指向除數 */

y = x/(*p) /* p指向除數 */

這三行**,本意都一樣,是用x除以p所指向的值,把所得的商再賦給y。而實際上,第一行**中,/*被編譯器理解為一段注釋的開始,編譯器將不斷地讀入字元,直到*/出現為止。也就是說,該語句直接將x的值賦給了y,根本不會顧及到後面出現的p。而相反,第

二、三行**則準確的表達了這個意思。在devc++中,這三條語句分別表現為:

C詞法分析中的「貪心」法

本章 的是符號和組成符號的字元之間的關係,以及有關符號含義的一些常見的誤解。當我們閱讀乙個句子時,我們並不去考慮組成這個句子的單詞中單個字母的含義,而是把單詞作為乙個整體來理解。確實,字母本身並沒有什麼意義,我們總是將字母組成單詞,然後給單詞賦予一定的意義。對於c語言或其他語言編寫的程式,道理也是一...

C詞法分析中的「貪心」法

本章 的是符號和組成符號的字元之間的關係,以及有關符號含義的一些常見的誤解。當我們閱讀乙個句子時,我們並不去考慮組成這個句子的單詞中單個字母的含義,而是把單詞作為乙個整體來理解。確實,字母本身並沒有什麼意義,我們總是將字母組成單詞,然後給單詞賦予一定的意義。對於c語言或其他語言編寫的程式,道理也是一...

C 詞法分析器中的「貪心法」

編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元的讀入,如果該字元可能組成乙個字元,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分 如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成乙個有意義的符號。a b這個表示式你要怎麼...