欢迎光临
我们一直在努力

〔重庆理工大学〕编译原理实验报告【词法分析实验】

《编译原理》实验报告(第 1 次)

学号: 1230904XXXX 姓名: 段 X X 时间: 2026/4/2

教师评分评分点1:实验方案描述A:实验方案描述清楚、详细B:实验方案描述比较清楚、详细 C:实验方案描述基本清楚、详细D:实验方案描述不太清楚、详细E:实验方案描述不清楚、不详细
评分点2:实验方案对比分析A:能从多个维度对不同的实验方案进行对比,并有深刻的分析B:对不同的实验方案进行对比的维度较多,并有比较深刻的分析C:对不同的实验方案进行对比的维度较少,并有一定的分析D:对不同的实验方案进行对比的维度较少或分析较粗浅E:只有一种实验方案,或没有实验方案的对比分析

在这里插入图片描述

CQUT编译原理实验报告【词法分析实验】

  • 1 实验目的
  • 2 实验内容
  • 3 实验方案
    • 3.1方案描述(详细描述)
      • 3.1.1方案一:手工构造基础词法分析器
        • 1.核心数据结构
        • 2.总控程序流程图
        • 3.核心状态转换图(单词识别)
        • 4.各类单词识别伪代码
      • 3.1.2方案二:手工构造错误处理词法分析器
        • 1.错误处理总控流程图
        • 2.错误识别伪代码
      • 3.1.3 方案三:Flex自动生成词法分析器
        • 1.Flex工作流程流程图
        • 2.4组Flex程序流程图+正规式+规则说明
    • 3.2 方案分析
        • 1.三种方案对比表
        • 2.方案总结
  • 4 实验测试
    • 4.1 实验一测试:基础单词识别
      • 4.2 实验二测试:词法错误处理
      • 4.3 实验三测试:Flex自动生成
  • 5 实验结论及分析
    • 5.1 实验结论
    • 5.2 实验分析
      • 5.2.1 关键问题解决
      • 5.2.2 实验收获
      • 5.2.3 改进方向
  • 6 实验报告(电子版Word文档)
      • 1.编译原理实验报告【词法分析实验】
      • 2.解压包密码
  • 7 实验源代码(python语言)
      • 1.编译原理实验源代码【词法分析实验】
      • 2.解压包密码

1 实验目的

(1)掌握词法分析的核心原理,理解状态转换图在单词识别中的设计与应用,明晰词法分析器的完整工作流程。

(2)掌握手工编码实现词法分析器的方法,能够基于状态转换图完成Sample语言全部标准单词的识别、分类与输出。

(3)掌握词法分析阶段常见错误的检测与处理机制,能够精准识别并上报非法字符、构词错误、符号未闭合等词法错误。

(4)掌握Flex词法自动生成工具的使用方法,理解正规式、词法规则与自动生成代码的映射关系,完成工程化词法分析器开发。

(5)实现词法分析结果的标准化输出与文件持久化,建立词法分析与后续语法分析的接口衔接意识。

2 实验内容

本次实验分为三个独立子实验,覆盖词法分析全流程:

(1)实验一:Sample语言常见单词识别

基于状态转换图手工构造词法分析器,识别Sample语言的关键字、标识符、十进制/八进制/十六进制整数、浮点数、字符常量、字符串常量、运算符、分隔符;读取1.txt源码,输出单词文本、类别码、行号,同步写入result.txt。

(2)实验二:词法分析错误处理

在实验一基础上扩展错误检测模块,识别非法字符、数字构词错误、注释未闭合、字符常量未闭合、字符串未闭合5类错误;输出错误行号+错误编码,同步写入error.txt。

(3)实验三:词法分析程序自动生成(Flex)

编写4组Flex源程序,分别实现文本字符/行数统计、标识符/整数识别、去注释+关键字小写、完整Sample语言单词识别;编译运行Flex生成的C代码,验证自动生成效果。

3 实验方案

3.1方案描述(详细描述)

