文章目錄
- 實驗環境的準備
- 實驗
- 實驗預備知識
- 分析案例
- 所要做的任務
- 實戰
實驗環境的準備
-
安裝
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 = 3(23, 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
實戰
- 當然是自己寫啦