logo资料库

编译原理课程设计报告.doc

第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
资料共37页,剩余部分请下载后查看
一、课程设计任务
1.1目的:
扩充PL/0编译程序功能
1.2要求:
二、设计目的
三、主要思想
四、主要变量说明
4.1指令说明
4.2符号说明
4.3函数说明
五、算法描述
5.1 ++、--、+=、-=、*=、/=
5.2 求余%
5.3 开方@
5.4 注释
5.5 for循环
5.6 if-then-else
5.7 错误提示
在error()中添加:
5.8 标示符或变量中可以有下划线
在词法分析getsym()中修改:
六、PL/0程序结构
七、运行结果及调试情况
7.1 ++ ,-- ,+= ,-=,*=,/=,@
7.2 for
7.3 if-then-else
7.4 处理注释,标识符中带下划线,不等于操作
7.5 错误提示
八、设计技巧
九、心得体会
燕山大学 编译原理课程设计报告 题目:扩展 PL/0 编译程序功能 信息学院 学 院 年级专业 学生姓名 学 号 设计日期
目录 一、课程设计任务 ......................................... 3 1.1 目的: ............................................. 3 1.2 要求: ............................................. 3 二、设计目的 ............................................. 3 三、主要思想 ............................................. 3 四、主要变量说明 ......................................... 4 4.1 指令说明 ........................................... 4 4.2 符号说明 ........................................... 5 4.3 函数说明 ........................................... 5 五、算法描述 ............................................. 7 5.1 ++、--、+=、-=、*=、/= ............................. 7 5.2 求余% ............................................. 18 5.3 开方@ ............................................. 19 5.4 注释 .............................................. 22 5.5 for 循环 .......................................... 22 5.6 if-then-else ...................................... 24 5.7 错误提示 .......................................... 26 5.8 标示符或变量中可以有下划线 ........................ 30 六、PL/0 程序结构 ....................................... 31 七、运行结果及调试情况 .................................. 32 7.1 ++ ,-- ,+= ,-=,*=,/=,@ ...................... 32 7.2 for ............................................... 33 7.3 if-then-else ...................................... 34 7.4 处理注释,标识符中带下划线,不等于操作 ............ 34 7.5 错误提示 .......................................... 35 八、设计技巧 ............................................ 35 九、心得体会 ............................................ 35 2
一、课程设计任务 1.1 目的: 扩充 PL/0 编译程序功能 1.2 要求: (1)阅读、研究 PL/0 编译程序源文件。 (2)在上述工作基础上,可有选择地补充、完善其中词法分析、语法分 析、语义分析、目标代码生成、目标代码解释执行等部分的功能。如以 语法分析部分为例,则可以增加处理更多语法成分的功能,如可处理一 维数组、++、--、+=、-=、*=、/=、%(取余)、!(取反)、repeat、 for、else、开方、处理注释、错误提示、标示符或变量中可以有下划 线等。 (3)设计编制典型的运行实例,以便能反应出自己所作的改进。 二、设计目的 在给定的 PL/0 编译程序源文件上进行理解分析,改进或添加完善其余 部分功能,加深对编译理论和编译过程的理解。 三、主要思想 PL/0 语言是 Pascal 语言的一个子集,我们这里分析的 PL/0 的编译程 序包括了对 PL/0 语言源程序进行分析处理、编译生成类 PCODE 代码,并在 虚拟机上解释运行生成的类 PCODE 代码的功能。 PL/0 语言编译程序采用以语法分析为核心、一遍扫描的编译方法。词 法分析和代码生成作为独立的子程序供语法分析程序调用。语法分析的同 时,提供了出错报告和出错恢复的功能。在源程序没有错误编译通过的情 况下,调用类 PCODE 解释程序解释执行生成的类 PCODE 代码。 词法分析器的分析过程:调用 getsym 时,它通过 getch 过程从源程序 中获得一个字符。如果这个字符是字母,则继续获取字符或数字,最终可 以拼成一个单词,查保留字表,如果查到为保留字,则把 sym 变量赋成相 3
应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标 识符(可能是变量名、常量名或是过程的名字),把 sym 置为 ident,把这 个单词存入 id 变量。查保留字表时使用了二分法查找以提高效率。如果 getch 获得的字符是数字,则继续用 getch 获取数字,并把它们拼成一个整 数,然后把 sym 置为 number,并把拼成的数值放入 num 变量。如果识别出 其它合法的符号(比如:赋值号、大于号、小于等于号等),则把 sym 则 成相应的类型。如果遇到不合法的字符,把 sym 置成 nul。 语法分析的分析过程:程序采用了自顶向下的递归子程序法,语法分 析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。语 法分析主要由分程序分析过程(block)、常量定义分析过程 (constdeclaration)、变量定义分析过程(vardeclaration)、语句分 析过程(statement)、表达式处理过程(expression)、项处理过程(term)、 因子处理过程(factor)和条件处理过程(condition)构成。这些过程在 结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(error)、 代码生成过程(gen)、测试单词合法性及出错恢复过程(test)、登录名 字表过程(enter)、查询名字表函数(position)以及列出类 PCODE 代码 过程(listcode)作过语法分析的辅助过程。 四、主要变量说明 4.1 指令说明 LLT:将常量值取到运行栈顶 LOD:变量放到运行栈顶 STO:将栈顶内容送到某变量单元中 CAL:调用过程指令 INT:被调用过程在运行栈中开辟数据区 JMP:无条件转移指令 JPC:条件转移指令,栈顶布尔值为真时,顺序执行,否则转向域的地址 OPR:系运算符和算是运算指令,将栈顶和次栈顶内容进行运算,结果存放 栈顶 4
4.2 符号说明 nul ident number plus minus times slash oddsym eql neq lss leq gtr geq lparen rparen comma semicolon period becomes elsesym 空 常量标识符 数字 加号 减号 乘号 除号 临时符号 等号 不等号 小于号 小于等于号 大于号 大于等于号 左括号 右括号 逗号 分号 句号 赋值符号 else 标识符 beginsym endsym ifsym thensym whilesym writesym readsym dosym callsym constsym varsym procsym plusleq plusplus minusleq minusminus timesleq slashleq residual forsym 起始标识符 结束标识符 if 标识符 then 标识符 while 标识符 write 标识符 read 标识符 do 标识符 call 标识符 const 标识符 var 标识符 process 标识符 +=号 ++号 -=号 --号 *=号 \=号 余数 for 循环 4.3 函数说明 Void error(int n,int line) 说明:出错处理函数,打印出错信息,错误总数加 1 Int getch() 说明:读取字符函数,返回字符 Int getsym() 说明:读取下一个单词符号 Int position(char* idt,int tx) 5
说明:字符在符号表中位置查询函数 返回值:表示在符号表中索引 Int gen(enum fct x,int y,int z) 说明:生成 p-code 代码指令 Int test(bool* sl,bool* s2,int n) 说明:测试当前符号是否合法,若不合法,打印出错信息并进行跳读 void enter(enum object k,int *ptx,int lev,int *pdx) 说明:在符号表中登录分程序说明部分出现的名字 int constdeclaration(int * ptx,int lev,int *pdx) 说明:处理常量说明,并将常量名以及相应信息填入符号表 Int vardeclaration(int *ptx,int lev,int *pdx) 说明:处理变量说明,并将变量名以及相应信息填入符号表 Int statement(bool* fsys,int *ptx,int lev) 说明:分析处理各种语句 Int condition(bool* fsys,int *ptx,int lev) 说明:分析处理条件式 返回值:参数 x 返回求值结果类型 Void listcode(int cx0); 说明:打印 P-code 代码 Int block(int lev,int tx,bool*fsys); 说明:语法分析,由 main()调用 Void interpret(); 说明:解释执行 p 代码 Int base(int 1,int *s,int b) 说明:基地址处理函数 Int expression(bool*fsys,int *ptx,int lev) 说明:表达式处理,由参数返回结果类型 Int term(bool*fsys,int*ptx,int lev) 说明:项处理,由参数返回结果类型 6
Int factor(bool*fsys,int *ptx,int lev) 说明:因子处理,由参数返回结果类型 五、算法描述 5.1 ++、--、+=、-=、*=、/= 以上这些操作属于运算的部分,当对语句进行分析时才会进行处理, 因此我们需要改动的部分主要为语句处理和调用的虚拟机代码部分,同时 也要对 symbol 进行处理。对于自加和自减操作我们需要考虑两种情况:一 种是自加和自减操作被看做是语句处理;一种是作为赋值语句的后半部分 进行处理。对于前一种情况我们要做的是在 statement()中添加分析处理 操作,对于后一种情况我们要做的是在 factor()中添加相应的操作和处 理语句。 增加运算符: plusplus(++)、minusminus(--)、plusleq(+=)、minusleq(-=)、 timesleq(*=)、slashleq(/=) 这些运算符在symbol类型标识里添加。 在词法分析getsym()中修改如下代码: if(ch=='+') { getchdo; if(ch=='+') { } sym=plusplus; getchdo; else { if(ch=='=') { sym=plusleq; getchdo; 7
} else { } sym=plus; } } else { if(ch=='-') { getchdo; if(ch=='-') { } sym=minusminus; getchdo; else { if(ch=='=') { } sym=minusleq; getchdo; else sym=minus; { } 8 } } else {
分享到:
收藏