合肥工业大学编译原理实验.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
voidclearBlank(){//检查空白直到读入字符非空白
while(ch==' '){
getchar();
}
}
voidgetchar(){
pint++;
if(pint<=instring.length()-1){
ch=instring.charAt(pint);
if(ch=='\n'){
change_row_line();
charb=instring.charAt(pint+1);//string类charAt()方法用于返回指定索引处的字符。索引范围为从0到length()-1
if(b=='='||b=='>')//当其后的字符是=或>时,要再读一个字符。否则不要再读。
returntrue;
else
returnfalse;
}
else{//如果strtoken在id表中
display(6,tempToken,' ');//输出标识串
}
}
else{//如果strtoken在关键字表
display(1,tempToken,' ');//输出关键字
}
}
elseif(in_s(ch)!=-1){//分界符处理包含在one.in_s(one.ch)中
one.readtext();
}
booleanisdigit(charc){//判断所读字符是否为数字,是则返回ture,否则返回false
if(c>=48&&c<=57)
returntrue;
else
returnfalse;
}
booleanisletter(charc){//判断所读字符是否为字母,是则返回true,否则返回false
getchar();
}
if(isletter(ch)||isline(ch)){//识别完数字串而其后是字母,下划线时出错处理
while(isletter(ch)||isline(ch)||isdigit(ch)){//当是字母,数字,下划线时继续识别错误数字串
tempToken=tempToken+ch;//将新识别的字符加到strtoken后
2017.10.18
指导教师
李芒宏
成绩
一、实验目的和要求
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用。
二、实验原理
(1)实验数据结构说明
K[]String数组-关键字表;s[]char数组—分界符;m[]char数组—算术运算符;r[]String数组—关系运算符;ArrayList型String数组ci—常数;ArrayList型String数组id—标识符
getchar();
}
display(0,tempToken,' ');//输出错误数字串
tempToken="";//将strtoken置空返回
}
}
voiddisplay(inti,Strings,chara){//各种输出处理
switch(i){
case-1:System.out.println(a+"\tError"+"\tError"+"\t"+row+","+line+")");
tempToken=tempToken+ch;
getchar();
}
}
voiddistinguishDigit(){//识别数字串
tempToken="";//先将strtoken置空
while(isdigit(ch)){//当数字时继续识别数字串
tempToken=tempToken+ch;//将新识别的字符加到strtoken后
inti;
for(i=0;i<ci.size();i++){
if(s.equals(ci.get(i)))
returni;//识别的数字串已经在ci表中,返回位置
}
return-1;//识别的数字串不在ci表中,返回-1
}
intin_s(charc){//确认分界符
inti;
for(i=0;i<s.length;i++)
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+")");
ArrayList<String>id=newArrayList<String>();//6标识符
StringtempToken="";//临时存放组成一个“词”单位串
intpint,row=1,line=1;//当前指针指示,行数,列数
charch;//存放最新读入源程序字符
Stringinstring;//存放输入de源程序代码
break;
case6:System.out.println(s+"\t(6,"+s+")"+"\t标识符"+"\t("+row+","+line+")");
break;
}
line++;//列数加一
}
voidchange_row_line(){//改变行数和列数
row++;
line=1;
}
voidhandleString(){//输入串处理
}
}
intreserve(Strings){//判断字符串是否是保留字
inti;
for(i=0;i<k.length;i++){
if(s.equals(k[i])){
returni;//是保留字,就返回编码
}
}
return-1;//不是保留字,就返回-1
}
intreseverid(Strings){//判断识别的标志符是否已经在id表中
宣城校区
实 验 报 告
课程名称编译原理
专业班级计算机0001班
学生姓名及学号赵保飞 2015216768
指导教师李芒宏
实验地点计算机中心楼第四机房
2017~ 2018学年第一学期
《编译原理》课程实验报告
实验名称
词法分析设计
姓名
赵保飞
系院专业
计算机科学与技术
班级
计算机01班
学号
2015216768
实验日期
if((c>64&&c<91)||(c>96&&c<123))
returntrue;
else
returnfalse;
}
booleanisline(charc){//判断字符c是否是下划线"_"
if(c=='_')
returntrue;
else
returnfalse;
}
booleanremove(){//用于在判断关系运算符时,判断是否是要再读一个字符
if(c==s[i]){//与某个分界符配备时
display(2,"",c);//输出分界符
getchar();//读下一位
returni;//返回所在位置
}
return-1;//不在分界符表中
}
intin_m(charc){//查找算术运算符
inti;
for(i=0;i<m.length;i++)
getchar();
}
}
else
ch=' ';//instring数据读取完,需重新读入
}
voidretract(){//读入前一个字符
pint--;
ch=instring.charAt(pint);
}
voiddistinguishLeter(){//识别字符串
tempToken="";//清空
while(isletter(ch)||isdigit(ch)||isline(ch)){//字母,数字,下划线仍是字符串合法组成,继续识别
pint=-1;//将搜索指示器置-1
System.out.println("要处理的语句为:"+instring);
getchar();//读入一个字符
while(pint<instring.length()){//当搜索指示器没有越界时
clearBlank();//检查空白直到读入读入非空
if(isdigit(ch)){//当ch为数字时进行数字串识别
display(5,tempToken,' ');//输出数字串
}
else{//如果strtoken在ci表中,仅输出
display(5,tempToken,' ');//输出数字串
}
}
}
elseif(isletter(ch)){//当ch为字母时进行字符串识别
distinguishLeter();//字符串识别
break;
case0:System.out.println(s+"\tError"+"\tError"+"\t("+row+","+line+")");
break;
case1:System.out.println(s+"\t(1,"+s+")"+"\t关键字"+"\t("+row+","+line+")");
if(c==m[i]){//与某个算术运算符配备时
display(3,"",c);//输出算术运算符
getchar();//读下一位
returni;//返回所在位置
}
return-1;//不在算术运算符表中
if(reserve(tempToken)==-1){//如果strtoken不在k表中
if(reseverid(tempToken)==-1){//如果strtoken不在id表中
id.add(tempToken);//将strtoken加入id表中
display(6,tempToken,' ');//输出标识串
distinguishDigit();//数字串识别
if(tempToken.length()!=0){//经过数字串识别后,如果strtoken不为空
if(reseverci(tempToken)==-1){//如果strtoken不在ci表中,将strtoken加入ci表中
ci.add(tempToken);//将strtoken加入ci表中
(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"};//关键字
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+")");
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generated method stub
lexicalAnalysisone=newlexicalAnalysis();
System.out.println("单词"+"\t二元序列"+"\t类型"+"\t位置(行,列)");
inti;
for(i=0;i<id.size();i++){
if(s.equals(id.get(i)))
returni;//识别的标志符已经在id表中,返回位置
}
return-1;//识别的标志符不在id表中,返回-1
}
intreseverci(Strings){//判断识别的数字串是否已经在ci表中
}
elseif(in_m(ch)!=-1){//算术运算符处理包含在one.in_m(one.ch)中
}
elseif(in_k(ch)!=-1){//关系运算符处理包含在one.in_k(one.ch)中
}
else{
display(-1,"",ch);//error
getchar();//读下一位
}
staticchars[]={',',';','(',')','[',']','{','}'};//2分界符
staticcharm[]={'+','-','*','/'};//3算术运算符
staticStringr[]={"<","<=","=",">",">=","<>"};//4关系运算符
ArrayList<String>ci=newArrayList<String>();//5常数
相关文档
最新文档