编译原理实验报告册.docx
《编译原理实验报告册.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告册.docx(19页珍藏版)》请在冰豆网上搜索。
编译原理实验报告册
编译原理
实验报告
专业:
软件工程
班级:
2013级3班
学号:
姓名:
雷涛
2015至2016学年第2学期
计算机科学学院
实验报告说明
本课程实验从开课学期第9周开始,每周2学时上机实验课,第16周结束,其中第16周为实验检测,共14学时。
除统一安排的时间外,学生还可根据自己的实际适当安排课余时间上机。
实验课注意事项如下:
(1)每次实验前学生必须充分准备每次的实验内容,以保证每次上机实验的效果。
实验过程中必须独立完成。
(2)每次实验课将考勤,并作为实验成绩的重要依据。
(3)每次实验完成后,及时撰写实验报告并交实验指导老师批阅。
(4)实验报告中学生必须填写【实验地点】、【实验时间】、【实验过程】以及【实验总结】,注意:
必须手写完成,并独立撰写实验总结,严禁抄袭。
(5)每次实验完成后,请将实验结果发送到教师指定邮箱(jkxllj@)。
(6)学期结束时,每位同学应将自己的《实验报告册》交各班级班长或学习委员,由班长或学习委员以班级为单位、按学号从小到大排列好统一交给实验指导老师,否则无实验成绩。
附实验成绩登记表
实验名称
实验一
实验二
实验成绩
实验名称:
一个简单词法分析器的设计与实现指导教师:
刘丽娟
实验地点:
新实验楼项目一实验室
实验日期:
2016年5月10日成绩:
实验目的:
1.了解词法分析的任务;
2.掌握词法分析程序的工作流程。
实验内容:
定义模拟的简单语言的词法构成,编制词法分析程序,要求将用模拟语言书写的源程序进行词法分析,输出源程序清单,Token文件和错误信息文件。
若有错误,必须输出错误在源程序中行号和列号,并将符号表和字符串以文件的形式写出来。
基本要求:
1.写出该实验的实验步骤;
2.写出实验中遇到的问题及解决的方法。
实验步骤:
1,分析关键字(语言保留标识符等)
2,定义模拟的简单语言的词法构成
3,将关键字装入HashMap中
4,读入要分析的程序文件
5,词法分析
6,将分析结果tokens保存到List集合中
7,输出tokens到文件中
核心代码:
关键字:
publicclassKeyWords{
publicStringkeyWord="";
publicKeyWords(StringkeyWord){
this.keyWord=keyWord;
}
publicStringtoString(){
returnthis.keyWord;
}
/**列举写关键字*/
publicstaticfinalKeyWords
and=newKeyWords("&&"),
or=newKeyWords("||"),
equal=newKeyWords("=="),
For=newKeyWords("for"),
Do=newKeyWords("do"),
……
privatestaticListkeyWordsLists=newArrayList();
/**向外界提供对象集合*/
publicstaticListgetKeyWordsLists(){
keyWordsLists.add(and);
keyWordsLists.add(or);
keyWordsLists.add(equal);
keyWordsLists.add(For);
keyWordsLists.add(Do);
……
returnkeyWordsLists;
}
}
数据类型:
publicclassDataTypeextendsKeyWords{
publicStringdataType="";
publicDataType(Strings){
super(s);
this.dataType=s;
}
/**八种基本数据类型*/
publicstaticfinalDataType
Int=newDataType("int"),
Float=newDataType("float"),
……
privatestaticListdataTypeLists=newArrayList();
/**向外界提供对象集合*/
publicstaticListgetDataTypeLists(){
dataTypeLists.add(Boolean);
dataTypeLists.add(Float);
……
returndataTypeLists;
}
publicStringtoString(){
returnthis.dataType;
}
}
词法分析引擎:
publicclassLexicalAnalysis{
/**下一个读入字符*/
charnextChar='';
/**将KeyWords对象装在hashMap中*/
privateHashMapkeyWords=newHashMap();
/**将DataTypes对象装在hashMap中*/
privateHashMapdataTypes=newHashMap();
/**token序列(遍历过程中所有字符串的分割列表,以便于保存到文件中)*/
privateListtokenLists=newLinkedList();
/**读取文件变量*/
BufferedReaderreader=null;
/**保存当前是否读取到了文件的结尾*/
privateBooleanisEnd=false;
/**记录行号*/
publicstaticintlineNum=1;
/**将保存keyWords对象保存到HashMap中便于查询(其实key==value)*/
voidreserve(KeyWordsw){
keyWords.put(w.keyWord,w.toString());
}
/**装数据类型*/
voidreservedataTypes(DataTyped){
dataTypes.put(d.dataType,d.toString());
}
/**
*构造函数中将关键字和类型添加到hashtablewords中
*/
publicLexicalAnalysis(StringfilePath){
/*初始化读取文件变量*/
try{
reader=newBufferedReader(newFileReader(filePath));//读入文件
}catch(IOExceptione){
System.out.print(e);
}
/*关键字对象*/
Listlist1=KeyWords.getKeyWordsLists();
for(KeyWordsk:
list1){
this.reserve(k);
}
/*数据类型*/
Listlist=DataType.getDataTypeLists();
for(DataTypedataType:
list){
this.reserve(dataType);
this.reservedataTypes(dataType);
}
}
publicvoidreadChar()throwsIOException{
/*这里应该是使用的是*/
nextChar=(char)reader.read();
if((int)nextChar==0xffff){
//标志文件已读完
this.isEnd=true;
}
}
publicBooleanreadChar(charch)throwsIOException{
readChar();
if(this.nextChar!
=ch){
returnfalse;
}
this.nextChar='';
returntrue;
}
publicvoidscan()throwsIOException{
/*消除空白*/
for(;;readChar()){
if(nextChar==''||nextChar=='\t'){
continue;
}elseif(nextChar=='\n'){
tokenLists.add("第--"+lineNum+"--行");
lineNum=lineNum+1;
}else
break;
}
/*下面开始分割关键字,标识符等信息*/
switch(nextChar){
/*对于==,>=,<=,!
=的区分使用状态机实现*/
case'=':
if(readChar('=')){
tokenLists
.add("=="+"-------------------------KeyWords");
break;
}else{
tokenLists.add("="+"--------------------------KeyWords");
break;
}
case'>':
if(readChar('=')){
tokenLists
.add(">="+"--------------------------KeyWords");
break;
}else{
tokenLists.add(">"+"--------------------------KeyWords");
break;
}
case'<':
if(readChar('=')){
tokenLists
.add("<="+"-------------------------KeyWords");
break;
}else{
tokenLists.add("<"+"--------------------------KeyWords");
break;
}
case'!
':
if(readChar('=')){
tokenLi