河北工业大学编译原理实验报告_第1页
河北工业大学编译原理实验报告_第2页
河北工业大学编译原理实验报告_第3页
河北工业大学编译原理实验报告_第4页
河北工业大学编译原理实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

编译原理实验报告 组员 韦廷廷 112455 熊敏 112456 马昊 113042 任课老师 吴 清 一 任务概述 本次实验我们要完成的任务主要是实现一个简单语言集的词法 语法和语义分析 程序 验证实际编译系统的实现方法 我们组的分工并不是词法分析 语法分析 语义分 析每人负责一个 而是先确定每种分析按照哪一种方法实现 然后每个人写出自己的想法 按照自己的想法实验 最后总结到一起 有问题大家一起讨论 共同商量解决的办法 二 系统设计 实验采用的实现方法和依据 语言中的各类单词符号及其分类码表语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值 begin1BEGIN end2END if3IF then4THEN else5ELSE 标识符6ID字母打头的字母数字串 无符号常数7UCON机内二进制表示 8LT 9LE 10EQ 11NE 12GT 13GE 14IS 15PL 16MI 17MU 18DI 实验采用的实现方法和依据 文法 E T E T E T T F T F T F F i E SLR 1 分析表分析表 ACTIONGOTO状状 态态 i ETF 0S4S5123 1S6S7Acc 2R3R3R3S8S9R3 3R6R6R6R6R6R6 4S4S51023 5R8R8R8R8R8R8 6S4S5113 7S4S5123 8S4S513 9S4S514 10S15S6S7 11R1R1R1S8S9R1 12R2R2R2S8S9R2 13R4R4R4R4R4R4 14R5R5R5R5R5R5 15R7R7R7R7R7R7 三 系统实现 包括必要的框图 各 h 和 c 文件说明 所有函数功能的说明 数据结构 各种表格 变量等的说明 以及函数调用关系图等 1 各 h 和 c 文件说明 Cifa cpp 的功能 字符串扫描识别 Table cpp 的功能 存放 SLR 分析法需要用到的 ACTION 和 GOTO 表 Yufa cpp 的功能 引用 Cifa cpp Table cpp 两个文件进行语法 语义的分析 2 函数功能说明 词法分析部分函数说明 int lookup char token 比较是否是关键字 int GetChar char ch 每调用一次 就把扫描指示器当前所指示的源程序字符送入字符变 量 ch 然后把扫描指示器前推一个字符位置 int HandleError void 报错函数 int EXCUTE int state int symbol 状态转换 int lookup char token 比较是否是关键字 void out int a char token 输出函数 void scanner example FILE fp 词法分析 语法 语义部分函数功能说明 void REPORT ERROR 报错函数 void Accept 语法成功接受 int INDEX char a 获取当前字符串对应的索引 void yuyi int n 语义子程序 void INPUT int a 语法分析程序 2 数据结构 各种表格 变量等的说明 Cifa cpp 中 char KeyWordTable MAX KEY NUMBER begin end if then else KEY WORD END 数组指针关键字 int w n p e d w 尾数累加器 n 小数位数计数器 p 指数累加器 e 指数符号标记 int Class 标识单词类型 Table cpp define MAXROW 16 行数 define MAXCOL 11 列数 int Table MAXROW MAXCOL Yufa cpp 中 define NUMBER 9 表达式的个数 int State MAXState 状态栈 int CURRENTSTATE 0 标识当前状态 int LENGTH NUMBER 1 3 3 1 3 3 1 3 1 表达式右边的长度 int Yes 0 判断是否结束 int tag 0 判断是否需要调用词法程序 四 系统工作过程及运行说明 使用操作指南 程序使用 在工程里创建一个 b txt 文件以识别算数运算表达式 五 源程序清单 要求有详细注释 和实例程序运行结果 源程序清单 Cifa cpp include include include include include define DIGIT 1 define POINT 2 define OTHER 3 define POWER 4 define ID 6 define UCON 7 define LT 8 define LE 9 define EQ 10 define NE 11 define GT 12 define GE 13 define IS 14 define PL 15 define MI 16 define MU 17 define DI 18 define zuokuohao 19 define youkuohao 20 define jin 21 define ClassOther 200 define EndState 1 define MAX KEY NUMBER 20 关键字的数量 define KEY WORD END END 关键字结束标记 char KeyWordTable MAX KEY NUMBER begin end if then else KEY WORD END 数组指针 char TOKEN 20 char ch int w n p e d w 尾数累加器 n 小数位数计数器 p 指数累加器 e 指数符号标记 int Class 标识单词类型 int ICON double FCON static int CurrentState 0 int result int start 0 指示程序的开始 int end 0 指示程序的结束 int GetChar void int EXCUTE int int int HandleOtherWord void return ClassOther int HandleError void printf Error n return 0 int lookup char token 比较是否是关键字 int n 0 while strcmp KeyWordTable n KEY WORD END strcmp 比较两串是否相同 若 相同返回 0 if strcmp KeyWordTable n token 比较 token 所指向的关键字和保留字表中哪个关键字相 符 return n 1 根据单词分类码表 I 设置正 确的关键字类别码 并返回此类别码的值 break n return 0 单词不是关键字 而是标识符 int GetChar char a char c a if isdigit c d c 0 字符 c 与字符 0 的 ascii 码差值 返回类型为一个整数 return DIGIT if c return POINT if c E c e return POWER if c return PL if c return MU return OTHER void report error printf 错误 n void out1 int a char token 输出函数 switch a case 1 printf BEGIN n break case 2 printf END n break case 3 printf IF n break case 4 printf THEN n break case 5 printf ELSE n break case 6 printf ID s n token break case 8 printf LT s n token break case 9 printf LE s n token break case 10 printf EQ s n token break case 11 printf NE s n token break case 12 printf GT s n token break case 13 printf GE s n token break case 14 printf IS s n token break case 15 printf PL s n token break case 16 printf MI s n token break case 17 printf MU s n token break case 18 printf DI s n token break case 19 printf n break case 20 printf n break default report error break int out int a switch a case 7 return 6 break 常量 case 15 return 2 break case 16 return 3 break case 17 return 4 break case 18 return 5 break case 19 return 0 break case 20 return 1 break case 21 return 7 break case 22 return 100 break 判断是否是空格或 换行 case 26 return 26 break 标识符 default return 001 report error break void scanner example FILE fp 文件扫描器 int i c ch fgetc fp if ch ch n scanner example fp else if isalpha ch 判断是否是英文字母 TOKEN 0 ch ch fgetc fp i 1 while isalnum ch TOKEN i ch i ch fgetc fp TOKEN i 0 fseek fp 1 1 retract c lookup TOKEN if c 0 printf 算术表达式不需要 n result out 26 标识符 else if c 1 start 1 out1 c if c 2 end 1 out1 c else if isdigit ch ch 判断是否是数字 或 i 0 TOKEN i ch if isdigit ch d ch 0 字符 c 与字符 0 的 ascii 码差值 返回类型为一个整数 EXCUTE CurrentState DIGIT if ch EXCUTE CurrentState POINT if ch E ch e EXCUTE CurrentState POWER if ch EXCUTE CurrentState PL if ch EXCUTE CurrentState MU while CurrentState EndState TOKEN i ch i ch fgetc fp int c GetChar ch EXCUTE CurrentState c TOKEN i 0 fseek fp 1 1 printf UCON g n FCON result out UCON else switch ch 关系运算符 case out1 NE else fseek fp 1 1 printf 算术表达式不需要 n out UCON break case printf 算术表达式不需要 n out EQ break case ch fgetc fp if ch printf 算术表达式不需要 n out GE else fseek fp 1 1 printf 算术表达式不需要 n out GT break case ch fgetc fp if ch printf 算术表达式不需要 n out IS break case result out PL break case result out MI break case result out MU break case result out DI break case result out zuokuohao break case result out youkuohao break case result out jin break case EOF break default report error break return int EXCUTE int state int symbol switch state case 0 switch symbol case DIGIT n 0 p 0 e 1 w d CurrentState 1 Class UCON break case POINT w 0 n 0 p 0 e 1 CurrentState 3 Class UCON break default HandleOtherWord Class ClassOther CurrentState EndState break case 1 switch symbol case DIGIT w w 10 d break CurrentState 1 case POINT CurrentState 2 break case POWER CurrentState 4 break default FCON w CurrentState EndState break case 2 switch symbol case DIGIT n w w 10 d break case POWER CurrentState 4 break default FCON w pow 10 e p n CurrentState EndState break case 3 switch symbol case DIGIT n w w 10 d CurrentState 2 break default HandleError CurrentState EndState break case 4 switch symbol case DIGIT p p 10 d CurrentState 6 break case MU e 1 CurrentState 5 break case PL e 1 CurrentState 5 break default HandleError CurrentState EndState break case 5 switch symbol case DIGIT p p 10 d CurrentState 6 break default HandleError CurrentState EndState break case 6 switch symbol case DIGIT p p 10 d break default FCON w pow 10 e p n CurrentState EndState break return CurrentState int cifa FILE fp CurrentState 0 初始 0 状态 scanner example fp return result Table cpp include include include include include define MAXROW 16 行数 define MAXCOL 11 列数 define S1 1 define S2 2 define S3 3 define S4 4 define S5 5 define S6 6 define S7 7 define S8 8 define S9 9 define S10 10 define S11 11 define S12 12 define S13 13 define S14 14 define S15 15 define R1 21 define R2 22 define R3 23 define R4 24 define R5 25 define R6 26 define R7 27 define R8 28 define acc 100 SLR 1 分析表 21 30 表示规约 1 20 表示移近 0 报错 int Table MAXROW MAXCOL S4 0 0 0 0 0 S5 0 S1 S2 S3 0 0 S6 S7 0 0 0 acc 0 0 0 0 23 23 23 8 9 0 23 0 0 0 0 26 26 26 26 26 0 26 0 0 0 4 0 0 0 0 0 5 0 10 2 3 0 28 28 28 28 28 0 28 0 0 0 4 0 0 0 0 0 5 0 0 11 3 4 0 0 0 0 0 5 0 0 12 3 4 0 0 0 0 0 5 0 0 0 13 4 0 0 0 0 0 5 0 0 0 14 0 15 6 7 0 0 0 0 0 0 0 0 21 21 21 8 9 0 21 0 0 0 0 22 22 22 8 9 0 22 0 0 0 0 24 24 24 24 24 0 24 0 0 0 0 25 25 25 25 25 0 25 0 0 0 0 27 27 27 27 27 0 27 0 0 0 Yufa cpp include include include include include include cifa cpp include table cpp define PL 15 define MI 16 define MU 17 define DI 18 define acc 100 define MAXState 20 define NUMBER 9 表达式的个数 define MAXTEMP 10 最多临时变量的个数 int State MAXState 状态栈 int i 0 int CURRENTSTATE 0 标识当前状态 int LENGTH NUMBER 1 3 3 1 3 3 1 3 1 表达式右 边的长度 int length int index 索引 int Yes 0 判断是否结束 int tag 0 判断是否需要调用词法程序 extern char cifa double e1 t4 f7 整形 char e12 20 t42 20 f72 20 字符型 int TEMP MAXTEMP int temp 0 int biaoshifu 0 FILE fp void REPORT ERROR Yes 1 long f1 ftell fp char ch fgetc fp fseek fp 1 1 printf 语法错误 第 d 个字符 C 处 n f1 ch void Accept Yes 1 printf 语法分析成功 n int INDEX char a 获取当前字符串对应的索引 int i switch a case E i 8 return i break case T i 9 return i break case F i 10 return i break default REPORT ERROR return 0 break void Gen int a double i1 double i2 int t 输出四元式 switch a case PL printf g g d n i1 i2 t break case MI printf g g d n i1 i2 t break case MU printf g g d n i1 i2 t break case DI printf g g d n i1 i2 t break default break void yuyi int n 语义子程序 switch n case 1 temp 产生临时变量 Gen PL e1 t4 temp e1 temp break case 2 temp 产生临时变量 TEMP temp Gen MI e1 t4 temp e1 temp break case 3 e1 t4 break case 4 temp Gen MU t4 f7 temp t4 temp break case 5 temp Gen DI t4 f7 temp t4 temp break case 6 t4 f7 break case 7 f7 e1 break case 8 f7 FCON break default printf error n break void Gen2 int a char i1 char i2 int t 输出四元式 switch a case PL printf s s d n break case MI printf s s d n break case MU printf s s d n break ca

温馨提示

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

评论

0/150

提交评论