编译原理课程实验语义分析.docx
- 文档编号:15645384
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:26
- 大小:21.37KB
编译原理课程实验语义分析.docx
《编译原理课程实验语义分析.docx》由会员分享,可在线阅读,更多相关《编译原理课程实验语义分析.docx(26页珍藏版)》请在冰点文库上搜索。
编译原理课程实验语义分析
编译原理课程实验报告
班级:
软件51
学号:
姓名:
曹建兵
提交日期:
2009年3月17日
联系方式:
一、实验内容:
实现一个《程序设计语言子集》的编译系统。
包括:
词法分析,语法分析,语义分析,符号表,出错处理等
语言成分:
(1)数据类型:
整型,布尔型;
(2)简单变量;
(3)算术表达式(+,×);
(4)布尔表达式(∧,∨,┐);
(5)语句:
(6)赋值语句;
(7)分支语句(if-then,if-then-else);
(8)循环语句(while);
(9)定义语句等。
输入方式:
文本文件(如:
.txt);
二、实验过程:
1.程序设计语言的形式化描述
语法分析:
S->V;|IfBthenV;|IfBthenVelseV;|whileBdoV;|inti;|booli;(不考虑直接表达式形式)
B->┐(B)F|iF(由于要求只有布尔型常量或变量)
F->∨B|∧B;
V->i:
=E(赋值语句,这里i只能是变量)
E->iT|(E)(表达式语句)
T->*E|+E|ε(表达式中间状态)
2.单词种别定义
单词符号
种别编号
Program
1
True
2
false
3
bool
4
int
5
If
6
Then
7
Else
8
Do
9
While
10
标识符
11
常量
12
+
13
-
14
(
15
)
16
=
17
>
18
<
19
;
20
:
21
:
=
22
23
*
24
{
25
}
26
∧
27
∨
28
┐
29
3.语法分析程序:
packagecompiler;
importjava.util.ArrayList;
importjava.util.HashMap;
publicclassGrammarAnalysis{
privateStringSYM;
privateArrayList
privateHashMap
privateintcurrent=0;
privateintrow=1;
privateintnumber=1;
privatebooleanflag=true;
privateintcount=0;
privateintNXQ=1;
privateArrayList
privateinttotalVar=0;
privateHashMap
privatebooleant=true;
publicGrammarAnalysis(ArrayList
result=newArrayList
reverse=newHashMap
inti;
for(i=0;i if(al.get(i).getType()==0)break; if(i==al.size())result=al; elseresult=null; var=newHashMap output=newArrayList output.add(newSiYuanShi(0,"-","-","-","0")); //reverse.put("1","program"); //reverse.put("2","begin"); //reverse.put("3","end"); //reverse.put("4","var"); reverse.put(2,"true"); reverse.put(3,"false"); reverse.put(4,"bool"); reverse.put(5,"int"); reverse.put(6,"if"); reverse.put(7,"then"); reverse.put(8,"else"); reverse.put(9,"do"); reverse.put(10,"while"); reverse.put(11,"identifier");//标识符 reverse.put(12,"constants");//常量 reverse.put(13,"+"); //reverse.put("14","-"); reverse.put(15,"("); reverse.put(16,")"); reverse.put(17,"="); reverse.put(18,">"); reverse.put(19,"<"); reverse.put(20,";"); reverse.put(21,": "); reverse.put(22,": ="); reverse.put(23,","); //reverse.put("24","/"); reverse.put(24,"*"); reverse.put(25,"{"); reverse.put(26,"}"); reverse.put(27,"∧"); reverse.put(28,"∨"); reverse.put(29,"┐"); if(result! =null) ADVANCE(); } publicvoidrun(){ if(result! =null){ while(current if(flag) P(); elsebreak; } if(t){ System.out.println("生成四元式如下: "); for(inti=1;i System.out.println(output.get(i).toString()); System.out.println("符号表如下: "); System.out.println(var.toString()); }/*结果输出*/ } elseSystem.out.println("请先除去未定义符号"); } privateintnewTemp(){ count++; returncount; } privateintentry(Stringi){ return0; } privatevoidgen(Stringop,Stringarg1,Stringarg2,Stringresult){ SiYuanShia=newSiYuanShi(NXQ,op,arg1,arg2,result); //System.out.println(a.toString()); output.add(a); NXQ++; } privatevoidADVANCE(){ if(current SYM=reverse.get(result.get(current).getType()); current++; number++; } } privateintmerge(intp1,intp2){ try{ inti=p2; if(p1! =0&&p2! =0){ while(Integer.parseInt(output.get(i).getResult())! =0) i=Integer.parseInt(output.get(i).getResult()); output.get(i).setResult(Integer.toString(p1)); returnp2; } }catch(Exceptione){ System.out.println("Error1"); } returnp2; } privatevoidbackpatch(intp,intm){ try{ inti=p; intt=0; if(p! =0){ while(Integer.parseInt(output.get(i).getResult())! =0){ t=Integer.parseInt(output.get(i).getResult()); output.get(i).setResult(Integer.toString(m)); i=t; } output.get(i).setResult(Integer.toString(m)); } }catch(Exceptione){ System.out.println("Error2"); } } privatevoidERROR(inti){ t&=false; flag=flag&false; System.out.println("判断句子以分号为标准。 "); System.out.print("错误位于第"+row+"句,第"+number+"个单词上。 "); switch(i){ case0: System.out.println("语法错: 缺少分号");break; case1: System.out.println("语法错: else关键字错误。 ");break; case2: System.out.println("语法错: then关键字缺失。 ");break; case3: System.out.println("语法错: 限定非符号之后只能跟随左括号。 ");break; //case3: System.out.println("语法错: While-do循环语句未结束。 ");break; case4: System.out.println("语法错: do关键字缺失。 ");break; case5: System.out.println("语法错: 非法定义非变量");break; case6: System.out.println("语法错: 非正常语句开头。 ");break; case7: System.out.println("语法错: 赋值符号缺失。 ");break; case8: System.out.println("语法错: 格式错误。 ");break; case9: System.out.println("语法错: 丢失右括号。 ");break; case10: System.out.println("语法错: 表达式格式错误。 ");break; case11: System.out.println("语法错: 丢失右大括号。 ");break; case12: System.out.println("语义错: 变量"+result.get(current-1).getValue()+"未定义。 ");break; case13: System.out.println("语义错: 变量"+result.get(current-1).getValue()+"重定义。 ");break; case14: System.out.println("语义错: 变量"+result.get(current-1).getValue()+"类型错误。 ");break; } if(! ";".equals(SYM)){ while(current ";".equals(reverse.get(result.get(current).getType()))) current++; current++; /*if("}".equals(reverse.get(result.get(current).getType()))) current++;*/ } //current=result.size()-1; number=1; row++; ADVANCE(); }/*报错处理,若出错则寻找下个句子,以分后做标记*/ privateintP(){ inttruelist=0; intfalselist=0; intnextlist=0; if(flag){ if("if".equals(SYM)){ ADVANCE(); Wordr=B(); truelist=r.getType(); falselist=Integer.parseInt(r.getValue()); if(flag){ if("then".equals(SYM)){ ADVANCE(); backpatch(truelist,NXQ); falselist=truelist+1; intpnext=0; if("{".equals(SYM)) { ADVANCE(); pnext=P(); if("}".equals(SYM)){ ADVANCE(); number=1; } elseERROR(11); } else{ Q(); } if(flag){ if(";".equals(SYM)){ if(pnext! =0) nextlist=merge(falselist,pnext); elsenextlist=falselist; ADVANCE(); row++; number=1; }/*无else的*/ elseif(flag){ if("else".equals(SYM)){ intN=NXQ; gen("j","-","-","0"); nextlist=merge(pnext,N); ADVANCE(); backpatch(falselist,NXQ); if("{".equals(SYM)) { ADVANCE(); inta=P(); if(a! =0)nextlist=merge(N,a); elsenextlist=N; if("}".equals(SYM)){ ADVANCE(); number=1; } elseERROR(11); }else Q(); if(flag){ if(";".equals(SYM)){ ADVANCE(); row++; number=1; }else ERROR(0); } }else ERROR(0); }/*有else的*/ } }else ERROR (2); } }/*分支语句*/ elseif("while".equals(SYM)){ intback=NXQ; ADVANCE(); Wordr=B(); truelist=r.getType(); falselist=Integer.parseInt(r.getValue()); if(flag){ if("do".equals(SYM)){ ADVANCE(); backpatch(truelist,NXQ); if("{".equals(SYM)) { ADVANCE(); backpatch(P(),back); if("}".equals(SYM)){ ADVANCE(); number=1; } elseERROR(11); } elseQ(); if(flag){ if(";".equals(SYM)){ ADVANCE(); nextlist=falselist; gen("j","-","-",Integer.toString(back)); row++; number=1; }else ERROR(0);/*丢失分号*/ } }else ERROR(4); } }/*循环语句*/ else{ if("identifier".equals(SYM)){ Q(); if(flag){ if(";".equals(SYM)){ ADVANCE(); row++; number=1; }else ERROR(0); } } elseif("bool".equals(SYM)||"int".equals(SYM)){ Stringt=SYM; ADVANCE(); if("identifier".equals(SYM)){ if(var.get(result.get(current-1).getValue())==null){ totalVar++; var.put(result.get(current-1).getValue(),t); ADVANCE(); if(";".equals(SYM)){ ADVANCE(); row++; number=1; }elseERROR(0);/*缺少分号*/ }elseERROR(13);/*变量未定义*/ }elseERROR(5);/*格式错误: 非法定义非变量*/ }elseERROR(6);/*非正常语句开头*/ } }/*若已经出错则不做这部分判断*/ returnnextlist; } privateWordand(intt,intf){ intm=NXQ; Wordr=B(); inttl=r.getType(); intfl=Integer.parseInt(r.getValue()); backpatch(t,m); t=tl; f=merge(f,fl); returnnewWord(t,Integer.toString(f)); } privateWordor(intt,intf){ intm=NXQ; Wordr=B(); inttl=r.getType(); intfl=Integer.parseInt(r.getValue()); backpatch(f,m); t=merge(t,tl); f=fl; returnnewWord(t,Integer.toString(f)); } privateWordB(){ inttruelist=0; intfalselist=0; if("identifier".equals(SYM)){ if(var.get(result.get(current-1).getValue())! =null){ Stringarg1=result.get(current-1).getValue(); ADVANCE(); if(var.get(arg1)=="bool"){ truelist=NXQ; gen("j=",arg1,"true","0"); falselist=NXQ; gen("j","-","-","0"); if("∧".equals(SYM)){ ADVANCE(); Wordr=and(truelist,falselist); truelist=r.getType(); falselist=Integer.parseInt(r.getValue()); }/*B->B∧B*/ elseif("∨".equals(SYM)){ ADVANCE(); Wordr=or(truelist,falselist); truelist=r.getType(); falselist=Integer.pars
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 课程 实验 语义 分析