編譯程式期末專題 developed in c++ by Tim
- 輸入一般 .txt 文字檔,於執行時輸入檔名
- 輸出 .txt 文字檔,若輸入檔名為test.txt,輸出檔名為scanner_test.txt
- In Windows
g++ Scanner.cpp -o Scanner.exe
Scanner.exe [{Path}//]{filename}.txt
cat [{Path}//]scanner_{filename}.txt | less- In Linux
g++ Scanner.cpp -o Scanner
./Scanner [{Path}/]{filename}.txt
type [{Path}/]scanner_{filename}.txt| 類別 | 格式 | 說明 |
|---|---|---|
| Reserved_word | include main char int float if else elseif for while do return switch case printf scanf | 允許各式大小寫組合 |
| Library_name | <xxx.h> | 前面必須存在#include,否則視為undefined token |
| Identifier | char/int/float 有定義的變數 | 由英文字母、底線及數字組成,限定英文字母開頭,否則視為undefined token |
| Character | ‘*’ | ‘*’ 算1個token |
| Number | 整數/浮點數/負數 | |
| 負數可以表示成-3或 (-3) | 算1個token | |
| Pointer | *identifier | *identifier 算1個token |
| Bracket | ( ) [ ] { } | |
| Operator | + - */ % ^ ++ -- & | = |
| Comparator | = = < > <= >= != | |
| Address | &identifier (identifier必須已定義) | &identifier 算1個token |
| Punctuation | , ; : # “ ‘ | |
| Format_specifier | %d %f %c * | |
| Printed_token | printf或scanf裡直接印出的token | 以空格區隔 |
| Comment | /…/ 或 // … | 不管內容,都算1個token |
| Undefined_token | ||
| Skipped_token | 不管內容,都算1個token | |
| NUL | 空的token |
Scanner以FSM的概念做設計,分為11種狀態,Scanner處於不同狀態時皆由不同的token判別方式。
負責檔案的讀取。
負責Regex判斷。
提供Symbol_Table物件。
提供Token.h物件。
Test{classname}.cpp
若下個字元為英文字母切換狀態至IDENTIFY_STATE
若下個字元為數字切換狀態至NUMBER_STATE
若下個字元為空格、換行則讀取下一個字元
若下個字元為$切換狀態至EOF_STATE Note.待改進
若下個字元為([{切換狀態至NUMBER_STATE
若下個字元為)]}返回Bracket
若下個字元為*%^|切換狀態至NUMBER_STATE並返回Operator
若下個字元為+則切換狀態至NUMBER_STATE
並讀取下個字元是否為+是則返回Operator(++) 否則返回Operator(+)
若下個字元為-則切換狀態至NUMBER_STATE
並讀取下個字元是否為-是則返回Operator(--) 否則返回Operator(-)
若下個字元為=><!則切換狀態至NUMBER_STATE
並讀取下個字元是否為=返回Operator
若下個字元為/切換狀態至SLASH_STATE
若下個字元為*&切換狀態至POINTER_STATE
若下個字元為’切換狀態至CHARACTER_STATE
若下個字元為,:切換狀態至NUMBER_STATE並返回Punctuation
若下個字元為;”返回Punctuation
若下個字元為#切換狀態至INCLUDE_STATE
若讀取到未定義之字元則切換狀態至SKIP_STATE並返回Undefined_token
讀取符合[A-Za-z0-9_]之字元進入字串
若該字串屬於Reserved_word返回Reserved_word並切換狀態至NORMAL_STATE
判斷是否為int float char是則切換狀態至DEFINE_STATE
判斷是否為printf scanf是則切換狀態至PRINT_STATE
若該字串存在於[Symbol_Table]返回Identifier並切換狀態至NORMAL_STATE
切換狀態至SKIP_STATE並返回Undefined_token
若遇到Reserved_word ;切換狀態至NORMAL_STATE
若遇到,返回Punctuation
將符合規則的字串存入[Symbol_Table]並返回Identifier
切換狀態至NORMAL_STATE
判斷是否為// /*
是則返回Comment
否則切換狀態至NUMBER_STATE並返回Operator
切換狀態至NORMAL_STATE
判斷是否符合'.'
是則返回Character
否則返回Punctuation
切換狀態至NORMAL_STATE 若符合規則,分別返回Punctuation 、Reserved_word 、Library_name
若符合規則則讀取下個字元
若下個字元為(返回Bracket
若下個字元為"返回Punctuation
若下個字串為%[dfc]、\[A-Za-z0-9\\\\]返回Format_specifier
若下個字串為其他返回Printed_token
若不符合規則則切換狀態至NORMAL_STATE
切換狀態至NORMAL_STATE
若*identifier存在於[Symbol_Table]返回Pointer
若&identifie中的identifie存在於[Symbol_Table]返回Address
切換狀態至NUMBER_STATE並返回Operator
切換狀態至NORMAL_STATE 讀取整行並返回Skipped_token
切換狀態至NORMAL_STATE 符合格式則返回Number
返回NUL