編譯原理 實驗二 詞法分析程序自動生成工具實驗

文章目錄

  • 實驗環境的準備
  • 實驗
    • 實驗預備知識
    • 分析案例
    • 所要做的任務
    • 實戰

實驗環境的準備

  • 安裝flex
    在這里插入圖片描述

  • 安裝MinGW
    在這里插入圖片描述

  • MinGW Installation Manager頁面

在這里插入圖片描述

  • apply changes

在這里插入圖片描述

下載比較耗時

在這里插入圖片描述

  • 只看到了一個文件,復制過去

在這里插入圖片描述

  • 配置環境變量

在這里插入圖片描述

  • 使用gcc -v檢驗是否安裝完成

在這里插入圖片描述

實驗

實驗預備知識

  • 咱們先來分析一下實驗到底想讓我們干什么!

flex是干什么的

  • flex(Fast Lexical Analyzer Generator)是一個詞法分析器生成工具,用于自動生成詞法分析器(lexer/scanner)的代碼

  • 輸入:flex 接收一個 .l(或 .lex)文件,其中定義了詞法規則(正則表達式 + 動作)。

  • 輸出:生成一個 C 語言 的詞法分析器(通常是 lex.yy.c),該代碼可以識別輸入流中的單詞(token)。

  • 用途:主要用于編譯器、解釋器、文本處理工具等需要分詞(tokenization)的場景。

flex 的基本工作原理
# flex 的工作流程:
(1)編寫 .l 文件:定義詞法規則(正則表達式 + 對應的動作)。
(2)運行 flex:生成 lex.yy.c(詞法分析器代碼)。
(3)編譯 lex.yy.c:生成可執行程序,用于分詞。

典型的.l文件

%{
/* C 代碼,如頭文件、變量聲明 */
#include <stdio.h>
%}/* 正則表達式定義 */
DIGIT    [0-9]
LETTER   [a-zA-Z]%%
/* 規則部分:模式 + 動作 */
{DIGIT}+    { printf("Number: %s\n", yytext); }
{LETTER}+   { printf("Word: %s\n", yytext); }
[ \t\n]     ;  /* 忽略空白符 */
.           { printf("Unknown: %s\n", yytext); }
%%/* 可選的 C 代碼(如 main 函數) */
int main() {yylex();  // 啟動詞法分析return 0;
}

分析案例

  • 實驗名稱:識別輸入文本中的單詞(word)和數(num)并分別統計個數

實例.lex代碼