本次实验提供三种备选方案,分别对应手工基础实现、手工错误增强、工具自动生成,均严格遵循Sample语言词法规范设计,覆盖词法分析状态转换、模式匹配、错误处理、自动生成全流程,以下为各方案的Mermaid流程图、状态转换图、正规式、伪代码的说明。

3.1.1方案一:手工构造基础词法分析器

核心目标:在不包含错误检测机制的前提下,基于状态转换图手工编码实现Sample语言完整词法分析功能;完成对关键字、标识符、十进制/八进制/十六进制整数、浮点数、字符常量、字符串常量、单/双字符运算符、各类分隔符的精准识别与分类;按行读取源文件1.txt,为每个单词绑定原文、类别码、行号三元组信息;实现标准化控制台输出与result.txt文件持久化存储;构建无冗余、可复用的词法扫描框架,为后续错误处理与语法分析奠定底层基础。

1.核心数据结构

# 单词结构体:存储单词文本、类别码、行号
class Token:
def __init__(self, lexeme, token_type, line):
self.lexeme = lexeme # 单词原文
self.token_type = token_type # 类别码
self.line = line # 所在行号
def __str__(self):
# 格式化输出:单词左对齐15位,类别码左对齐5位
return f"{self.lexeme:<15} {self.token_type:<5} {line_num}"

2.总控程序流程图

在这里插入图片描述

图1 总控程序流程图

3.核心状态转换图(单词识别)

(1)标识符/关键字状态转换图

本状态图严格遵循程序设计语言标识符命名规范:首字符必须为字母或下划线,后续字符可包含字母、数字、下划线。识别时从初始态S0启动,匹配首字符合法则进入S1;S1为自循环状态,持续匹配合法字符直至遇到非标识符字符,完成单词截取。识别逻辑采用关键字优先匹配策略,内置Sample语言关键字字典(int、float、char、if、while等),匹配到字典内单词则分配对应关键字类别码,未匹配则统一判定为自定义标识符,分配类别码700,彻底区分关键字与用户自定义标识符。如图2所示。 在这里插入图片描述

图2 标识符/关键字状态转换图

(2)数字状态转换图

本状态图实现多进制整数+标准浮点数的分层识别,严格遵循数字构词语法:以0x/0X开头判定为十六进制整数,仅匹配0-9、a-f、A-F字符;以0开头且非十六进制判定为八进制整数,仅匹配0-7字符;以1-9开头判定为十进制整数;十进制数字中包含小数点则判定为浮点数,小数点前后必须有合法数字。状态迁移时按前缀精准分流,无非法字符兼容逻辑,确保数字类型识别无歧义,整数统一分配类别码400,浮点数分配类别码800。如图3所示。 在这里插入图片描述

图3 数字状态转换图

(3)字符/字符串常量状态转换图

字符常量为单引号闭合的单个字符,支持\\n(换行)、\\t(制表符)等标准转义字符,识别时跳过起始单引号,读取一个有效字符后匹配结束单引号,完成识别,类别码500;字符串常量为双引号闭合的字符序列,支持任意可打印字符与转义字符,可跨字符匹配,识别时跳过起始双引号,持续读取直至匹配结束双引号,类别码600。两种常量均严格校验闭合符号,确保常量边界识别准确。如图4所示。 在这里插入图片描述

图4 字符/字符串常量状态转换图

(4)运算符/分隔符状态转换图

运算符与分隔符识别采用最长匹配原则,优先匹配双字符运算符,避免单字符误判。先判断当前字符是否为双字符运算符前缀(=、>、!、&等),若下一个字符可组成合法双字符运算符(==、>=、!=、&&),则整体识别为一个单词;若无匹配,则识别为单字符运算符(+、-、*、/)或分隔符(;、(、)、{、})。通过预定义运算符-类别码、分隔符-类别码字典,快速映射对应编码,保证符号识别高效无冲突。如图5所示。 在这里插入图片描述

图5 运算符/分隔符状态转换图

4.各类单词识别伪代码

(1)标识符/关键字识别

该函数是标识符与关键字识别的核心实现,严格遵循Sample语言词法规则。通过字符指针定位单词起始与结束位置,截取完整单词文本后,与内置关键字哈希字典进行匹配,哈希查找时间复杂度为O(1),保证识别效率。关键字优先匹配机制可避免自定义标识符与关键字重名导致的识别错误,是词法分析的核心设计要点。伪代码如下:

