文章目录
- 实验环境的准备
- 实验
- 实验预备知识
- 分析案例
- 所要做的任务
- 实战
实验环境的准备
-
安装
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
实战
- 当然是自己写啦