哈工大編譯原理實驗1——詞法分析
阿新 • • 發佈:2018-12-30
設計實現類高階語言的詞法分析器,基本功能如下:
(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