詞素編譯
㈠ 計算機編程語言的發展過程
簡單一點可以是:機器語言-匯編語言-高級語言……
㈡ C語言const char和char有什麼區別,指針變數date有點懵,請幫我講解一下
有一個判斷 C 語言的聲明式的技巧,那就是「從右往左讀」,C++ 創始人 Bjarne Stroustrup 在其著作《The C++ Programming Language》中推薦了這種方法,《C 專家編程》中也提及了這種技巧。相比於其他的「根據 const 與其他詞素的距離判斷」、「根據 const 的前後關系判斷」等等,個人認為這是最人性化的方法。從某種意義上來說,C 編譯器在進行詞法分析的時候巧合地運用了這種範式來進行語義轉換,這一點在 Backus(上下文無關法) 範式中也有體現。
具體的方法是:
const char * A:A 是一個指針,指向 const char。
char const * A:A 是一個指針,指向 const char。
char * const A:A 是一個 const 指針,指向 char。
const char * const A:A 是一個 const 指針,指向 const char。
const char const * const A:A 是一個 const 指針,指向 const char,後面兩個(從右往左讀)有一個是多餘的。
看到給出的示例:
const char* date;
這是一個指向 const char 的指針,這說明指針本身可變,但是其指向的 char 是不可變的,而 date = "new string" 中常量字元串其實是一個指針,因為指針可變,所以這里沒問題。
但是如果寫成 char* const date,那麼這就是一個不可變的指針,但是其指向的 char 是可變的,這時候寫 date = "new string" 就會報錯:
error: cannot assign to variable 'date' with const-qualified type 'char *const'
但是如果嘗試如下語句:
char* const date = "Hello, world!";
date[0] = 'H';
編譯能通過,但是運行時會出錯:
zsh: bus error
匯流排錯誤是怎麼引起的呢?不是指向的 char 可變嗎?對,指向的 char 可變,所以編譯能通過,但是賦給 date 的是一個字面字元串,按照 C 語言操作內存的機制,嘗試更改字面字元串的會引起 bus error,至於具體的原因,可以繼續深入了解 C 語言的編譯機制和運行原理,這里不再贅述。
㈢ 編譯原理中的詞法分析器的輸入與輸出是什麼
編譯原理中的詞法分析器的輸入是源程序,輸出是識別的記號流。
詞法分析器編制一個讀單詞的程序,從輸入的源程序中,識別出各個具有獨立意義的單詞,即基本保留字、標識符、常數、運算符和分隔符五大類。並依次輸出各個單詞的內部編碼及單詞符號自身值。(遇到錯誤時可顯示「Error」,然後跳過錯誤部分繼續顯示)。

(3)詞素編譯擴展閱讀
詞法分析器的作用:
1、與符號表進行交互,存儲和讀取符號表中的標識符的信息。
2、讀入源程序的輸入字元,將他們組成詞素,生成並輸出一個詞法單元序列,每個詞法單元序列對應一個於一個詞素。
3、過濾掉程序中的注釋和空白。
4、將編譯器生成的錯誤消息與源程序的位置聯系起。