输入:当前行line,指针pos,行号line_num
输出:Token,更新后pos
1. 记录起始位置start=pos
2. 循环:若字符是字母/数字/下划线,pos+1
3. 截取单词:lexeme=line[start:pos]
4. 查关键字字典:存在→关键字类别码;不存在→标识符700
5. 返回Token(lexeme, 类别码, line_num)

(2)数字识别(十进制/八进制/十六进制/浮点数)

本函数实现多进制数字的分层识别,通过前缀判断快速区分数字类型,严格限制各进制合法字符范围,杜绝非法数字识别。十进制数字额外判断小数点,区分整数与浮点数,类别码分配清晰,为后续语法分析提供精准的类型标记,满足编译前端的数据类型区分需求。伪代码如下:

输入:当前行line,指针pos,行号line_num
输出:Token,更新后pos
1. 若以0x/0X开头→十六进制整数,读取0-9/a-f
2. 若以0开头且非十六进制→八进制整数,读取0-7
3. 否则→十进制,判断是否含小数点→浮点数/整数
4. 截取数字串,分配对应类别码(整数400,浮点数800)
5. 返回Token

(3)字符/字符串常量识别

字符常量限定为单个字符,兼容转义字符,适配语言基础语法;字符串常量支持任意长度字符序列,转义字符处理保证特殊字符正常识别。两种常量均以闭合引号为结束标志,识别完成后绑定对应类别码,与其他单词类型明确区分。伪代码如下:

字符常量:
1. 跳过单引号',读取字符(支持\\n/\\t转义)
2. 匹配结束单引号,截取内容,类别码500
字符串常量:
3. 跳过双引号",读取内容(支持转义)
4. 匹配结束双引号,截取内容,类别码600

(4)运算符/分隔符识别

最长匹配策略是运算符识别的关键,可有效避免=与==、>与>=等符号的识别冲突。通过字典映射快速获取类别码,代码简洁高效,支持后续新增运算符/分隔符时快速扩展,提升程序可维护性。伪代码如下:

1. 优先匹配双字符运算符(==、>=、&&等)
2. 无匹配则匹配单字符运算符/分隔符
3. 查字典获取类别码,返回Token

3.1.2方案二:手工构造错误处理词法分析器

核心目标:在方案一基础词法分析框架上,扩展5类核心词法错误的检测与上报机制,构建完整的编译器前端错误处理模块;精准识别非法字符、数字构词错误、多行注释未闭合、字符常量未闭合、字符串未闭合五类错误,为每类错误分配唯一编码(101-105);实时记录错误所在行号,扫描完成后按行号排序输出;仅输出错误信息,屏蔽正常Token,将错误结果同步写入error.txt文件;实现错误快速定位、故障隔离、行级上报的词法错误处理流程,符合编译器错误处理的工业标准。

1.错误处理总控流程图

在这里插入图片描述

图6 错误处理总控流程图

2.错误识别伪代码

(1)非法字符(101)

