〔重庆理工大学〕编译原理实验报告【词法分析实验】
《编译原理》实验报告第 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启动匹配首字符合法则进入S1S1为自循环状态持续匹配合法字符直至遇到非标识符字符完成单词截取。识别逻辑采用关键字优先匹配策略内置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. 记录起始位置startpos 2. 循环若字符是字母/数字/下划线pos1 3. 截取单词lexemeline[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. 返回Token3字符/字符串常量识别字符常量限定为单个字符兼容转义字符适配语言基础语法字符串常量支持任意长度字符序列转义字符处理保证特殊字符正常识别。两种常量均以闭合引号为结束标志识别完成后绑定对应类别码与其他单词类型明确区分。伪代码如下字符常量 1. 跳过单引号读取字符支持\n/\t转义 2. 匹配结束单引号截取内容类别码500 字符串常量 3. 跳过双引号读取内容支持转义 4. 匹配结束双引号截取内容类别码6004运算符/分隔符识别最长匹配策略是运算符识别的关键可有效避免与、与等符号的识别冲突。通过字典映射快速获取类别码代码简洁高效支持后续新增运算符/分隔符时快速扩展提升程序可维护性。伪代码如下1. 优先匹配双字符运算符、、等 2. 无匹配则匹配单字符运算符/分隔符 3. 查字典获取类别码返回Token3.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 字符串无结束双引号 → 1053.1.3 方案三Flex自动生成词法分析器核心目标基于正规式定义词法规则使用Flex工具自动生成C语言词法分析器摆脱手工编码状态转换图的繁琐工作依次编写4组Flex源程序lex01-len04分别实现文本字符/行数统计、标识符/整数识别、去注释关键字小写、完整Sample语言单词识别四大功能完成Flex规则文件编译、C代码生成、可执行程序构建、测试文件验证全流程理解正规式与有限自动机的映射关系掌握工业级词法分析器的快速开发方法验证自动生成方案的高效性与稳定性。1.Flex工作流程流程图图7 Flex工作流程流程图2.4组Flex程序流程图正规式规则说明1lex01.l文本字符/行数统计本程序是Flex入门级应用通过全局变量line_count统计行数、char_count统计字符数。换行符\n同时触发行数与字符数累加普通字符仅触发字符数累加yyin为Flex默认文件指针绑定测试文件后由yylex()自动扫描yywrap()为文件结束回调函数实现单程序多文件循环统计满足文本基础统计需求。*A.文本字符/行数统计流程图*图8 文本字符/行数统计流程图*B.文本字符/行数统计核心正规式*\n 匹配换行符 . 匹配任意单个字符2lex02.l标识符/整数识别本程序通过正规式抽象定义标识符与整数规则无需手工编写状态迁移逻辑。{DIGIT}匹配一个或多个数字判定为整数{ID}匹配符合命名规则的标识符Flex按规则书写顺序优先匹配非目标字符直接忽略实现精准、高效的单词筛选是词法分析核心功能的简化实现。*A.标识符/整数识别流程图*图9 标识符/整数识别流程图*B.标识符/整数识别核心正规式*DIGIT [0-9] // 数字集合 ID [a-zA-Z_][a-zA-Z0-9_]* // 标识符正规式3lex03.l去注释关键字小写本程序实现代码预处理核心功能通过正规式匹配所有类型注释匹配后直接忽略实现去注释效果大写关键字匹配后强制转换为小写输出统一代码风格普通字符原样输出保留有效代码逻辑。无需修改源码即可完成代码规范化处理是编译器前端预处理的典型应用。*A.去注释关键字小写流程图*图10 去注释关键字小写流程图*B.去注释关键字小写核心正规式*IF/THEN/BEGIN/END/WHILE/REPEAT 大写关键字 /*[^*]**/ 多行注释匹配 //.* 单行注释匹配 {[^}]*} 自定义{}注释匹配4lex04.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.txt4.测试输出控制台result.txt单词文本 类别码 行号表1 实验一测试数据情况表测试数据组数测试数据**1.txt内容**测试点测试输出结果测试效果1int main(){int a123;}关键字、标识符、十进制整数、分隔符int 102 1main 700 1{ 301 1int 102 2a 700 2 219 2123 400 2; 303 2} 302 3全部正确识别格式符合要求2float b0x1A;浮点数、十六进制整数float 103 1b 700 1 219 10x1A 400 1; 303 1十六进制整数识别正确3char c‘\t’;字符常量、转义字符char 101 1c 700 1 219 1\t 500 1; 303 1转义字符识别正确4char d“test”;字符串常量char 101 1d 700 1 219 1test 600 1; 303 1字符串识别正确5if(abc!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优先匹配双字符运算符无错误6int e0127;八进制整数int 102 1e 700 1 219 10127 400 1; 303 1八进制整数识别正确7float f3.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.txt4.测试输出控制台error.txt行号 错误编码表2 实验二测试数据情况表测试数据组数测试数据**1.txt内容**测试点测试输出结果测试效果1float x20. ;浮点数构词错误1021 102错误检测正确编码匹配2int y0189;八进制数字构词错误1021 102错误检测正确3char zab;字符常量未闭合1041 104错误检测正确4char mtest;字符串未闭合1051 105错误检测正确5/*未闭合注释多行注释未闭合1031 103错误检测正确6int n123;非法字符1011 101错误检测正确7int p0x;十六进制构词错误1021 102错误检测正确实验二测试总结7组用例全部通过精准识别5类指定词法错误错误行号与编码输出完全匹配error.txt文件写入正常满足实验二要求。如图13所示。图13 实验二测试结果4.3 实验三测试Flex自动生成1.测试方案功能测试设计5组用例验证Flex4个功能模块的正确性。2.测试组数5组如表3所示。3.测试输入自定义测试文本4.测试输出控制台统计结果/识别结果表3 实验三测试数据情况表测试数据组数测试数据测试点测试输出结果测试效果1test01.txt3行20字符字符数/行数统计总行数3总字符数20统计准确2Test02.txtint 123 abc标识符/整数识别整数123标识符int、abc识别正确3test03.txtIF 123 //注释去注释关键字小写if 123去注释成功关键字转小写4test04.txtWHILE(ab){}完整单词识别【关键字】while【标识符】a【运算符】等全单词识别正确5error.txtint #$非法字符报错【非法字符】、#、$报错正确实验三测试总结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.解压包密码