logo资料库

编译原理实验报告完整版(词法语法语义中间代码汇编).doc

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
一、实验简介
二、语言定义
三、词法分析
1.实现方法
2.各种单词符号对应的种别码
3.具体实现流程图
4.错误处理
四、语法分析
1.实现方法
2.LR(1)分析表的获取
3.总控程序
4.程序流程图
4.错误处理
五、语义分析
1实现方法
2.四元式定义
3.语法制导翻译具体实现
4.错误处理
六、目标代码生成
1.实现方法
2.汇编指令集
3.具体实现
七、程序运行测试
1.测试样例
2.词法分析结果
3.语法分析结果
4.语义分析结果
5.汇编代码生成
九、实验总结
编译器设计 ——编译原理实验报告 班号: 姓名: 学号: 1
目录 一、实验简介 .................................................................................................................................... 3 二、语言定义 .................................................................................................................................... 3 三、 词法分析 .................................................................................................................................. 4 1.实现方法 ................................................................................................................................. 4 2. 各种单词符号对应的种别码 ............................................................................................... 4 3.具体实现流程图 ..................................................................................................................... 5 4.错误处理 ................................................................................................................................. 5 四、语法分析 .................................................................................................................................... 6 1.实现方法 ................................................................................................................................. 6 2. LR(1)分析表的获取 ......................................................................................................... 6 3. 总控程序 ............................................................................................................................... 7 4.程序流程图 ............................................................................................................................. 8 4.错误处理 ................................................................................................................................. 9 五、语义分析 .................................................................................................................................. 10 1 实现方法 ............................................................................................................................... 10 2. 四元式定义......................................................................................................................... 10 3.语法制导翻译具体实现 ....................................................................................................... 10 4.错误处理 ............................................................................................................................... 12 六、目标代码生成 .......................................................................................................................... 12 1.实现方法 ............................................................................................................................... 12 2.汇编指令集 ........................................................................................................................... 12 3.具体实现 ............................................................................................................................... 13 七、程序运行测试 .......................................................................................................................... 13 1.测试样例 ............................................................................................................................... 13 2.词法分析结果 ....................................................................................................................... 13 3.语法分析结果 ....................................................................................................................... 14 4.语义分析结果 ....................................................................................................................... 15 5.汇编代码生成 ....................................................................................................................... 15 九、实验总结 .................................................................................................................................. 17 2
一、实验简介 本次实验旨在设计一个类 C 语言子集的编译器,可以对自己设计的语言进行编译,最 终生成可执行的汇编代码。 通过实验教学,加深学生对所学的关于编译原理的理论知识的理解,增强学生对所学 知识的综合应用能力,并通过实验达到对所学的知识进行验证。 实验分为词法分析、语法分析、语义分析和中间代码生成、汇编代码生成四个阶段。 通过实验,使学生掌握词法分析的实现技术,深入了解语法分析的四种实现技术及具体实 现方法,掌握语义分析的实现技术及具体实现方法,了解代码优化和代码生成的实现技术 及具体实现方法。明确编译各阶段之间的关系。熟悉符号表的建立及在编译过程中的作用。 二、语言定义 本次实验所设计的语言是 C 语言的子集,支持 int、char、double、bool 四种数据类型, 实现了声明、赋值、基本四则算术运算、分支语句、循环语句、数组、函数、输入输出等 功能。 语言的文法如下: <程序> → main(){<语句序列>}| <函数><程序> <语句序列> → <语句>;<语句序列> |<语句>; <语句> → ||<赋值语句>|||<函数调用语 句>|<变量定义语句> <表达式> → <表达式> <加减符> <项> | <项> <加减符> → + | - <项> → <项> <乘除符> <因子> | <因子> <乘除符> → * | / <因子> → (<表达式>) | num | <变量> | 字符 <条件表达式> -> <表达式> <比较符号> <表达式> <比较符号> -> < | > | <> | >= | <= |== <函数> -> id(<参数>){<语句序列>} <参数> -> <变量定义语句> | <变量定义语句>,<参数> <变量定义语句> -> <变量类型> <变量> <变量类型> -> int | double | bool | char <变量> -> id | id[num] | id[id] <函数调用语句> -> id(<调用参数>) <调用参数> -> <表达式> | <表达式>,<调用参数> → if <条件表达式> {<语句序列> } | if <条件表达式> { <语句序列>} else {< 语句序列> } 3
→ while (<条件表达式>) {<语句序列>} → read id → write id <赋值语句> → id=<条件表达式> | id[num]=<条件表达式> | id[id]=<条件表达式> | id=<表达式> |id[num]=<表达式> | id[id]=<表达式> 为了方便之后的程序处理,我把所有的终结符和非终结符都用单个字符表达: <程序> P Main M <语句序列> L <函数> H <语句> Y I <函数调用语句> J T R W <赋值语句> F <变量定义语句> B <参数> A <调用参数> D <变量类型> Z <变量> C <表达式> b <条件表达式> t <比较符号> a <逻辑符> o <加减符> j <项> x <乘除符> c <因子> y 字符 l num n id NOT N AND Q i [非终结符] P L Y b j x c y t a H A B Z C J D I W R T F G [终结符] ( ) { } [ ] + - * / : , = 1 2 3 4 n i f e w r g h d k p M < > l f e OR O if else while w r Read Write g Int h double bool k char p <> 1 == 2 <= 3 >= 4 d 三、词法分析 1.实现方法 通过逐词读入样例程序中的内容,对每个单词进行判断分析,输出该单词的内容以及 种别码。 2.各种单词符号对应的种别码 单词符号 main if else int 种别码 M f e h 单词符号 ] ( ) + 4 种别码 ] ( ) +
k bool d double p char w while r read g wirte i id(变量名) inum(整型数) n dnum(浮点型数) 9 { { } } [ [ 3.具体实现流程图 - / * = == <> > < >= <= , ; - / * = 2 1 > < 4 3 , ; 4.错误处理 当遇到非法字符、标示符与关键字重复时会显示相应的错误信息。 5
四、语法分析 1.实现方法 使用 LR(1)算法,首先求出语言定义文法的 LR(1)分析表,然后 LR 分析算法的总控程 序根据分析表对源语言进行语法分析。 2.LR(1)分析表的获取 (1)求 FIRST(X)集的算法 ; 步骤: 1.FIRST(X)= 2.if (X∈T) then FIRST(X):= {X} ; 3.if X∈V then begin 4.if (X→ε P) then FIRST(X):= FIRST(X)∪{a|X→a…∈Pand a∈T}; 5.if (X→ε∈P) then FIRST(X):= FIRST(X)∪ {ε} end 6.对 X∈V,重复如下的过程 7-10,直到所有 FIRST 集不变为止。 7.if (X→Y…∈P and Y∈Vand Y →ε P) then FIRST(X):= FIRST(X)∪(FIRST(Y)-{ε}); 8.if (X→Y1…Yn∈P and Y1...Yi-1 ε) then 9.FIRST(X):= FIRST(X)∪(FIRST(Yi)-{ε}); 10.if Y1...Yn ε then FIRST(X):=FIRST(X)∪{ε}; (2)求 FOLLOW(X)集的算法 步骤: 1.对 X∈V,FOLLOW(S) := 2.FOLLOW(S) := {#},#为句子的结束符; 3.对 X∈V,重复下面的第 4 步到第 5 步,直到所有 FOLLOW 集不变 ; 为止。 4.若 A→αBβ∈P,则 FOLLOW(B):=FOLLOW(B)∪FIRST(β)–{ε}; 5.若 A→αB 或 A→αBβ∈P,且β FOLLOW(B):=FOLLOW(B)∪FOLLOW(A); ε,A≠B,则 (3)求 CLOSURE(I)集的算法 J:=I; repeat J=J∪{[B→.η,b]|[A→α.Bβ,a]∈J, b∈FIRST(βa)} until J 不再扩大 (4)function GO(I, X); begin J:= ; 6
for I 中每个形如 A→α.Xβ的项目 do end; begin J:=J∪{A→αX.β} return CLOSURE(J) end; (5)计算 LR(1)项目集规范族C begin C:= {closure({ S'→.S,#})}; repeat for I∈C, X ∈ V∪T if go(I,X)≠Φ & go(I,X) C then C=C∪go(I,X) until C 不变化 end. (6)LR(1) 分析表的构造 1.令 I0= CLOSURE({S'→.S}),构造 C={ I0, I1, …, In},即 G'的 LR(1) 项目集规范族。 2.从 Ii 构造状态 i,0 为初始状态。 for k=0 to n do begin Ik & a T & GO(Ik, a)=Ij then action[k,a]:=Sj; ⑴ if [A→α.aβ, b] ⑵ if GO(Ik, B)=Ij & B V then goto[k,B]:=j; ⑶ if [A→α., a] ⑷ if [S'→S., #] Ik & A→α为 G'的第 j 个产生式 then action[k,a]:=rj; Ik then action[k,#]:=acc; end 上述⑴到⑷步未填入信息的表项均置为 error。 3.总控程序 开始时,#S 在分析栈中,其中 S 是文法的开始符号,在栈顶;令指针 ip 指向 W#的第一个符号;repeat /*X 是非终结符号*/ 让 X 等于栈顶符号,a 为 ip 所指向的符号; if X 是终结符号或# then If X=a then 把 X 从栈顶弹出并使 ip 指向下一个输入符号 else error() else if M[x,a]=Xày1y2…yk then begin 从栈中弹出 X;把 yk,yk-1,…,y1 压入栈,y1 在栈顶; 输出产生式 Xày1y2…yk;end else error() until X=# /*栈空*/ 7
4.程序流程图 制表程序流程图: 8
分享到:
收藏