###### tags: `系統程式` `Compiler` `LEX` `YACC` # 系統程式 Final Project Report ## 1. 程式功能:簡單的加減法計算器 - 系統環境:ubuntu(需要安裝 ==flex (lex)== 和 ==bison (yacc)==) - `sudo apt-get install flex bison` - 編譯執行順序: 1. 先撰寫 lex 和 yacc 的程式檔案,分別命名為 - lex : `$(FileName).l` - yacc : `$(FileName).y` 2. 撰寫完程式碼後,開始按照順序編譯: 1. `bison -d $(FileName).y` ---> 會生成 `$(FileName).tab.c` 和 `$(FileName).tab.h` 兩個檔案 2. `flex $(FileName).l` 3. `cc -o $(ProgramName) *.c` ---> 會得到一個 `$(ProgramName)`的執行檔 3. 在 terminal 輸入 `./$(ProgrameName)` 即可執行 ## 2. LEX 程式碼  - 使用正規表達式定義了一些 token: - [0-9]+: 可以接受一個或連續多個阿拉伯數字,並將整個數字保存在 yylval 中,同時向 YACC 返回標記成 (INTEGER) - [-+\n]: 會將 加號 (+), 減號 (-), 換行符號 (\n) 放入外部字元陣列中 - "[ \t]": 遇到空格符號會無視掉 - "." :遇到其他字符時,則 LEX 會調用 yyerror 函數並返回錯誤訊息 - 當 LEX 遇到輸入中的某個字符時,它會嘗試匹配這些正規表達式,並返回相 對應的 token。 - 當 scanner 遇到檔案(輸入)的末尾時,會呼叫函示 yywrap(),如果 yywrap() 返回為 0,則 scanner 會繼續掃描,但當 yywrap() 返回 1 時,則 意味者已遇到檔案(輸入)的結束。 ## 3. YACC 程式碼  - 在 definition declares 的部分,我們宣告了 INTEGER 這個 token,以及加號 和減號兩個運算符號兩個 token,其中 "%left" 表示左結合,並且越晚列出來 的定義擁有最高的優先權。 - 在 %% 和 %% 之間為 “rule section”,在 rule section裡我們定義了一個 BNF grammer,用來描述這個加減法計算器程式的語法。這個 grammer包括 program 和 expr 兩個非終端符號,以及加號和減號兩個運算符號。 - 這個文法的意思是:一個程序由一個或多個表達式 (expr) 組成,每個表達式 之間用換行符號 (\n) 分隔,每個表達式可以是一個整數 (integer),或者是由 兩個表達式和一個運算符號構成的表達式 ( expr '+' expr 或 expr '-' expr )。 - 在 YACC 解析輸入時,它會調用 yylex 函數來獲取下一個 token,然後根據文 法進行推導和計算。 - 如果 YACC 在解析過程中遇到了語法錯誤,它會調用 yyerror 函數來輸出錯誤 信息。 ## 4. 執行結果  ## 5. 參考資料 [https://developer.ibm.com/tutorials/au-lexyacc/](https://developer.ibm.com/tutorials/au-lexyacc/) [https://www.ibm.com/docs/en/aix/7.1?topic=information-example-program-lex-yacc-programs](https://www.ibm.com/docs/en/aix/7.1?topic=information-example-program-lex-yacc-programs) [https://www.quora.com/What-is-use-of-yywrap-in-LEX](https://www.quora.com/What-is-use-of-yywrap-in-LEX) [https://blog.csdn.net/u014015972/article/details/51480680](https://blog.csdn.net/u014015972/article/details/51480680) [https://zhuanlan.zhihu.com/p/105160180](https://zhuanlan.zhihu.com/p/105160180)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up