詞法分析是編譯器工作的第乙個階段
詞法分析的主要任務是從左向右逐行掃瞄源程式的字元,識別出各個單詞,確定單詞的型別
將識別出的單詞轉換成統一的機內標識即詞法單元(token)形式。
token: < 種別碼,屬性值 >大體分為以下五類
單詞型別
種別種別碼
1關鍵字
program,if,else,then,…
一詞一碼
由於關鍵字是可以事先確定的所以為每乙個關鍵字分配乙個種別碼即一詞一碼。
單詞型別
種別種別碼
2識別符號
變數名,陣列名,記錄名,過程名,…
多詞一碼
由於識別符號由程式設計師所定義所以不能事先列舉所有識別符號,因此將所有識別符號統一作為一類單詞分配同乙個種別碼即多詞一碼,為了區分不同的識別符號,用token的第二個分量「屬性值」來存放不同識別符號具體的字面值。
單詞型別
種別種別碼3常量
整型,浮點型,字元型,布林型,…
一型一碼
常量與識別符號類似,是乙個開放的集合,即事先不能列舉所有的常量,不同的常量的構成方式是不同的,因此為每種型別的常量分配乙個種別碼即一型一碼,為了區分不同型別下的不同常量,用token的第二個分量「屬性值」來存放不同的常量具體的值。
單詞型別
種別種別碼
4運算子
算數(+ - * / ++ --)
一詞一碼
關係(> < == != >= <=)
或邏輯(& | ~)
一型一碼
運算子與關鍵字類似,都是事先可以確定的,所以為每乙個運算子分配乙個種別碼即一詞一碼。也可以為每一類運算子分配不同的種別碼,為了區別不同型別下的運算子,也可以使用token的第二個分量「屬性值」來存放具體的運算子。
單詞型別
種別種別碼
5界限符
;,( ),=,,…
一詞一碼
界限符與關鍵字類似,都是事先可以確定的,所以為每乙個界限符分配乙個種別碼即一詞一碼。
例:詞法分析後得到的token序列
輸入:while(value!=100)
輸出:序號 輸入串 < 種別碼 , 屬性值 >
1 while < while , - >
2 ( < slp , - >
3 value < idn , value >
4 != < ne , - >
5 100 < const , 100 >
6 ) < srp , - >
7 < rp , - >
由於種別碼本身應該是乙個整數,這裡為了可以直觀表現,使用了巨集定義的方式。
那麼詞法分析器是如何將輸入轉換為token序列的呢?
待續未完…
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...
詞法分析(編譯原理)
詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...