学院(系)名称:计算机与通信工程学院
姓名 班级 刘胜杰 20013级1班 课程名称 学号 实验项目 20135585 专业 计算机科学与技术 实验三:语义分析与中间代码生成 编译原理 课程代码 0668056 实验时间 2016年5月9日 第1、2节 2016年5月24日 第3,4节 实验地点 实验室7-215 批改意见 成绩 教师签字: 实验内容: 可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G[E]如下所示: E→E+T | E-T | T T→T*F | T/F | F F→P^F | P P→(E) | i 要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。 实验目的: 1.掌握语法制导翻译的基本功能。 2.巩固对语义分析的基本功能和原理的认识。 3.能够基于语法制导翻译的知识进行语义分析。 4.掌握类高级语言中基本语句所对应的语义动作。 5.理解并处理语义分析中的异常和错误。 实验要求: 1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列; 2.要求详细描述所选分析方法进行制导翻译的设计过程; 3.完成对所设计分析器的功能测试,并给出测试数据和实验结果; 4.为增加程序可读性,请在程序中进行适当注释说明; 5.整理上机步骤,总结经验和体会; 6.认真完成并按时提交实验报告。 第1页 共10页
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
package cn.ming.lab2;
public class Yufa {
char ed[]=null;
char remain[]=null;
char end[]={'i','+','-','*','/','(',')','#'}; char midle[]={'E','T','F','P'};
int j=0; int b=0; int top=0; int Le;
CreatType e,t,p,p0,p1,s0,s1,f,f1=new CreatType(); CreatType[][] Tab=new CreatType[10][10];
public static void main(String[] args) { int m,n,k=0,flag=0,finish=0; char ch,x; CreatType cha;
e.setOrigin('E'); e.setArray(\"E+T\"); e.setArray2(\"E-T\"); e.setArray3(\"T\"); e.setlength=3;
t.setorigin='T'; t.setArray(\"T*F\"); t.setArray(\"T/F\"); t.setArray(\"F\"); t.setlength=2;
f.setorigin='F';
第2页 共10页
f.setArray(\"P^F\"); f.setArray(\"P\"); f.setlength=2; f0.setorigin='P'; f0.setArray(\"^F\"); f0.setlength=3; f1.setorigin='F'; f1.setarray[0]='^'; f1.setlength=1; s.setorigin='S';
s.setlength=3; s0.setorigin='S'; s0.setArray(\"/F\"); s0.setlength=3; s1.setorigin='S'; s1.setarray[0]='^'; s1.setlength=1; f.setorigin='F'; f.setArray(\"(E)\"); f.setlength=3; f1.setorigin='F'; f1.setarray[0]='i'; f1.setlength=1;
for(m=0;m<=4;m++) for(n=0;n<=7;n++)
C[m][n].setorigin=null;
C[0][0]=e; C[0][5]=e; C[1][1]=g; C[1][2]=f; C[1][6]=f1; C[1][7]=f1; C[2][0]=t; C[2][5]=t; C[3][1]=s1; C[3][2]=s1; C[3][3]=s; C[3][4]=s0; C[3][6]=s1; C[3][7]=s1;
第3页 共10页
C[4][0]=f1; C[4][5]=f;
do{
Scanner ch=new Scanner(System.in); ch=in.next();
if ((ch!='i') &&(ch!='+') &&(ch!='-') &&(ch!='*') &&(ch!='/') &&(ch!='(') &&(ch!=')') &&(ch!='#')) {
exit(1);} remain[j]=ch; j++;
}while(ch!='#'); Le=j; ch=B[0];
A[top]='#'; A[++top]='E'; do {
x=A[top--];
System.out.println(k++);
System.out.println(\" \"); for(j=0;j<=7;j++) if(x==v1[j]) { flag=1; break; }
if(flag==1){ if(x=='#') { finish=1; getchar(); getchar(); exit(1); }
if(x==ch) { print(); print1(); printf(\"%下个\",ch); ch=B[++b]; flag=0;
} else { print(); print1();
第4页 共10页
}
printf(\"不对\",ch);
exit(1);
} } else { for(j=0;j<=4;j++) if(x==v2[j]) { m=j; break; }
for(j=0;j<=7;j++) if(ch==v1[j]) { n=j; break; }
cha=C[m][n];
if(cha.origin!=null) { print(); print1();
printf(\"%c->\",cha.origin); for(j=0;j else { print(); print1(); printf(\"quqiu\",x); exit(1); } } }while(finish==0); } for(n=1;string[N][n]!='\\0';n++) { if(!middel(s[m])&&!middel(string[N][n])) { if(middel(s[m+1])&&middel(string[N][n+1]) &&s[m+1]==string[N][n+1]) s[j+1]=string[N][0]; 第5页 共10页 break; } } else if(middel(s[m])) if(s[m]==string[N][n]) {s[j+1]=string[N][0]; break;} } } k=j+1; if(k==2&&a=='#') { system.out.printfln(1,k,s); printf(\"%c\",a);out(i+1,z,input); printf(\"结束\\n\"); printf(\"输入串符合文法的定义!\\n\"); return 1; } } else if(data[x][y]=='<'||data[x][y]=='=') { out(1,k,s); printf(\"%c\",a);out(i+1,z,input);printf(\"移进\\n\"); 第6页 共10页 k++;s[k]=a;i++; } else {printf(\"\\nflase\");return 0;} } printf(\"\\nflase\");return 0; } void main(){ string s[7]={\"\",\"E6\",\"E2\",\"T6\", \"T2\",\"F6\",\"F2\"}; char c,cc; string guici=\"\"; int flag=0; list list system.out.printfln(\"请输入要分析的表达式:\"(endl; while((c=getchar())!='\\n'){ flag=0; while(isdigit(c)||isalpha(c)){ flag=1;c=getchar();} if(flag) ss.push_back('I'); if(c=='\\n')break; ss.push_back(c); } 第7页 共10页 ss.push_back('$');ll.push_back('$');ll.push_back('0'); while(1){ if(get(ss.front())!=-1) guici=a[getI(ll.back())][get(ss.front())]; else {system.out.printfln(\"错误!\"(endl); break;} if(guici.at(0)=='s') { ll.push_back(ss.front()); ss.pop_front(); ll.push_back(guici.at(1)); } else if(guici.at(0)=='r'){ for(int i=0;i ll.push_back(s[guici.at(1)-48].at(0)); ll.push_back(a[getI(cc)][get(ll.back())].at(0)); } else if(guici.at(0)=='e') { system.out.printfln(\"错误!\"(endl;break;} else if(guici.at(0)=='A') { system.out.printfln(\"匹配成功!\"(endl)); break; 第8页 共10页 } } for(guici=\"\",myit=ll.begin();myit!=ll.end();0myit++) guici+=*myit; system.out.printfln(left(setw(18)(guici; for(guici=\"\",myit=ss.begin();myit!=ss.end();myit++) guici+=*myit; system.out.printfln(rightsetw(16)guici); system.out.printfln(endl; } public void cout() { for(int a=0;a<=top+1;a++) System.out.println(ed[a]); } public void cout() { for(int j=0;jSystem.out.print(\"进行规约ed[c]\"+ed[c]); for(j=b;j<=Le;j++) System.out.println(midle[j]); 第9页 共10页 心得体会: 通过这次实验,我对LR分析有了更进一步的了解,不单单是对语法分析,中间代码的理解更近一步,而且在编码的过程中对算法的思考,也促进了我编程能力的提升,同时,由于一阵子未使用java,通过这次实验,也对java有了一定的复习。 第10页 共10页 因篇幅问题不能全部显示,请点此查看更多更全内容ll.pop_back(); cc=ll.back();
Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务