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