Skip to content

Latest commit

 

History

History
175 lines (124 loc) · 4.99 KB

README.md

File metadata and controls

175 lines (124 loc) · 4.99 KB

Scanner

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

Token類別

類別 格式 說明
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.h

Scanner以FSM的概念做設計,分為11種狀態,Scanner處於不同狀態時皆由不同的token判別方式。

Reader.h

負責檔案的讀取。

Regex_Checker.h

負責Regex判斷。

Symbol_Table.h

提供Symbol_Table物件。

Token.h

提供Token.h物件。

單元測試檔

Test{classname}.cpp


Token判斷方式

1. NORMAL_STATE

若下個字元為英文字母切換狀態至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

2. IDENTIFY_STATE

讀取符合[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

3. DEFINE_STATE

若遇到Reserved_word 切換狀態至NORMAL_STATE 若遇到,返回Punctuation 將符合規則的字串存入[Symbol_Table]並返回Identifier

4. SLASH_STATE

切換狀態至NORMAL_STATE 判斷是否為// /* 是則返回Comment 否則切換狀態至NUMBER_STATE並返回Operator

5. CHARACTER_STATE

切換狀態至NORMAL_STATE 判斷是否符合'.' 是則返回Character 否則返回Punctuation

6. INCLUDE_STATE

切換狀態至NORMAL_STATE 若符合規則,分別返回PunctuationReserved_wordLibrary_name

7. PRINT_STATE

若符合規則則讀取下個字元 若下個字元為(返回Bracket 若下個字元為"返回Punctuation 若下個字串為%[dfc]\[A-Za-z0-9\\\\]返回Format_specifier 若下個字串為其他返回Printed_token 若不符合規則則切換狀態至NORMAL_STATE

8. POINTER_STATE

切換狀態至NORMAL_STATE*identifier存在於[Symbol_Table]返回Pointer 若&identifie中的identifie存在於[Symbol_Table]返回Address 切換狀態至NUMBER_STATE並返回Operator

9. SKIP_STATE

切換狀態至NORMAL_STATE 讀取整行並返回Skipped_token

10. NUMBER_STATE

切換狀態至NORMAL_STATE 符合格式則返回Number

11. EOF_STATE

返回NUL