武汉理工大学编译原理实验报告Word文档格式.docx
《武汉理工大学编译原理实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《武汉理工大学编译原理实验报告Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
实验日期
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<
String,Integer>
identifierOrNumberTable=newHashMap<
>
();
//标识符或数值-标识符或数值种别码
keywordTable=newHashMap<
//关键字-关键字种别码
delimiterTable=newHashMap<
//界符-界符种别码
operatorTable=newHashMap<
//运算符-运算符种别码
static
identifierOrNumberTable.put("
error"
0);
identifier"
1);
number"
2);
keywordTable.put("
char"
3);
int"
4);
float"
5);
double"
6);
void"
7);
main"
8);
if"
9);
else"
10);
for"
11);
while"
12);
do"
13);
switch"
14);
break"
15);
continue"
16);
return"
17);
delimiterTable.put("
{"
18);
}"
19);
["
20);
]"
21);
("
22);
)"
23);
"
24);
;
"
25);
operatorTable.put("
<
26);
="
27);
28);
29);
=="
30);
31);
+"
32);
-"
33);
*"
34);
/"
35);
+="
36);
-="
37);
*="
38);
/="
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<
Token>
scan(Stringpath)throwsException;
LexerImpl.java:
publicclassLexerImplimplementsLexer
@Override
publicList<
scan(Stringpath)throwsException
List<
tokens=newArrayList<
Pathfile=Paths.get(path);
BufferedReaderin=(file);
Stringline;
while((line=in.readLine())!
=null)
intindex=0;
//若单词是一个以上的字符组成,此下标就会起作用
for(inti=0;
i<
line.length();
i++)
//标识符或关键字
if(Character.isLetter(line.charAt(i)))
index=i+1;
while(index<
line.length()&
&
Character.isLetterOrDigit(line.charAt(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("
),key);
i=index-1;
//整型非负数值
elseif(Character.isDigit(line.charAt(i)))
booleanerror=false;
if(!
error&
Character.isLetter(line.charAt(index)))
error=true;
StringtokenType=error?
"
Tokentoken=newToken(TokenTable.getTokenType(tokenType),line.substring(i,index));
//界符
elseif(TokenTable.containsDelimiter(String.valueOf(line.charAt(i))))
Stringd