非法字符指Sample语言词法规则未定义的字符(如@、#、$、中文等),此类字符无法构成合法单词,会导致编译流程中断。检测到非法字符时,立即记录行号与错误编码101,并将字符指针跳至行尾,跳过当前行剩余字符,实现错误隔离,避免单个非法字符引发连锁识别错误。伪代码如下:

if 字符 ∉ {字母,数字,运算符,分隔符,引号,注释符}:
errors.append((line_num, 101))
pos = 行尾,跳过当前行

(2)数字构词错误(102)

数字构词错误是最常见的词法错误,包含三种场景:浮点数小数点后无有效数字、八进制数包含8/9非法字符、十六进制数无后续有效数字。本函数严格校验数字构词规则,拦截所有格式非法的数字,记录错误编码102,保证数字类型的合法性。伪代码如下:

if 小数点后无数字 / 八进制含8/9 / 十六进制无有效数字:
errors.append((line_num, 102))
pos = 行尾,跳过当前行

(3)注释/常量未闭合(103/104/105)

未闭合错误属于边界匹配错误,扫描至文件末尾仍未找到对应的闭合符号,说明源码存在语法残缺。多行注释未闭合会导致后续所有代码被识别为注释,字符/字符串未闭合会导致常量边界错乱,因此需精准检测并上报,错误编码分别为103、104、105,方便开发者快速定位残缺符号。伪代码如下:

多行注释:扫描至文件结束未找到*/ → 103
字符常量:无结束单引号 → 104
字符串:无结束双引号 → 105

3.1.3 方案三:Flex自动生成词法分析器

核心目标:基于正规式定义词法规则,使用Flex工具自动生成C语言词法分析器,摆脱手工编码状态转换图的繁琐工作;依次编写4组Flex源程序(lex01-len04),分别实现文本字符/行数统计、标识符/整数识别、去注释+关键字小写、完整Sample语言单词识别四大功能;完成Flex规则文件编译、C代码生成、可执行程序构建、测试文件验证全流程;理解正规式与有限自动机的映射关系,掌握工业级词法分析器的快速开发方法,验证自动生成方案的高效性与稳定性。

1.Flex工作流程流程图

在这里插入图片描述

图7 Flex工作流程流程图

2.4组Flex程序流程图+正规式+规则说明

(1)lex01.l:文本字符/行数统计

本程序是Flex入门级应用,通过全局变量line_count统计行数、char_count统计字符数。换行符\\n同时触发行数与字符数累加,普通字符仅触发字符数累加;yyin为Flex默认文件指针,绑定测试文件后由yylex()自动扫描,yywrap()为文件结束回调函数,实现单程序多文件循环统计,满足文本基础统计需求。

*A.文本字符/行数统计流程图*

在这里插入图片描述

图8 文本字符/行数统计流程图

*B.文本字符/行数统计核心正规式*

\\n 匹配换行符
. 匹配任意单个字符

(2)lex02.l:标识符/整数识别

本程序通过正规式抽象定义标识符与整数规则,无需手工编写状态迁移逻辑。{DIGIT}+匹配一个或多个数字,判定为整数;{ID}匹配符合命名规则的标识符;Flex按规则书写顺序优先匹配,非目标字符直接忽略,实现精准、高效的单词筛选,是词法分析核心功能的简化实现。

*A.标识符/整数识别流程图* 在这里插入图片描述

图9 标识符/整数识别流程图

*B.标识符/整数识别核心正规式*

DIGIT [0-9] // 数字集合
ID [a-zA-Z_][a-zA-Z0-9_]* // 标识符正规式

(3)lex03.l:去注释+关键字小写

本程序实现代码预处理核心功能:通过正规式匹配所有类型注释,匹配后直接忽略,实现去注释效果;大写关键字匹配后强制转换为小写输出,统一代码风格;普通字符原样输出,保留有效代码逻辑。无需修改源码,即可完成代码规范化处理,是编译器前端预处理的典型应用。

*A.去注释+关键字小写流程图* 在这里插入图片描述

图10 去注释+关键字小写流程图

*B.去注释+关键字小写核心正规式*

"IF"/"THEN"/"BEGIN"/"END"/"WHILE"/"REPEAT" 大写关键字
"/*"[^*]*"*/" 多行注释匹配
"//".* 单行注释匹配
"{"[^}]*"}" 自定义{}注释匹配

(4)lex04.l:完整Sample语言单词识别

本程序是工业级完整词法分析器,覆盖Sample语言所有单词类型,按关键字>标识符>常量>运算符>分隔符>注释>空白>非法字符的优先级匹配。通过正规式定义所有词法规则,Flex自动将规则转换为确定有限自动机(DFA),生成高效C代码;支持实时报错非法字符,忽略注释与空白,输出标准化单词类型与内容,完全替代手工词法分析器,是实际编译器开发的标准方案。

*A.完整Sample语言单词识别流程图* 在这里插入图片描述

图11 完整Sample语言单词识别流程图

*B.完整Sample语言单词识别核心正规式*

