编译原理实验指导书(2013-2014)_第1页
编译原理实验指导书(2013-2014)_第2页
编译原理实验指导书(2013-2014)_第3页
编译原理实验指导书(2013-2014)_第4页
编译原理实验指导书(2013-2014)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理实验指导书编译原理实验指导书 合肥学院计算合肥学院计算 编译原理实验指导书编译原理实验指导书 实验一 词法分析 一 实验目的 通过设计编制调试一个具体的词法分析程序 加深对词法分析原理的理解 并 掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析 方法 编制一个读单词过程 从输入的源程序中 识别出各个具有独立意义的 单词 即基本保留字 标识符 常数 运算符 分隔符五大类 并依次输出各 个单词的内部编码及单词符号自身值 遇到错误时可显示 Error 然后跳 过错误部分继续显示 二 实验预习提示 1 词法分析器的功能和输出格式 词法分析器的功能是输入源程序 输出单词符号 词法分析器的单词符号常常 表示成以下的二元式 单词种别码 单词符号的属性值 本实验中 采用的是 一类符号一种别码的方式 2 单词的 BNF 表示 字母数字串 字母数字串 无符号整数 3 超前搜索 方法 词法分析时 常常会用到超前搜索方法 如当前待分析字符串为 当前 字符为 此时 分析器倒底是将其分析为大于关系运算符还是大于等于关系 运算符呢 显然 只有知道下一个字符是什么才能下结论 超前读了一个字符 所以要回退一个字符 词法分析器才能正常运行 在分析标识符 无符号 整数等时也有类似情况 4 模块结构 三 实验过程和指导 一 准备 1 阅读课本有关章节 明确语言的语法 写出基本保留字 标识符 常数 运 算符 分隔符和程序例 2 初步编制好程序 3 准备好多组测试数据 二 上课上机 将源代码拷贝到机上调试 发现错误 再修改完善 第二次上机调试通过 三 程序要求 程序输入 输出示例 如源程序为 C 语言 输入如下一段 main int a b a 10 b a 20 要求输出如下图 2 main 5 5 5 1 int 2 a 5 2 b 5 2 a 4 3 10 5 2 b 4 2 a 4 3 20 5 5 要求 识别保留字 if int for while do return break continue 单词种别码为 1 其他的都识别为标识符 单词种别码为 2 常数为无符号整形数 单词种别码为 3 运算符包括 为实现算符优先算法 可以使用两个工作栈 一个叫做 OPTR 用以寄存运算符 一个叫 OPND 用以寄存操作数或结果 算法描述如下 1 首先置操作数栈为空栈 将表达式起始符 作为运算符栈的栈底元素 2 依次读入表达式中每个单词 若是操作数则进 OPND 栈 若是运算符则转 3 3 将此运算符 1 与 OPTR 栈顶元素 2 进行比较 即查上表 若 1 2 则 1 进栈 转 2 若 1 2 如 1 为 则分析成功 否则 OPTR 栈顶元素出栈 并转 2 若 1 2 则出栈 OPND 栈顶元素至 b 又出栈其栈顶元素至 a 出栈 OPTR 栈顶元素至 t 进行运算 r a t b t 为运算符 并将结果 r 存入栈 OPND 后转 3 若 1 和 2 之间无优先关系 则报错 四 实验步骤四 实验步骤 一 准备 1 阅读课本有关章节 花一周时间确定算术表达式的文法 设计出算符优先关系表 2 考虑好设计方案 3 设计出模块结构 测试数据 初步编制好程序 二 上课上机 上机调试 发现错误 分析错误 再修改完善 教师根据学生的设计方案 与学生进行探讨 以修改方案和代码 三 程序要求 程序思路 仅供参考 1 借用实验一的结果 可将其中的取字符函数几乎原封不动地移植过来 其中的分割和分 析单词的方法可借用过来分割现在这个实验的运算符 常量和变量 2 模块结构 1 初始化 设立算符优先关系表 或优先函数 初始化变量空间 包括 堆栈 结构体 数组 临时变量等 2 控制部分 将一个表达式从文件中读出 3 词法分析 将表达式分割成单词序列 4 利用算符优先文法进行表达式处理 根 据算符优先关系表 或优先函数 对表达式单词序列进行堆栈 或其他 操作 得到并保 存四元组 如果遇到错误则显示错误信息 5 输出四元组 3 程序输入 输出示例 如参考 C 语言的运算符 输入如下表达式 以分号为结束 和输出结果 1 10 输出 正确 2 1 2 输出 正确 3 1 2 3 4 5 6 7 输出 正确 4 1 2 3 4 输出 错误 5 1 2 3 4 5 输出 错误 注意 1 为降低难度 表达式中不含变量 只含无符号整数 2 如果遇到错误的表达式 应输出错误提示信息 该信息越详细越好 3 测试用的表达式事先放在文本文件中 一行存放一个表达式 同时以分号分割 同时将 预期的输出结果写在另一个文本文件中 以便和输出进行对照 4 对学有余力的同学 可增加功能 当判断一个表达式正确时 输出计算结果 计算过程 用浮点表示 但要注意不要被 0 除 附实验报告范例附实验报告范例 实验名称 词法分析实验名称 词法分析 一 实验目的和要求一 实验目的和要求 编制一个读单词过程 从输入的源程序中 识别出各个具有独立意义的单词 即基本保留 字 标识符 常数 运算符 分隔符五大类 二 实验内容和步骤 二 实验内容和步骤 实验内容实验内容 对于这个实验 我总共用了四个函数 即主函数 扫描函数 建立缓冲区 取单词 主要 完成的功能是从缓冲区中识别出一个个单词 并能够区分所取的单词是什么类型 实验步骤实验步骤 1 基于实验的内容 构造程序所需的模块 2 根据已建构的模块 写出各个模块的相应程序代码 3 在主函数中调用模块来完成所要得到的效果 在此 我想先介绍一下我的三个子模块 第一个是扫描函数 扫描函数 scanner 其实 大家都比较熟悉了 就是我们上次实验内容 可以原封不动的拿来用 它的功能是调用一 次就从缓冲区中取一个字符出来 这为我们的取字符提供了基础 因此如果这个程序不会 设计的话 那么这个实验就没法设计了 至于建立第二个模块 就是从文件中把一个个字 符读到缓冲区 比较简单 我在这里就不想说了 接下来 我想比较地说一下第三个模块 也就是本实验的主要要求 这个模块的函数程序代码如下 char getsym 从缓冲区中取一个单词 bool flag false 用来表示取出的单词是否为关键词 如果是则 flag 的值为 true 否 则为 false int k 1 表示取出的字符放在单词数组的指针 CType 0 预先定义的取出的单词的类型 Lasttype 0 初始化先前的类型 此变量为判断正负数用 while ch0 去掉不能显示的字符 Fbuffer scanner if ch a while true 取出的单词长度不超过 WMaxlen 如果超过 则其后的字符无效 if k a Word k 0 以 0 标识取出单词的结束 以方便后面的判断此单词是标识符还是关键词 for int i 0 i 0 Fbuffer scanner else CType 3 break 不是数字则跳出循环 如果以字母开头 且长度不超过 WMaxlen 且下面跟有字母 则此整数非法 输出类型 为 8 在主程序中输出出错信息 if k a else CType Errtype 否则返回类型 7 在主程序出错 并明确写出此单词的具体内容 Word k 0 else if ch ch ch ch 取出是运算符号的单词 Word k ch if ch ch 如果是 号或者是 号 则还要判断是不是正负数 if Lasttype 6 判断其取出的当前字母的前一个单词是 6 号类型的 即是 时则可判断现在取出的是整数 Fbuffer scanner while ch 0 Fbuffer scanner if ch 判断是不是 Word k ch Fbuffer scanner Word k 0 for int i 0 i Sign No i 判断取出的单词是不是运算符 if strcmp Sign i Word 0 flag true break if flag CType 4 Lasttype 6 else if ch ch ch ch ch ch 判断当前取出的 单词是不是界符 如果是界符 则定义其类型为 5 CType 5 Word k ch Word k 0 Fbuffer scanner return CType 此函数返回一个识别出来的单词的类型 其实还返回一个值 那就是识别出来的单词 这样为主程序的输出提供方便 在此函数中调用了扫描程序 调用一次就判别是否当前在 取的单词已经结束 所以这样子的话 在取另一个单词时 已经从缓冲区取出了一个字符 这为单词的选取以及主程序判别程序是否结束提供了方便 其实这也是主程序在开始调用 这个函数之前这前就先在缓冲区中取了一个字符的原因 这几个函数中 主函数调用了三个函数 getsym 调用了 source 函数 四 实验过程记录四 实验过程记录 1 出现致命错误 原因分析 原来把定义取出单词的最大长度放在缓冲区中的最大长度上了 解决 把缓冲区的长度重新定义一下 2 答案错 0 误 老是在输出的答案中多出一个 0 字符 原因分析 定义存放在单词字符串中的指针初始值为 1 结果在 while true 以后做赋 值操作 这样就多出一个字符 while true if k WMaxlen k Word k ch 解决 改为如下即可 while true if k WMaxlen k Word k ch 3 在字母后老是多一个数字 2 原因分析 定义的标识符有关系 可能与前一个相冲突了 解决 把 WType 改为 CType 4 有些输出的类型不相匹配 原因分析 在类型赋值时 由于考虑的条件比较多 没有考虑到在同一种情况下的另一个 分支类别是不同的 解决 用 return type 语句使得在已经知道确定的类型后 让程序即时返回 免得其类型 在后面又被赋值 5 程序不能结束 原因分析 在截掉多出的字符后 没让程序把缓冲区中的字符读完 导致程序又开始读同 一个单词后的几个字母 解决 截取后 让其在分程序中读完此单词并设立标志使其结束 五 实验总结五 实验总结 共花时五个小时 半个小时思考 其它的都是在电脑上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论