1. 程式人生 > >哈工大編譯原理實驗1——詞法分析

哈工大編譯原理實驗1——詞法分析

設計實現類高階語言的詞法分析器,基本功能如下:

(1)    能識別以下幾類單詞:

識別符號(由大小寫字母、數字以及下劃線組成,但必須以字母或者下劃線開頭)

關鍵字(①型別關鍵字:整型、浮點型、布林型、記錄型;②分支結構中的if和else;③迴圈結構中的do和while;④過程宣告和呼叫中的關鍵字)

運算子(①算術運算子;②關係運算符;③邏輯運算)

界符(①用於賦值語句的界符,如“=”;②用於句子結尾的界符,如“;”;③用於陣列表示的界符,如“[”和“]”;④用於浮點數表示的界符“.”)

常數(無符號整數和浮點數,包括指數形式)

註釋(/*……*/形式)

(2)能夠進行詞法錯誤處理。識別出輸入程式中的詞法錯誤,準確給出錯誤所在位置,並採用可行的錯誤恢復策略。輸出的錯誤提示資訊格式如下:

Error at Line [行號]:[說明文字]

(3)系統的輸入形式:要求能夠通過檔案匯入測試用例。測試用例要涵蓋第(1)條中列出的各類單詞,幷包含各種單詞拼寫錯誤。

這裡採用的token字串識別方法是基於DFA狀態轉移


與之對應可以建立一個二維陣列進行狀態判斷

//DFA of digit
	public static String digitDFA[] = { 
		"#d#####", 
		"#d.#e##", 
		"###d###", 
		"###de##",  
        "#####-d", 
        "######d", 
        "######d" };

//判斷輸入符號是否符合狀態機
	public static int in_digitDFA(char ch, char test) 
	{  
        if (test == 'd') {  
            if (isDigit(ch))  
                return 1;  
            else  
                return 0;  
        }  
        else
        {
        	if (ch == test)
        		return 1;
        	else
        		return 0;
        }
    }

//初始化進入1狀態
						int state = 1;
						//宣告計數變數
						int k;
                        Boolean isfloat = false;  
                        while ( (ch != '\0') && (isDigit(ch) || ch == '.' || ch == 'e' || ch == '-'))
                        {
                        	if (ch == '.' || ch == 'e')  
                              isfloat = true;
                        	  
                            for (k = 0; k <= 6; k++) 
                            {  
                                char tmpstr[] = digitDFA[state].toCharArray();  
                                if (ch != '#' && 1 == in_digitDFA(ch, tmpstr[k])) 
                                {  
                                    token += ch;  
                                    state = k;  
                                    break;  
                                }  
                            }
                            if (k > 6) break;
                            //遍歷符號先前移動
                            i++;
                            if(i>=strline.length) break;  
                            ch = strline[i]; 
                        }


全部工程原始碼:https://github.com/SalamanderJY/Compiler_Experiment