iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Lex & Yacc 學習筆記系列 第 1

[Day1] Lex & Yacc 簡介與環境安裝

  • 分享至 

  • xImage
  •  

前言

哈囉,我是麥茶,目前是一名軟體工程師。我主要使用的程式是C++,偶爾搭配一些其他程式,像是Python等等。在我的工作中,常常用到一個編譯器設計工具-Lex & Yacc。對於一些格式固定的檔案,尤其是記憶體龐大的檔案,Lex & Yacc可以快速有效的讀取內容,並可以利用程式將這些內容做後續的應用。有鑑於網路上與Lex & Yacc相關的中文參考資料不多,且多數沒有實際的例子,於是我想透過這次鐵人賽,將我在學習Lex & Yacc的過程與心得用簡單清楚的方式整理出來,希望能幫助到剛接觸這項工具的初學者。

Lex & Yacc 是甚麼?

Lex 和 Yacc 都是用於編譯器設計的工具,通常用於處理文本解析和語法分析。它們通常一起使用,協助開發者建立自己的編譯器或解釋器。

Lex 是 "Lexical Analyzer" 的縮寫,它負責將輸入的文本流轉換成一個個的 token,這些 token 是語言中的基本單位,如關鍵字、運算符、數字等。開發者需要使用regular expression(正則表達式)來描述這些 token 的模式,然後 Lex 會根據這些模式將輸入的文本拆分成 token。

Yacc 則是 "Yet Another Compiler Compiler" 的縮寫,它負責處理文本的語法分析,將 token 流轉換成更高層次的語法結構。開發者需要定義文法規則,描述語言中不同元素如何組合成有效的語句。Yacc 根據這些規則建立語法分析器,幫助解析並理解複雜的語句結構。

簡而言之,Lex 負責將文本拆分成基本單位的 token,而 Yacc 則負責根據文法規則分析這些 token,幫助開發者建立編譯器或解釋器。它們在編譯器設計中扮演著重要的角色。

程式語言與環境

本系列所有的範例皆使用C++,執行環境是Win10系統。
由於Lex 和 Yacc主要的運行環境是UNIX,在Windows系統中,我們可以使用類似的工具 - Flex & Bison。

筆者使用的IDE為VSCode,好處是有Lex & Yacc的套件可以使用,可以使介面更清楚。

如果你已經有基礎的C++程式語言能力,就可以學習上手這項工具囉。

Lex & Yacc 安裝(Windows系統)

在開始之前,我們先來安裝Lex & Yacc吧!
由於筆者使用環境是Windows系統,所以這裡安裝的會是剛剛提到的Flex & Bison。

安裝的一般步驟如下:

  1. 安裝 MinGW-w64

    MinGW-w64 是一個用於 Windows 的開發環境,可讓使用者在 Windows 上編譯和執行類似於 Unix 的工具。使用者可以從 MinGW-w64 官方網站 下載安裝程式。在安裝過程中,請確保選擇適合系統的版本(32 位或 64 位)。安裝完成後,將 MinGW-w64 的 bin 目錄(例如 C:\mingw\bin)新增到系統環境變數 PATH 中。

  2. 安裝 Flex(Lex 的替代工具)

    在 MinGW-w64 的命令行中執行以下命令來安裝 Flex:

    mingw32-get install msys-flex
    

    這將安裝 Flex 到 MinGW-w64 的環境中。

  3. 安裝 Bison(Yacc 的替代工具)

    在 MinGW-w64 的命令行中執行以下命令來安裝 Bison:

    mingw32-get install msys-bison
    

    這將安裝 Bison 到 MinGW-w64 的環境中。

  4. 測試安裝

    開啟命令行終端(使用 MinGW-w64 自帶的 MSYS 終端或其他終端),分別輸入以下命令來檢查安裝是否成功:

    • 檢查 Flex 安裝是否成功:

      flex --version
      
    • 檢查 Bison 安裝是否成功:

      bison --version
      

    如果兩者都顯示版本訊息,說明安裝成功。

結語

今天簡單介紹了Lex & Yacc這個編譯器設計工具,並且先安裝好相關套件。我們接下來就能進入Lex & Yacc的世界囉~


下一篇
[Day2] Lex - 基本介紹與原理
系列文
Lex & Yacc 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言