[a-zA-Z_][a-zA-Z0-9_]* 标识符正规式
[0-9]+ 整数正规式
[0-9]+\\.[0-9]* 实数正规式
"+"|"-"|"*"|"/"|"=" 运算符正规式
";"|"("|")"|"{"|"}" 分隔符正规式
"//".*|"/*"[^*]*"*/" 注释正规式
[ \\t\\n]+ 空白字符正规式

3.2 方案分析

1.三种方案对比表
对比维度方案一:手工基础词法分析方案二:手工错误处理词法分析方案三:Flex自动生成词法分析
实现方式 手工编码状态转换、字符匹配 手工编码+错误检测逻辑 正规式定义规则,工具自动生成
开发难度 中,需设计状态转换图 高,需新增错误边界判断 低,仅需编写词法规则
代码量 较大,分支逻辑多 大,错误处理代码冗余 极小,规则文件仅几十行
原理理解 高,掌握底层状态转换 极高,掌握错误处理机制 低,无需关注底层实现
维护性 差,修改规则需改全量代码 差,错误逻辑耦合度高 优,仅修改正规式即可
错误处理 支持5类指定错误检测 内置基础报错,定制化弱
适用场景 课程实验、原理学习 课程实验、错误机制验证 工业开发、快速迭代
执行效率 中,Python解释执行 中,Python解释执行 高,C语言编译执行
2.方案总结

(1)方案一:是词法分析的基础实现,核心价值是理解状态转换图与单词识别的底层逻辑,适合入门学习,但无错误处理,无法满足实际编译需求。

(2)方案二:是方案一的工程化增强,完整覆盖词法分析的核心功能+错误处理,是编译器前端的必备模块,适合深入学习词法错误检测机制。

(3)方案三:是工业级解决方案,通过正规式抽象简化开发,效率高、维护性好,是实际编译器开发的首选方案,适合工程实践。

(4)方案选择依据:实验一、二采用手工方案,贴合课程教学目标,夯实理论基础;实验三采用Flex方案,掌握实用工具,衔接工业开发。

4 实验测试

本次实验分三个独立模块测试,每个模块单独设计测试用例、明确测试点、输出测试结果、总结测试效果,总测试用例20组。

4.1 实验一测试:基础单词识别

1.测试方案:功能测试,设计8组标准用例,覆盖所有单词类型,验证识别准确性、格式规范性、文件输出正确性。

2.测试组数:8组,如表1所示。

3.测试输入:1.txt

4.测试输出:控制台+result.txt(单词文本 类别码 行号)

表1 实验一测试数据情况表

测试数据组数测试数据**(1.txt内容)**测试点测试输出结果测试效果
1 int main(){int a=123;} 关键字、标识符、十进制整数、分隔符 int 102 1main 700 1{ 301 1int 102 2a 700 2= 219 2123 400 2; 303 2} 302 3 全部正确识别,格式符合要求
2 float b=0x1A; 浮点数、十六进制整数 float 103 1b 700 1= 219 10x1A 400 1; 303 1 十六进制整数识别正确
3 char c=‘\\t’; 字符常量、转义字符 char 101 1c 700 1= 219 1\\t 500 1; 303 1 转义字符识别正确
4 char d=“test”; 字符串常量 char 101 1d 700 1= 219 1test 600 1; 303 1 字符串识别正确
5 if(a>=b&&c!=d){} 双字符运算符、逻辑运算符 if 111 1( 201 1a 700 1>= 207 1b 700 1&& 217 1c 700 1!= 216 1d 700 1) 202 1{ 301 1} 302 1 优先匹配双字符运算符,无错误
6 int e=0127; 八进制整数 int 102 1e 700 1= 219 10127 400 1; 303 1 八进制整数识别正确
7 float f=3.14; 标准浮点数 float 103 1f 700 1= 219 13.14 800 1; 303 1 浮点数识别正确
8 // 注释/ 多行注释 /return 0; 注释跳过、关键字 return 106 30 400 3; 303 3 注释完全跳过,无多余输出

实验一测试总结:8组用例全部通过,能准确识别Sample语言所有单词类型,格式化输出规范,result.txt文件写入正常,满足实验一要求。如图12所示。 在这里插入图片描述

