編譯程式期末專題 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