合肥工业大学编译原理实验.docx
- 文档编号:2429427
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:39
- 大小:358.54KB
合肥工业大学编译原理实验.docx
《合肥工业大学编译原理实验.docx》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验.docx(39页珍藏版)》请在冰豆网上搜索。
合肥工业大学编译原理实验
宣城校区
实验报告
课程名称编译原理
专业班级计算机0001班
学生姓名及学号赵保飞2015216768
指导教师李芒宏
实验地点计算机中心楼第四机房
2017~2018学年第一学期
《编译原理》课程实验报告
实验名称
词法分析设计
姓名
赵保飞
系院专业
计算机科学与技术
班级
计算机01班
学号
2015216768
实验日期
2017.10.18
指导教师
李芒宏
成绩
一、实验目的和要求
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用。
二、实验原理
(1)实验数据结构说明
K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符
(2)实验算法描述
(3)算法流程图
三、源程序代码和测试结果
packagelexicalAnalysis;
importjava.util.*;
importjava.io.*;
publicclasslexicalAnalysis{
staticStringk[]={"for","main","if","while","void","public","static","printf","scanf","asm","do","return","typedef","auto","double","break","short","using","default","long"};//关键字
staticchars[]={',',';','(',')','[',']','{','}'};//2分界符
staticcharm[]={'+','-','*','/'};//3算术运算符
staticStringr[]={"<","<=","=",">",">=","<>"};//4关系运算符
ArrayList
ArrayList
StringtempToken="";//临时存放组成一个“词”单位串
intpint,row=1,line=1;//当前指针指示,行数,列数
charch;//存放最新读入源程序字符
Stringinstring;//存放输入de源程序代码
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
lexicalAnalysisone=newlexicalAnalysis();
System.out.println("单词"+"\t二元序列"+"\t类型"+"\t位置(行,列)");
one.readtext();
}
booleanisdigit(charc){//判断所读字符是否为数字,是则返回ture,否则返回false
if(c>=48&&c<=57)
returntrue;
else
returnfalse;
}
booleanisletter(charc){//判断所读字符是否为字母,是则返回true,否则返回false
if((c>64&&c<91)||(c>96&&c<123))
returntrue;
else
returnfalse;
}
booleanisline(charc){//判断字符c是否是下划线"_"
if(c=='_')
returntrue;
else
returnfalse;
}
booleanremove(){//用于在判断关系运算符时,判断是否是要再读一个字符
charb=instring.charAt(pint+1);//string类charAt()方法用于返回指定索引处的字符。
索引范围为从0到length()-1
if(b=='='||b=='>')//当其后的字符是=或>时,要再读一个字符。
否则不要再读。
returntrue;
else
returnfalse;
}
voidclearBlank(){//检查空白直到读入字符非空白
while(ch==''){
getchar();
}
}
voidgetchar(){
pint++;
if(pint<=instring.length()-1){
ch=instring.charAt(pint);
if(ch=='\n'){
change_row_line();
getchar();
}
}
else
ch='';//instring数据读取完,需重新读入
}
voidretract(){//读入前一个字符
pint--;
ch=instring.charAt(pint);
}
voiddistinguishLeter(){//识别字符串
tempToken="";//清空
while(isletter(ch)||isdigit(ch)||isline(ch)){//字母,数字,下划线仍是字符串合法组成,继续识别
tempToken=tempToken+ch;
getchar();
}
}
voiddistinguishDigit(){//识别数字串
tempToken="";//先将strtoken置空
while(isdigit(ch)){//当数字时继续识别数字串
tempToken=tempToken+ch;//将新识别的字符加到strtoken后
getchar();
}
if(isletter(ch)||isline(ch)){//识别完数字串而其后是字母,下划线时出错处理
while(isletter(ch)||isline(ch)||isdigit(ch)){//当是字母,数字,下划线时继续识别错误数字串
tempToken=tempToken+ch;//将新识别的字符加到strtoken后
getchar();
}
display(0,tempToken,'');//输出错误数字串
tempToken="";//将strtoken置空返回
}
}
voiddisplay(inti,Strings,chara){//各种输出处理
switch(i){
case-1:
System.out.println(a+"\tError"+"\tError"+"\t"+row+","+line+")");
break;
case0:
System.out.println(s+"\tError"+"\tError"+"\t("+row+","+line+")");
break;
case1:
System.out.println(s+"\t(1,"+s+")"+"\t关键字"+"\t("+row+","+line+")");
break;
case2:
System.out.println(a+"\t(2,"+a+")"+"\t分界符"+"\t("+row+","+line+")");
break;
case3:
System.out.println(a+"\t(3,"+a+")"+"\t算术运算符"+"\t("+row+","+line+")");
break;
case4:
System.out.println(s+"\t(4,"+s+")"+"\t关系运算符"+"\t("+row+","+line+")");
break;
case5:
System.out.println(s+"\t(5,"+s+")"+"\t常数"+"\t"+"("+row+","+line+")");
break;
case6:
System.out.println(s+"\t(6,"+s+")"+"\t标识符"+"\t("+row+","+line+")");
break;
}
line++;//列数加一
}
voidchange_row_line(){//改变行数和列数
row++;
line=1;
}
voidhandleString(){//输入串处理
pint=-1;//将搜索指示器置-1
System.out.println("要处理的语句为:
"+instring);
getchar();//读入一个字符
while(pint clearBlank();//检查空白直到读入读入非空 if(isdigit(ch)){//当ch为数字时进行数字串识别 distinguishDigit();//数字串识别 if(tempToken.length()! =0){//经过数字串识别后,如果strtoken不为空 if(reseverci(tempToken)==-1){//如果strtoken不在ci表中,将strtoken加入ci表中 ci.add(tempToken);//将strtoken加入ci表中 display(5,tempToken,'');//输出数字串 } else{//如果strtoken在ci表中,仅输出 display(5,tempToken,'');//输出数字串 } } } elseif(isletter(ch)){//当ch为字母时进行字符串识别 distinguishLeter();//字符串识别 if(reserve(tempToken)==-1){//如果strtoken不在k表中 if(reseverid(tempToken)==-1){//如果strtoken不在id表中 id.add(tempToken);//将strtoken加入id表中 display(6,tempToken,'');//输出标识串 } else{//如果strtoken在id表中 display(6,tempToken,'');//输出标识串 } } else{//如果strtoken在关键字表 display(1,te
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 合肥 工业大学 编译 原理 实验