图12 实验一测试结果

4.2 实验二测试:词法错误处理

1.测试方案:错误测试,设计7组错误用例,覆盖5类指定错误,验证错误检测准确性、编码输出正确性。

2.测试组数:7组,如表2所示。

3.测试输入:1.txt

4.测试输出:控制台+error.txt(行号 错误编码)

表2 实验二测试数据情况表

测试数据组数测试数据**(1.txt内容)**测试点测试输出结果测试效果
1 float x=20. ; 浮点数构词错误(102) 1 102 错误检测正确,编码匹配
2 int y=0189; 八进制数字构词错误(102) 1 102 错误检测正确
3 char z='ab; 字符常量未闭合(104) 1 104 错误检测正确
4 char m="test; 字符串未闭合(105) 1 105 错误检测正确
5 /*未闭合注释 多行注释未闭合(103) 1 103 错误检测正确
6 int n=@123; 非法字符(101) 1 101 错误检测正确
7 int p=0x; 十六进制构词错误(102) 1 102 错误检测正确

实验二测试总结:7组用例全部通过,精准识别5类指定词法错误,错误行号与编码输出完全匹配,error.txt文件写入正常,满足实验二要求。如图13所示。 在这里插入图片描述

图13 实验二测试结果

4.3 实验三测试:Flex自动生成

1.测试方案:功能测试,设计5组用例,验证Flex4个功能模块的正确性。

2.测试组数:5组,如表3所示。

3.测试输入:自定义测试文本

4.测试输出:控制台统计结果/识别结果

表3 实验三测试数据情况表

测试数据组数测试数据测试点测试输出结果测试效果
1 test01.txt(3行20字符) 字符数/行数统计 总行数:3,总字符数:20 统计准确
2 Test02.txt(int 123 abc) 标识符/整数识别 整数:123;标识符:int、abc 识别正确
3 test03.txt(IF 123 //注释) 去注释+关键字小写 if 123 去注释成功,关键字转小写
4 test04.txt(WHILE(a>b){}) 完整单词识别 【关键字】while;【标识符】a;【运算符】>等 全单词识别正确
5 error.txt(int @#$) 非法字符报错 【非法字符】@、#、$ 报错正确

实验三测试总结:5组用例全部通过,Flex生成的C代码可正常编译运行,4个功能模块均实现预期效果,满足实验三要求。输入文件,如图14所示;输出结果,如图15所示。 在这里插入图片描述 图14 输入文本文件

在这里插入图片描述 图15 输出结果

5 实验结论及分析

5.1 实验结论

本次编译原理词法分析实验全面达成预设实验目标,完整完成手工基础词法分析、词法错误检测、Flex自动生成词法分析器三大核心任务,所有测试用例均通过验证,实现了从理论原理到工程实践的全流程落地,具体结论如下:

  • 1.成功基于状态转换图手工实现Sample语言基础词法分析器,可精准识别关键字、标识符、多进制整数、浮点数、字符/字符串常量、运算符、分隔符等全部标准单词,完成单词文本、类别码、行号的标准化输出与result.txt文件持久化存储,验证了状态转换图在单词识别中的核心作用,符合词法分析基础功能要求。

  • 2.成功在基础词法分析框架上扩展5类核心词法错误处理模块,可精准检测非法字符、数字构词错误、多行注释未闭合、字符常量未闭合、字符串未闭合问题,按行号与唯一错误编码(101-105)上报错误,实现error.txt文件写入,构建了符合编译器工业标准的前端错误检测与上报机制。

  • 3.熟练掌握Flex词法自动生成工具的全流程使用,完成字符/行数统计、标识符/整数识别、去注释+关键字小写、完整Sample语言单词识别4组Flex程序开发,成功生成可编译运行的C语言词法分析代码,深刻理解正规式、有限自动机与自动生成代码的映射关系,掌握了工程化词法分析器的快速开发方法。

  • 4.通过三种实验方案的对比验证,明确了手工编码适合理论学习、Flex自动生成适合工程开发的核心差异,既夯实了词法分析底层原理的理解,又掌握了工业界实用工具,完成了词法分析全流程的理论与实践结合。

5.2 实验分析

5.2.1 关键问题解决

实验过程中针对词法分析的典型难点,通过针对性设计与逻辑优化完成问题攻克,保障了实验功能的完整性与准确性:

1.双字符运算符匹配冲突问题:实验初期出现=与==、>与>=等单/双字符运算符识别错乱的问题。通过采用最长匹配原则优化识别逻辑,先判断当前字符是否为双字符运算符前缀,再校验下一个字符是否可组成合法双字符运算符,优先匹配双字符运算符,无匹配时再识别单字符运算符/分隔符,结合预定义运算符-类别码字典,彻底解决符号识别冲突问题。

2.多行注释跨行扫描与未闭合漏检问题:多行注释以/开头、/结尾,易出现跨行文本书写导致未闭合错误漏检。通过设置全局注释状态标记,扫描到/时进入注释态,跨行文本书写时持续保持注释状态,直至匹配到/才退出注释态,若扫描至文件末尾仍未匹配闭合符号,立即上报注释未闭合错误,解决了跨行注释的检测难题。

3.词法错误漏报、误报问题:初期仅在总控程序做错误判断,存在数字构词、常量未闭合等错误漏报情况。通过模块化嵌入边界校验逻辑,在标识符、数字、常量、符号等独立识别函数中,分别添加对应场景的错误检测分支,针对不同错误类型设置精准判定条件,实现全场景错误覆盖,无漏报、误报。

5.2.2 实验收获

本次实验从理论、实践、工程思维三个层面,完成了编译原理词法分析模块的深度学习,核心收获如下:

1.理论层面:深入理解词法分析的核心本质是状态转换与字符模式匹配,掌握了状态转换图设计、关键字优先匹配、最长匹配等核心原理,明晰了词法分析作为编译器前端第一步,为语法分析、语义分析提供标准化Token序列的核心作用。

2.实践层面:掌握了手工编码词法分析器的全流程开发能力,从Token数据结构设计、状态迁移逻辑编写、文件IO操作到错误模块扩展,提升了代码模块化实现与调试能力;同时掌握Flex工具的工程化应用,理解正规式→NFA→DFA→C代码的自动生成逻辑,体会到工业级工具对开发效率的大幅提升。

3.工程思维:建立了编译器模块化、标准化、容错性的设计思想,理解错误隔离、精准上报、文件持久化是编译流程的基础保障,为后续语法分析、语义分析、中间代码生成等编译原理实验,奠定了完整的工程化开发思维。

5.2.3 改进方向

结合实验效果与编译原理工程实践要求,本次词法分析器仍有以下优化与扩展空间:

1.扩展词法规则与数据类型:当前仅支持基础整数、浮点数识别,可扩展科学计数法浮点数(1.23e4)、长整型、复数、字符数组等高级数据类型,补充Sample语言词法规范,适配更复杂的源码语法场景。

2.优化错误处理机制:现有错误仅上报行号,可新增列号精准定位、错误详情文字描述、错误分级(警告/致命错误) 功能;同时增加错误恢复机制,检测到错误后跳过当前错误字符/单词,继续扫描后续代码,而非直接跳行处理,提升词法分析的鲁棒性与调试效率。

3.完善编译流程衔接:将词法分析输出的Token序列封装为标准化接口,直接对接语法分析器(LL(1)、LR分析器),实现词法-语法分析的无缝联动,构建完整的编译器前端雏形;优化Token存储结构,提升语法分析读取Token的效率。

4.代码性能与可维护性优化:手工实现版本可重构代码,降低模块耦合度,拆分识别函数为独立组件,提升代码可维护性;Flex版本可优化正规式规则,删除冗余匹配逻辑,减少DFA状态数,提升词法扫描速度。

6 实验报告(电子版Word文档)

1.编译原理实验报告【词法分析实验】

2.解压包密码

7 实验源代码(python语言)

1.编译原理实验源代码【词法分析实验】

2.解压包密码

赞(0)
未经允许不得转载:171主机测评 » 〔重庆理工大学〕编译原理实验报告【词法分析实验】
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址