---
tags: compiler
name: 編譯器與程式語言
---
[TOC]
<style>
.blue {
color: blue;
}
.red {
color: red;
}
</style>
---
# 編譯器與程式語言
# Natural Language v.s. Programming language
- 
- 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 的照片

## (0.0) 已經載過 flex, bison, mingw
- 如何判斷電腦是不是已經載過上面這些東西?
- 1. 在 C 槽或 D 槽資料夾中 search,如果有 flex.exe, bison.exe, mingw.exe(如下圖 flex.exe),跳過底下的東西,直接往 **(0.1) 增加系統環境變數(add environment path)**
- 
### 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/)
滾輪往下滾,會看到這個,按下載

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)

```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
```