《编译原理标准实验报告》由会员分享,可在线阅读,更多相关《编译原理标准实验报告(26页珍藏版)》请在金锄头文库上搜索。
1、电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:词法分析器的设计与实现三、实验学时:4 学时四、实验原理1.编 译 程 序 要 求 对 高 级 语 言 编 写 的 源 程 序 进 行 分 析 和 合 成 , 生 成 目 标 程序 。 词 法 分 析 是 对 源 程 序 进 行 的 首 次 分 析 , 实 现 词 法 分 析 的 程 序 为 词 法 分 析程 序 。2.词 法 分 析 的 功 能 是 从 左 到 右 逐 个 地 扫 描 源 程 序 字 符 串 , 按 照 词 法 规 则识 别 出
2、单 词 符 号 作 为 输 出 , 对 识 别 过 程 中 发 现 的 词 法 错 误 , 输 出 相 关 信 息 。3.状 态 转 换 图 是 有 限 有 向 图 , 是 设 计 词 法 分 析 器 的 有 效 工 具 。5、实验目的通 过 设 计 词 法 分 析 器 的 实 验 , 使 同 学 们 了 解 和 掌 握 词 法 分 析 程 序 设 计 的原 理 及 相 应 的 程 序 设 计 方 法 , 同 时 提 高 编 程 能 力 。6、实验内容实 现 求 n! 的 极 小 语 言 的 词 法 分 析 程 序 , 返 回 二 元 式 作 为 输 出 。七、实验器材(设备、元器件)1. 操
3、 作 系 统 : Windows XP2. 开 发 工 具 : VC6.03. 普 通 PC 即 可8、实验步骤( 1) 启 动 VC6.0, 创 建 空 白 工 程 项 目 。 选 择 菜 单 中 的 “文 件 ”-“新 建 ”-“项 目 ”, 在 弹 出 的 对 话 框 中 , 左 边 的 “项 目 类 型 ”框 中 ,选 择 “Visual C+ 项 目 ”, 在 右 边 框 中 , 选 择 “空 项 目 (.Net)”, 在 对话 框 下 边 , 选 择 工 程 文 件 存 放 目 录 及 输 入 名 称 , 如 Example1, 单 击“确 定 ”。( 2) 建 立 相 应 的 单
4、 词 符 号 与 种 别 对 照 表 ;( 3) 根 据 状 态 转 换 图 编 写 相 应 的 处 理 函 数 ;( 4) 完 成 词 法 分 析 器 ;( 5) 编 译 与 调 试 以 上 程 序 ;( 6) 生 成 相 应 的 *.dyd 文 件 , 作 为 后 面 语 法 分 析 的 输 入 文 件 。9、实验数据及结果分析 可 以 对 源 程 序 进 行 词 法 分 析 , 如 果 有 错 给 出 出 错 信 息 和 所 在 行 数 , 如 果无 错 则 生 成 二 元 式 文 件 。10、实验结论本 实 验 程 序 较 好 地 完 成 了 词 法 分 析 程 序 的 设 计 与 实
5、 现 , 能 够 对 所 给 文 法的 程 序 进 行 词 法 分 析 , 在 没 有 词 法 错 误 的 时 候 生 成 相 应 的 二 元 式 文 件 。 该 实验 程 序 可 一 次 性 给 出 源 程 序 中 的 词 法 错 误 。十一、总结及心得体会通 过 该 实 验 , 对 词 法 分 析 程 序 的 设 计 , 以 及 运 用 C 语 言 进 行 编 程 有 了更 深 刻 的 理 解 , 同 时 加 深 了 自 己 对 词 法 分 析 程 序 的 原 理 的 理 解 与 掌 握 , 提 高了 自 己 的 动 手 能 力 。十二、对本实验过程及方法、手段的改进建议程 序 设 计 合
6、 理 , 代 码 可 进 一 步 优 化 。报告评分:指导教师签字:本 实 验 参 考 源 代 码 如 下 :#include #include #include using namespace std;char ch,cache;bool retracted,ended;int num,cur_line;string token;void clear_output()freopen(example.dyd,w,stdout);fclose(stdout);freopen(LexAnalyze.err,w,stdout);fclose(stdout);struct pair_valstring
7、 s;int val;void getnbc()if (retracted)ch=cache;retracted=false;else ch=getchar();while (ch= |ch=n)if (ch=n)printf(%16s 24n,EOLN);cur_line+;ch=getchar();void concat()token+=ch;bool letter()if (ch=Areturn false;bool digit()if (ch=0return false;void retract()retracted=true;cache=ch;int reserve()if (tok
8、en=begin) return 1;if (token=end) return 2;if (token=integer) return 3;if (token=if) return 4;if (token=then) return 5;if (token=else) return 6;if (token=function) return 7;if (token=read) return 8;if (token=write) return 9;return 0;void return_val(pair_val v)freopen(example.dyd,a+,stdout);while (v.
9、s.length()ret.s=;ret.val=13;return_val(ret);else if (ch=)ret.s=:ch=getchar();if (ch=)ret.s=;ret.val=16;return_val(ret);elseretract();ret.s=;ret.val=17;return_val(ret);break;case -:ret.s=-;ret.val=18;return_val(ret);break;case *:ret.s=*;ret.val=19;return_val(ret);break;case :ch=getchar();if (ch=)ret.
10、s=:=;ret.val=20;return_val(ret);else error(0);break;case (:ret.s=(;ret.val=21;return_val(ret);break;case ):ret.s=);ret.val=22;return_val(ret);break;case ;:ret.s=;ret.val=23;return_val(ret);break;default:error(1);int main()freopen(example.pas,r,stdin);clear_output();retracted=ended=false;cur_line=1;w
11、hile (!ended)LexAnalyze();return 0;电 子 科 技 大 学实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:一、实验室名称:计算机学院软件工程实验室二、实验项目名称:递归下降分析器的设计与实现三、实验学时:12 学时四、实验原理1.语 法 分 析 是 对 源 程 序 经 过 词 法 分 析 后 转 换 成 的 单 词 流 按 方 法 规 则 进 行判 断 , 对 能 构 成 正 确 句 子 的 单 词 流 , 给 出 相 应 的 语 法 树 ; 对 不 能 构 成 正 确 句子 的 单 词 流 判 断 其 语 法 错 误 并 做 出 相 应
12、处 理 。2.语 法 分 析 方 法 有 自 上 而 下 和 自 下 而 上 的 分 析 方 法 。 在 不 含 左 递 归 的 文法 G 中 , 如 果 对 每 一 个 非 终 结 符 的 所 有 候 选 式 的 第 一 个 终 结 符 都 是 两 两 不 相交 的 ( 即 无 公 共 左 因 子 ) , 则 可 能 构 造 出 一 个 不 带 回 溯 的 自 上 而 下 的 分 析 程序 , 这 个 分 析 程 序 由 一 组 递 归 过 程 组 成 , 每 个 过 程 对 应 文 法 的 一 个 非 终 结 符 。这 样 的 分 析 程 序 称 为 递 归 下 降 分 析 程 序 。7、
13、实验目的通 过 设 计 递 归 下 降 分 析 器 的 设 计 与 实 现 实 验 , 使 同 学 们 掌 握 自 上 而 下 的递 归 分 析 法 的 语 法 分 析 原 理 和 程 序 设 计 方 法 。8、实验内容根 据 给 定 的 方 法 , 编 写 相 应 的 递 归 下 降 的 语 法 分 析 程 序 , 实 现 对 词 法 分析 后 的 单 词 序 列 的 语 法 检 查 和 程 序 结 构 的 分 析 , 生 成 相 应 的 变 量 名 表 和 过 程名 表 , 并 将 编 译 中 语 法 检 查 出 来 的 错 误 写 入 相 应 的 文 件 。语法错分类:(1)缺少符号错
14、;(2)符号匹配错(3)符号无定义或重复定义。七、实验器材(设备、元器件)1.操 作 系 统 : Windows XP2.开 发 工 具 : VC6.03.普 通 PC 即 可10、实验步骤( 1) 启 动 VC6.0, 创 建 空 白 工 程 项 目 。 选 择 菜 单 中 的 “文 件 ”-“新 建 ”-“项 目 ”, 在 弹 出 的 对 话 框 中 , 左 边 的 “项 目 类 型 ”框 中 ,选 择 “Visual C+ 项 目 ”, 在 右 边 框 中 , 选 择 “空 项 目 (.Net)”, 在 对话 框 下 边 , 选 择 工 程 文 件 存 放 目 录 及 输 入 名 称 ,
15、 如 Example1, 单 击“确 定 ”。( 2) 消 除 文 法 中 的 左 递 归 ;( 3) 实 现 对 方 法 进 行 递 归 向 下 的 分 析 过 程 ;( 4) 利 用 词 法 分 析 器 生 成 的 二 元 式 文 件 *.dyd 进 行 语 法 分 析 ;( 5) 编 译 与 调 试 以 上 程 序 ;11、实验数据及结果分析 可 以 对 源 程 序 进 行 语 法 分 析 , 图 中 给 出 了 出 错 行 数 及 出 错 类 型 。11、实验结论本 实 验 程 序 较 好 地 完 成 了 递 归 下 降 分 析 器 的 设 计 与 实 现 , 能 够 对 所 给 文法 的 程 序 进 行 语 法 分 析 , 生 成 变 量 名 表 和 过 程 名 表 , 如 果 源 程 序 有 语 法 错 误则 给 出 出 错 类 型 及 所 在 行 数 。十一、总结及心得体会通 过 该 实 验 , 对 递 归 下 降 分 析 程 序 的 设 计 , 以 及 运 用 C 语 言 进 行 编 程有 了 更 深 刻 的 理 解 , 同 时 加 深