---
# System prepended metadata

title: 系統程式 Final Project Report
tags: [Compiler, 系統程式, YACC, LEX]

---

###### 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 程式碼
![](https://hackmd.io/_uploads/rygM34aN2.png)
- 使用正規表達式定義了一些 token:
    - [0-9]+: 可以接受一個或連續多個阿拉伯數字，並將整個數字保存在 yylval 中，同時向 YACC 返回標記成 (INTEGER)
    - [-+\n]: 會將 加號 (+), 減號 (-), 換行符號 (\n) 放入外部字元陣列中
    - "[ \t]": 遇到空格符號會無視掉
    - "." :遇到其他字符時，則 LEX 會調用 yyerror 函數並返回錯誤訊息
- 當 LEX 遇到輸入中的某個字符時，它會嘗試匹配這些正規表達式，並返回相 對應的 token。
- 當 scanner 遇到檔案(輸入)的末尾時，會呼叫函示 yywrap()，如果 yywrap() 返回為 0，則 scanner 會繼續掃描，但當 yywrap() 返回 1 時，則 意味者已遇到檔案(輸入)的結束。

## 3. YACC 程式碼
![](https://hackmd.io/_uploads/Hymc24pNh.png)
- 在 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. 執行結果
![](https://hackmd.io/_uploads/BJTanN6V3.png)

## 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)