%{
/* 全局變量聲明部分(C代碼塊) */
int wordCount = 0;   // 統計單詞數量
int numCount = 0;    // 統計數字數量
%}/* 正則表達式定義部分 */
chars      [A-Za-z\_\'\.\"]    // 匹配字母、下劃線、引號等字符
numbers    ([0-9])+           // 匹配一個或多個數字
delim      [" "\n\t]          // 匹配空格、換行、制表符等分隔符
whitespace {delim}+           // 匹配一個或多個分隔符
words      {chars}+           // 匹配一個或多個字符組合(單詞)%% 
/* 規則部分:模式 + 動作 *//* 當匹配到"while"時,打印該詞 */
while  { printf("%s\n", yytext); }/* 當匹配到單詞時,增加單詞計數器 */
{words} { wordCount++;     // 單詞數量加1
} /* 當匹配到空白符時,不執行任何操作 */ 
{whitespace} { /* 空動作:忽略空白字符 */ 
} /* 當匹配到數字時,增加數字計數器 */
([0-9])+ { numCount++;      // 數字數量加1
} %%  
/* 用戶自定義代碼部分 *//* 主函數 */
void main() { printf("ok1\n");          // 調試信息,表示程序開始運行yylex();                  // 啟動詞法分析printf("ok2\n");          // 調試信息,表示詞法分析結束// 打印統計結果printf("No of words: %d\nNumber: %d\n", wordCount, numCount);  return 0;  
}/* 必須定義的yywrap函數(當輸入文件結束時調用) */
int yywrap() { return 1;  // 返回1表示處理結束
} 

測試的文本:b.c

asd asdf 23 q 
a1 
b2
!#@
while

程序的輸出

ok1
!#@while
ok2
No of words: 5number: 3
  • 簡單分析一下輸出結果
(1)這個ok1和ok2都是.lex程序中定義的輸出
(2)其中!#@是沒喲被匹配到的,所以會默認輸出,這個while的話,.lex中規定了,遇到while就輸出
(3)統計結果
wordCount = 5(asd, asdf, q, a, b)
numCount = 323, 1, 2

所要做的任務

在這里插入圖片描述

  • 說白了,就需要你自己設計這個 a.lex 構詞規則序列
  • 然后使用flex來生成詞法生成程序lex.yy.c

在這里插入圖片描述

flex a.lex 
gcc -o a lex.yy.c -lfl 
  • 自己設計b.c程序
  • 然后使用lex.yy.c來分析b.c

在這里插入圖片描述

a.exe <b.c> a.txt 

實戰

  • 當然是自己寫啦

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901126.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901126.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901126.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BERT - 直接調用transformers.BertModel, BertTokenizerAPI不進行任何微調

本節代碼將使用 transformers 庫加載預訓練的BERT模型和分詞器&#xff08;Tokenizer&#xff09;&#xff0c;并處理文本輸入。 1. 加載預訓練模型和分詞器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…

Python 質數篩選:從入門到優化的 5 種方法

質數&#xff08;Prime Number&#xff09;是指只能被 1 和自身整除的自然數&#xff0c;如 2、3、5、7 等。在算法題、密碼學或數學計算中&#xff0c;高效生成質數至關重要。 Python 提供了多種方法來實現質數篩選&#xff0c;但不同方法的效率差異巨大。本文從 最基礎的方法…

C#MQTT協議服務器與客戶端通訊實現(客戶端包含斷開重連模塊)

C#MQTT協議服務器與客戶端通訊實現 1 DLL版本2 服務器3 客戶端 1 DLL版本 MQTTnet.DLL版本-2.7.5.0 基于比較老的項目中應用的DLL&#xff0c;其他更高版本變化可能較大&#xff0c;謹慎參考。 2 服務器 開啟服務器 關閉服務器 綁定事件【客戶端連接服務器事件】 綁定事件【客戶…

【連載3】基礎智能體的進展與挑戰綜述

基礎智能體的進展與挑戰綜述 從類腦智能到具備可進化性、協作性和安全性的系統 【翻譯團隊】劉軍(liujunbupt.edu.cn) 錢雨欣玥 馮梓哲 李正博 李冠諭 朱宇晗 張霄天 孫大壯 黃若溪 2. 認知 人類認知是一種復雜的信息處理系統&#xff0c;它通過多個專門的神經回路協調運行…

Python語言介紹

Python 是一種高級、通用、解釋型的編程語言&#xff0c;由 Guido van Rossum 于 1991 年首次發布。其設計哲學強調代碼的可讀性和簡潔性。 Python通過簡潔的語法和強大的生態系統&#xff0c;成為當今最受歡迎的編程語言之一。 一、核心特點 Python 是一種解釋型、面向對象、…

什么是回表?哪些數據庫存在回表?

目錄 一、什么是回表1. 回表的核心流程2. 示例說明3. 回表的性能問題4. 總結 二、哪些數據庫會有回表1. MySQL&#xff08;InnoDB&#xff09;2. Oracle3. 其他數據庫&#xff08;如 SQL Server、PostgreSQL&#xff09;4. 總結 三、非聚集索引與聚集索引的區別及產生原因1. 聚…

ssh 免密登錄服務器(vscode +ssh 免密登錄)

每次打開vscode連接服務器都需要輸入密碼&#xff0c;特別繁瑣。 然后自己在網上翻閱了一下教程&#xff0c;發現說的內容比較啰嗦&#xff0c;而且個人感覺非常有誤導性傾向。 因此自己直接干脆寫一個簡便易懂的教程算了。 &#xff08;以經過本人親測&#xff0c;真實可靠&am…

基于低空經濟的無人機操控與維護實訓室解決方案

一、低空經濟時代下的無人機人才需求 1.1 低空經濟發展趨勢與政策機遇 在當前經濟與科技飛速發展的大背景下&#xff0c;低空經濟作為國家戰略性新興產業&#xff0c;正以迅猛之勢崛起&#xff0c;展現出無限的潛力與活力。其應用場景極為廣泛&#xff0c;涵蓋了物流、安防、…

PyTorch實現二維卷積與邊緣檢測:從原理到實戰

本文通過PyTorch實現二維互相關運算、自定義卷積層&#xff0c;并演示如何通過卷積核檢測圖像邊緣。同時&#xff0c;我們將訓練一個卷積核參數&#xff0c;使其能夠從數據中學習邊緣特征。 1. 二維互相關運算的實現 互相關運算&#xff08;Cross-Correlation&#xff09;是卷…

數字政府網絡架構建設方案

數字政府網絡架構建設方案 一、引言 隨著信息技術的快速發展&#xff0c;數字政府建設已成為提升政府治理能力和服務水平的關鍵。網絡架構作為數字政府的核心基礎設施&#xff0c;對于保障數據安全、提高服務效率、促進信息共享具有重要意義。本方案旨在為數字政府網絡架構建…

Python map函數介紹

在 Python 里&#xff0c;map() 是一個內置函數&#xff0c;其用途是將指定的函數應用于可迭代對象&#xff08;像列表、元組等&#xff09;的每個元素&#xff0c;最終返回一個新的迭代器。此迭代器所包含的元素是原可迭代對象中每個元素經過指定函數處理后的結果。map() 函數…

【服務器端表單字符驗證】

文章目錄 一、實驗目的二、核心代碼實現三、調試關鍵問題四、總結 一、實驗目的 掌握JSP表單驗證在服務器端的實現技術&#xff0c;實現對用戶輸入字符的非空及長度為5的驗證&#xff0c;返回對應提示信息并優化用戶交互。 二、核心代碼實現 前端表單 <form action"…

dify windos,linux下載安裝部署,提供百度云盤地址

dify下載安裝 dify1.0.1 windos安裝包百度云盤地址 通過網盤分享的文件&#xff1a;dify-1.0.1.zip 鏈接: 百度網盤 請輸入提取碼 提取碼: 1234 dify安裝包 linux安裝包百度云盤地址 通過網盤分享的文件&#xff1a;dify-1.0.1.tar.gz 鏈接: 百度網盤 請輸入提取碼 提取碼…

C++ Primer 5e 習題2.5: 指出如下字面量常量的類型

Exercise 2.5: Determine the type of each of the following literals. Explain the differences among the literals in each of the four examples: (a) ‘a’, L’a’, “a”, L"a" (b) 10, 10u, 10L, 10uL, 012, 0xC © 3.14, 3.14f, 3.14L (d) 10, 10u, 10…

CFS 調度器兩種調度類型普通調度 和 組調度

在 Linux 的 CFS&#xff08;Completely Fair Scheduler&#xff09; 調度器中&#xff0c;確實存在兩種調度類型&#xff1a;普通調度 和 組調度。這兩種調度類型分別適用于不同的場景&#xff0c;并通過三個關鍵維度&#xff08;權重、搶占優先級、最大配額&#xff09;來影響…

AF3 ProteinDataset類的_get_masked_sequence方法解讀

AlphaFold3 protein_dataset模塊 ProteinDataset 類 _get_masked_sequence 方法屬于作用是為需要預測的殘基生成掩碼。該掩碼以二進制張量形式呈現,其中 1 代表需要預測的部分,0 代表其他部分。此方法會依據多個參數來選定要掩碼的殘基,這些參數包含 mask_whole_chains、mas…

【音視頻】SDL渲染YUV格式像素

SDL視頻顯示的流程 實現流程 準備視頻文件 準備一個格式為yuv420p&#xff0c;分辨率為320x240的yuv數據&#xff0c;并且將視頻文件放入項目構建的目錄下&#xff1a; 初始化SDL 初始化SDL的視頻模塊 //初始化 SDL if(SDL_Init(SDL_INIT_VIDEO)) {fprintf( stderr, "…

關于群暉安裝tailscale后無法直鏈的問題

問題是我局域網的ipv6無法正確獲取到ip, 通過命令可以看到ipv6沒有ip tailscale netcheck C:\Users\Administrator>tailscale netcheck 2025/04/12 23:43:34 attempting to fetch a DERPMap from https://controlplane.tailscale.comReport:* Time: 2025-04-12T15:43:38.27…

[數據結構]Trie字典樹

GPT的介紹 &#x1f9e0; 一句話總結&#xff1a; 字典樹是一種專門用來存很多字符串的“超級前綴樹”&#xff0c;查找某個字符串或前綴的時候&#xff0c;特別快&#xff01; ?? 舉個生活例子&#xff08;類比&#xff09;&#xff1a; 你想做一個詞典&#xff08;Dictio…

04-算法打卡-數組-二分查找-leetcode(69)-第四天

1 題目地址 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09;69. x 的平方根 - 給你一個非負整數 x &#xff0c;計算并返回 x 的 算術平方根 。由于返回類型是整數&#xff0c;結果只保留 整數部分 &#xff0c;小數部分將被 舍去 。注意&#xff1a;不允許使用任何內…