武汉理工大学编译原理实验报告.docx
- 文档编号:29384674
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:28
- 大小:114.33KB
武汉理工大学编译原理实验报告.docx
《武汉理工大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《武汉理工大学编译原理实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
武汉理工大学编译原理实验报告
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称编译原理
开课学院计算机科学与技术学院
指导老师姓名饶文碧
学生姓名
学生专业班级软件zy1302
2015—2016学年第1学期
实验课程名称:
编译原理
实验项目名称
单词的词法分析程序设计
实验成绩
实验者
专业班级
软件zy1302
组别
同组者
实验日期
2015年12月29日
第一部分:
实验分析与设计(可加页)
一、实验内容描述(问题域描述)
1.问题描述:
对于常用高级语言(如Pascal、C语言)的各类单词进行词法分析。
2.实验内容:
完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。
3.实验要求:
(1)选择常用高级程序设计语言(如Pascal、C语言、PL/0语言)的源程序作为词法分析对象。
(2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。
其基本要求是:
对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。
二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述)
Token.java:
publicclassToken
{
privateinttokenType;//单词种别码
privateStringtokenValue;//单词值
publicToken(inttokenType,StringtokenValue)
{
this.tokenType=tokenType;
this.tokenValue=tokenValue;
}
publicintgetTokenType()
{
returntokenType;
}
publicStringgetTokenValue()
{
returntokenValue;
}
}
TokenTable.java:
publicclassTokenTable
{
privatestaticHashMap
privatestaticHashMap
privatestaticHashMap
privatestaticHashMap
static
{
identifierOrNumberTable.put("error",0);
identifierOrNumberTable.put("identifier",1);
identifierOrNumberTable.put("number",2);
keywordTable.put("char",3);
keywordTable.put("int",4);
keywordTable.put("float",5);
keywordTable.put("double",6);
keywordTable.put("void",7);
keywordTable.put("main",8);
keywordTable.put("if",9);
keywordTable.put("else",10);
keywordTable.put("for",11);
keywordTable.put("while",12);
keywordTable.put("do",13);
keywordTable.put("switch",14);
keywordTable.put("break",15);
keywordTable.put("continue",16);
keywordTable.put("return",17);
delimiterTable.put("{",18);
delimiterTable.put("}",19);
delimiterTable.put("[",20);
delimiterTable.put("]",21);
delimiterTable.put("(",22);
delimiterTable.put(")",23);
delimiterTable.put(",",24);
delimiterTable.put(";",25);
operatorTable.put("<",26);
operatorTable.put("<=",27);
operatorTable.put(">",28);
operatorTable.put(">=",29);
operatorTable.put("==",30);
operatorTable.put("=",31);
operatorTable.put("+",32);
operatorTable.put("-",33);
operatorTable.put("*",34);
operatorTable.put("/",35);
operatorTable.put("+=",36);
operatorTable.put("-=",37);
operatorTable.put("*=",38);
operatorTable.put("/=",39);
}
publicstaticbooleancontainsKeyword(Stringkeyword)
{
returnkeywordTable.containsKey(keyword);
}
publicstaticbooleancontainsDelimiter(Stringdelimiter)
{
returndelimiterTable.containsKey(delimiter);
}
publicstaticIntegergetTokenType(Stringkey)
{
returnoperatorTable.containsKey(key)?
operatorTable.get(key)
:
(delimiterTable.containsKey(key)?
delimiterTable.get(key)
:
(keywordTable.containsKey(key)?
keywordTable.get(key)
:
(identifierOrNumberTable.containsKey(key)?
identifierOrNumberTable.get(key)
:
null)));
}
}
Lexer.java:
publicinterfaceLexer
{
/**
*对给定路径的文本文件中的文本,进行词法分析,返回可迭代的单词
*集合。
*@parampath要进行词法分析的文本文件的路径
*@return可迭代的单词集合
*@throwsException抛出所有异常(这么做是为了代码清晰,唉)
*/
Iterable
}
LexerImpl.java:
publicclassLexerImplimplementsLexer
{
@Override
publicList
{
List
Pathfile=Paths.get(path);
BufferedReaderin=Files.newBufferedReader(file);
Stringline;
while((line=in.readLine())!
=null)
{
intindex=0;//若单词是一个以上的字符组成,此下标就会起作用
for(inti=0;i { //标识符或关键字 if(Character.isLetter(line.charAt(i))) { index=i+1; while(index { index++; } Stringkey=line.substring(i,index); if(TokenTable.containsKeyword(key)) { Tokentoken=newToken(TokenTable.getTokenType(key),key); tokens.add(token); } else { Tokentoken=newToken(TokenTable.getTokenType("identifier"),key); tokens.add(token); } i=index-1; } //整型非负数值 elseif(Character.isDigit(line.charAt(i))) { index=i+1; booleanerror=false; while(index { if(! error&&Character.isLetter(line.charAt(index))) { error=true; } index++; } StringtokenType=error? "error": "number"; Tokentoken=newToken(TokenTable.getTokenType(tokenType),line.substring(i,index)); tokens.add(token); i=index-1; } //界符 elseif(TokenTable.containsDelimiter(String.valueOf(line.charAt(i)))) { Stringdelimiter=String.valueOf(line.charAt(i)); Tokentoken=newToken(TokenTable.getTokenType(delimiter),delimiter); tokens.add(token); } //以下都是运算符.. //运算符"<"或"<=" elseif(line.charAt(i)=='<') { index=i+1; if(line.charAt(index)=='=') { StringlessThanOrEqual=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(lessThanOrEqual),lessThanOrEqual); tokens.add(token); i=index; } else { StringlessThan=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(lessThan),lessThan); tokens.add(token); } } //运算符">"或">=" elseif(line.charAt(i)=='>') { index=i+1; if(line.charAt(index)=='=') { StringgreaterThanOrEqual=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(greaterThanOrEqual),greaterThanOrEqual); tokens.add(token); i=index; } else { StringgreaterThan=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(greaterThan),greaterThan); tokens.add(token); } } //运算符"="或"==" elseif(line.charAt(i)=='=') { index=i+1; if(line.charAt(index)=='=') { Stringequal=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(equal),equal); tokens.add(token); i=index; } else { Stringassign=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(assign),assign); tokens.add(token); } } //运算符"+"或"+=" elseif(line.charAt(i)=='+') { index=i+1; if(line.charAt(index)=='=') { StringaddAssign=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(addAssign),addAssign); tokens.add(token); i=index; } else { Stringadd=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(add),add); tokens.add(token); } } //运算符"-"或"-=" elseif(line.charAt(i)=='-') { index=i+1; if(line.charAt(index)=='=') { StringsubtractAssign=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(subtractAssign),subtractAssign); tokens.add(token); i=index; } else { Stringsubtract=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(subtract),subtract); tokens.add(token); } } //运算符"*"或"*=" elseif(line.charAt(i)=='*') { index=i+1; if(line.charAt(index)=='=') { StringmultiplyAssign=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(multiplyAssign),multiplyAssign); tokens.add(token); i=index; } else { Stringmultiply=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(multiply),multiply); tokens.add(token); } } //运算符"/"或"/=" elseif(line.charAt(i)=='/') { index=i+1; if(line.charAt(index)=='=') { StringdivideAssign=line.substring(i,index+1); Tokentoken=newToken(TokenTable.getTokenType(divideAssign),divideAssign); tokens.add(token); i=index; } else { Stringdivide=(line.substring(i,index)); Tokentoken=newToken(TokenTable.getTokenType(divide),divide); tokens.add(token); } } //其他非法字符 elseif(! Character.isSpaceChar(line.charAt(i))) { Tokentoken=newToken(TokenTable.getTokenType("error"),line.substring(i,i+1)); tokens.add(token); } } } returntokens; } } 三、主要仪器设备及耗材 PC机,IntelliJIDEA,JDK8 第二部分: 实验调试与结果分析(可加页) 一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等) 在扫描源程序字符串时,旦识别出关键字、分隔符、标识符、无符号常数中之一即以单词形式,类单词均采用相同的结构,即二元式编码形式输出。 每次调用词法分析程序它均能自动继续扫描下去形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。 二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等) (1) 程序输入: 程序输出: (2) 程序输入: 程序输出: 三、实验小结、建议及体会 通过这次实验,我加深了对词法分析原理的理解。 对上课学到的抽象知识有了一个实践的练习,对我的学习非常有帮助。 词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用以语法分析,执行词法分析的程序成为词法分析程序或扫描程序。 本次实验就是要做一个这样的程序。 在之后的编译实验中要以本次实验为基础展开,我会继续努力的! 实验课程名称: 编译原理 实验项目名称 赋值语句的翻译程序设计 实验成绩 实验者 专业班级 软件zy1302 组别 同组者 实验日期 2016年01月08日 第一部分: 实验分析与设计(可加页) 一、实验内容描述(问题域描述) 1.问题描述: 对于常用高级语言(如Pascal、C语言)的赋值语句用所学过的语法分析方法和语义分析方法进行语法分析、语义分析,并把其翻译成为中间代码形式。 2.实验内容: 对于常用高级语言(如Pascal、C语言)的源程序从左到右进行扫描,把其中赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法将其转换为中间代码形式表示输出。 3.实验要求 (1)选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。 (2)选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述) #include #include #defineMAX150 #defineMAXBUF255 voidterm(); voidlrparser(); voidstatement(); voidyucu(); voidexpression(); voidfactor(); charprog[MAXBUF],token[MAX]; charch; intsyn,p,m,n,sum,kk; char*rwtab[6]={"begin","if","then","while","do","end"}; voidscaner() { for(m=0;m token[m]=NULL; m=0; sum=0; ch=prog[p++]; while(ch=='')ch=prog[p++]; if((ch<='z'&&ch>='a')||(c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉理工大学 编译 原理 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)