编译原理 实验二 词法分析程序自动生成工具实验

文章目录

  • 实验环境的准备
  • 实验
    • 实验预备知识
    • 分析案例
    • 所要做的任务
    • 实战

实验环境的准备

  • 安装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.mzph.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;不允许使用任何内…