您好,欢迎来到汇意旅游网。
搜索
您的当前位置:首页实验三

实验三

来源:汇意旅游网
 实验报告

学院(系)名称:计算机与通信工程学院

姓名 班级 刘胜杰 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;jfor(j=(cha.length-1);j>=0;j--) A[++top]=cha.array[j]; if(A[top]=='^') top--; }

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 ss,ll;

list::iterator myit;

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;ill.pop_back(); cc=ll.back();

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页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hids.cn 版权所有 赣ICP备2024042780号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务