---
# System prepended metadata

title: 編譯器與程式語言
tags: [compiler]

---

---
tags: compiler
name: 編譯器與程式語言
---
[TOC]

<style>
.blue {
  color: blue;
}
.red {
  color: red;
}
</style>

---

# 編譯器與程式語言

# Natural Language v.s. Programming language
- ![](https://i.imgur.com/Vo200Hz.jpg)
- reference : [自然語言處理 (NLP)是什麼？](https://aiacademy.tw/what-is-nlp-natural-language-processing/)

# Language Processing
- ref: [深入淺出教你寫 compiler](https://jaceju.net/simple-compiler/)
[](http://inspiregate.com/programming/other/471-compiler-1.html)

# Assignment 1
###### ref : [flex-bison工作原理-之乎](https://zhuanlan.zhihu.com/p/120812270)
- Flex 和 Bison 是 Linux 下用來生成詞法分析器(lexical analysis) 和語法分析器(syntactic analysis) 兩個程序的工具，可以處理結構化輸入。
- flex 文件是定義 pattern（哪是黄豆，哪是绿豆...），透過 flex 處理（詞法分析）將輸出切分成一段一段的 token（將輸入的豆子一個個摘出来），再執行不同的 action（黄豆就磨豆漿（action），綠豆去做綠豆糕(action)）
- 
# 0. 環境安裝
- 先放上一張 successfully test Installation 的照片
    ![](https://i.imgur.com/zFgyV06.png)
## (0.0) 已經載過 flex, bison, mingw
- 如何判斷電腦是不是已經載過上面這些東西？
- 1. 在 C 槽或 D 槽資料夾中 search，如果有 flex.exe, bison.exe, mingw.exe(如下圖 flex.exe)，跳過底下的東西，直接往 **(0.1) 增加系統環境變數(add environment path)**
    - ![](https://i.imgur.com/oYYGDrF.png)

### Flex
1. 下載點: [Flex for Windows](http://gnuwin32.sourceforge.net/packages/flex.htm)

### Bison
1. 下載點: [Bison for Windows](http://gnuwin32.sourceforge.net/packages/bison.htm)

### mingw
1. 官網: [MinGW-w64 - for 32 and 64 bit Windows](https://sourceforge.net/projects/mingw-w64/)
    滾輪往下滾，會看到這個，按下載
    ![](https://i.imgur.com/wKGLOJH.png)

2. 
    - Version　是 gcc 的版本，這裡我選擇默認選項，應該會是最新或是最穩定的。
    - Architecture 是電腦系統的位元，我的是 64bit所以選擇x86_64。
    - Windows 似乎就是選 win32，其他系統就選posix。
    - Exception　是選擇異常處理模型，64位元的電腦有兩個選項可以選，這裡我選擇seh。性能較好，但不支持32位元。
    - Build revision 看起來沒得選擇(?)，就維持默認。

3. 更改完後下一步會進入安裝目錄設置，我是維持默認設定。再來就直接安裝，安裝完應該可以看到一個新的資料夾就叫做mingw-w64。

- ref: [[C++]MinGW-w64安裝與設定](https://alexmav04.github.io/computer/windows-with-mingw-w64/)

## (0.1) 增加系統環境變數
- ref: 別人都寫得很詳細了，所以善用網路資源~ 如下
    [Windows 11 設定環境變數 位置](https://www.ruyut.com/2021/12/windows-11.html)
    
# 1. 如何編譯 flex 與 bison
::: success
ref: [編譯原理_計算器_flex、bison實現_（從零開始）](https://www.itread01.com/content/1548408971.html)
![](https://i.imgur.com/RvojKiu.png)

```c=
flex  calc.l
bison -o calc.tab.h calc.y  //注意-o後面有沒有空格都可以 ==
gcc -o aa lex.yy.c calc.tab.h  //編譯
aa      //執行aa.exe
```

:::

# 2. flex 與 bison 使用方法
ref :[利用FLEX & BISON 快速實現簡單的C 語言編譯器前端](https://www.twblogs.net/a/5b83b5f62b71777a2efd068c), [Bison-Flex 筆記](https://www.twblogs.net/a/5b8282192b717766a1e898e1)

## (1.) flex
1. 簡單來說分為兩步：
    (a.) 先定義一個flex的輸入檔案，描述詞法。
    (b.) 用flex程式處理這個檔案，生成對應的C語言原始碼檔案。
    （一般flex的輸入檔案以.l檔案結尾）
2. 檔案分成三個部分
    - <span class="red">第一部分是從 %{ 到 }% 標記的部分。</span>
    - 這個部分會**原封不動**的複製到 flex 的生成程式碼中。
        - 檔案開頭定義了一個 YYSTYPE 巨集。
        - 每個 TOKEN 可以有一個 lval值屬性，
        - YYSTYPE 定義型別就是 token 的 lval 的型別。
        - _EasyTData是我們的 web服務層 和 web頁面層公用的通用資料結構。
        - 然後就是一些要 include 的標頭檔案，第一部分就完了。
    - <span class="red">lex 的輸入檔案的第二部分，是從 % } 到 % % 之間的部分，
這部分用正則表示式定義了一些資料型別。</span>
        - 比如 int, num, string, ignore_char, identifier... 等。 
    - 注意這裡使用的正則表示式的形式是 **ERE** 而不是**BRE**。 
        - ERE與BRE比較明顯的區別就是
            **ERE使用+表示字元重複一次以上，'*'表示字元重複0次以上。**
            **BRE使用{1,}這種方式表示字元重a**
    - <span class="red">檔案的第三部分，是% % 到% % 的部分。</span>
        - 這裡定義了詞法分析器在解析的處理動作。
        >%% 和 %% 之间的内容被称为 规则（rules）
    - yytext 是一個 flex 內部的識別符號，表示匹配到的字串。
- 上文介紹了，lval也是一個內部識別符號，表示TOKEN的值。
- json2tdata_是識別符號的字首, 在執行flex的時候，用-P指定。
- flex輸入檔案寫完之後，使用下面這條命令，就可以把flex的輸入檔案轉換為C語言的原始碼了。
```
flex calc.l//生成lex.yy.c
```

































