编译原理实验报告册.docx
《编译原理实验报告册.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告册.docx(23页珍藏版)》请在冰豆网上搜索。
编译原理实验报告册
编译原理
实验报告
专业:
软件工程
班级:
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('=')){
tokenLists
.add("!
="+"--------------------------KeyWords");
break;
}else{
tokenLists.add("!
"+"--------------------------KeyWords");
break;
}
case'(':
if(readChar('(')){
tokenLists.add("("+"-------------------------KeyWords");
break;
}
case')':
if(readChar(')')){
tokenLists.add(")"+"------------------------KeyWords");
break;
}
}
/*
*下面是对数字的识别,根据文法的规定的话,这里的数字只要是能够识别整数就行isDigit确定指定字符(Unicode代码点)是否为数字。
*/
if(Character.isDigit(nextChar)){
intvalue=0;
do{
value=10*value+Character.digit(nextChar,10);
readChar();
}while(Character.isDigit(nextChar));
tokenLists.add(value+"--------------------------Number");
return;
}
/*
*关键字或者是标识符的识别isLetter确定指定字符是否为字母
*/
if(Character.isLetter(nextChar)){
StringBuffersb=newStringBuffer();
/*首先得到整个的一个分割*/
do{
sb.append(nextChar);
readChar();
}while(Character.isLetterOrDigit(nextChar));
//isLetterOrDigit确定指定字符是否为字母或数字
/*判断是关键字还是标识符*/
Strings=sb.toString();
Stringdatatype=dataTypes.get(s);
/*如果是关键字或者是类型的话,w不应该是空的*/
if(s!
=null){
if(datatype!
=null){
tokenLists.add(datatype+"--------------------------DataType");
return;
}
tokenLists.add(s);
return;/*说明是关键字或者是类型名*/
}
/*否则就是一个标识符id*/
tokenLists.add(s);
keyWords.put(s,s);
return;
}
/*nextChar中的任意字符都被认为是词法单元返回*/
if((int)nextChar!
=0xffff)
tokenLists.add(nextChar+"");
nextChar='';
return;
}
/**是否读取到文件的结尾*/
publicBooleangetReaderState(){
returnthis.isEnd;
}
/**保存Tokens*/
publicvoidsaveTokens()throwsIOException{
FileWriterwriter=newFileWriter("Tokens表.txt");
writer.write("[符号][符号类型信息]\n");
writer.write("\r\n");
for(inti=0;iStringtok=(String)tokenLists.get(i);
/*写入文件*/
writer.write(tok+"\r\n");
}
writer.flush();
writer.close();
}
}
主方类:
publicclassMain{
publicstaticvoidmain(String[]args)throwsIOException{
StringfilePath="D:
/Lexer.java";
LexicalAnalysislexicalAnalysis=newLexicalAnalysis(filePath);
while(lexicalAnalysis.getReaderState()==false){
lexicalAnalysis.scan();
}
/*保存相关信息*/
lexicalAnalysis.saveTokens();
System.out.println("词法分析完毕");
}
}
遇到的问题:
1,字符的读取
2,关键字的读取
解决的方法:
上网查询资料
实验结果截图:
实验总结(学生)
请手工填写
实验评价(教师)
对应后面打“√”
熟练完成(无错误),对应级别A
基本完成(有错误),对应级别B
部分完成(部分没做),对应级别C
没有做(与题目无关、空白),记0分
实验名称:
一个简单语法分析器的设计与实现指导教师:
刘丽娟
实验地点:
新实验楼项目一实验室
实验日期:
2016年5月20日成绩:
实验目的:
1.掌握语法分析的基本任务;
2.掌握语法分析器的工作流程;
3.能设计一个简单的语法分析器,并完成对指定句子的分析。
实验内容:
给定一个LL
(1)文法,编制语法分析程序,输出其预测分析表,用LL
(1)预测分析程序实现其分析过程并输出分析过程和分析结果。
基本要求:
1.写出实验步骤;
2.写出实验中遇到的问题及解决的方法。
实验步骤:
1,根据文法构造LL
(1)分析表
2,编写分析程序
主要代码:
publicclassLL1{
//文法
//
(1)E->TG
//
(2)G->+TG|-TG
//(3)G->ε
//(4)T->FS
//(5)S->*FS|/FS
//(6)S->ε
//(7)F->(E)
//(8)F->i
publicLL1(Stringstr){
super();
strToken=newStringBuilder(str);
}
//LL
(1)分析表
privateString[][]analysisTable=newString[][]{
{"TG","","","TG","","","",""},
{"","+TG","","","ε","-TG","","ε"},
{"FS","","","FS","","","",""},
{"","ε","*FS","","ε","ε","/FS","ε"},
{"i","","","(E)","","","",""}};
//存储终结符
privateString[]VT=newString[]{"i","+","*","(",")","-","/","#"};
//存储终结符
privateString[]VN=newString[]{"E","G","T","S","F"};
//输入串
privateStringBuilderstrToken;
//分析栈
privateStackstack=newStack();
//a保存从输入串中读取的一个输入符号,当前符号
privateStringa=null;
//topChar中保存stack栈顶符号
privateStringtopChar=null;
//flag标志预测分析是否成功
privatebooleanflag=true;
//记录输入串中当前字符的位置
privateintcur=0;
//记录步数
privateintcount=0;
/**初始化*/
protectedvoidinit(){
strToken.append("#");
stack.push("#");
System.out.printf("%-9s%-38s%6s%-20s\n","步骤","符号栈","输入串",
"所用产生式");
stack.push("E");
curCharacter();
System.out.printf("%-6d%-20s%6s\n",count,stack.toString(),
strToken.substring(cur,strToken.length()));
}
/**读取当前栈顶符号*/
protectedStringstackPeek(){
topChar=stack.peek();
returntopChar;
}
/**返回输入串中当前位置的字母*/
privateStringcurCharacter(){
a=String.valueOf(strToken.charAt(cur));
returna;
}
/**判断topChar是否是终结符*/
protectedbooleantopCharisVT(){
for(inti=0;i<(VT.length-1);i++){
if(VT[i].equals(topChar)){
returntrue;
}
}
returnfalse;
}
/**查找topChar在非终结符中分析表中的横坐标*/
protectedStringVNTI(){
intNi=0,Tj=0;
for(inti=0;iif(VN[i].equals(topChar)){
Ni=i;
}
}
for(intj=0;jif(VT[j].equals(a)){
Tj=j;
}
}
returnanalysisTable[Ni][Tj];
}
//判断M[A,a