编译原理实验报告册.docx

上传人:b****9 文档编号:25534578 上传时间:2023-06-09 格式:DOCX 页数:23 大小:31.27KB
下载 相关 举报
编译原理实验报告册.docx_第1页
第1页 / 共23页
编译原理实验报告册.docx_第2页
第2页 / 共23页
编译原理实验报告册.docx_第3页
第3页 / 共23页
编译原理实验报告册.docx_第4页
第4页 / 共23页
编译原理实验报告册.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

编译原理实验报告册.docx

《编译原理实验报告册.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告册.docx(23页珍藏版)》请在冰豆网上搜索。

编译原理实验报告册.docx

编译原理实验报告册

编译原理

实验报告

专业:

软件工程

班级:

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;i

Stringtok=(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;i

if(VN[i].equals(topChar)){

Ni=i;

}

}

for(intj=0;j

if(VT[j].equals(a)){

Tj=j;

}

}

returnanalysisTable[Ni][Tj];

}

//判断M[A,a

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动态背景

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1