武汉理工大学编译原理实验报告Word文件下载.docx
《武汉理工大学编译原理实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《武汉理工大学编译原理实验报告Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
(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=Files.newBufferedReader(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))))
Stringdelimiter=String.valueOf(line.charAt(i));
Tokentoken=newToken(TokenTable.getTokenType(delimiter),delimiter);
//以下都是运算符..
//运算符"
或"
elseif(line.charAt(i)=='
'
)
if(line.charAt(index)=='
='
StringlessThanOrEqual=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(lessThanOrEqual),lessThanOrEqual);
i=index;
StringlessThan=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(lessThan),lessThan);
StringgreaterThanOrEqual=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(greaterThanOrEqual),greaterThanOrEqual);
StringgreaterThan=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(greaterThan),greaterThan);
Stringequal=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(equal),equal);
Stringassign=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(assign),assign);
+'
StringaddAssign=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(addAssign),addAssign);
Stringadd=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(add),add);
-'
StringsubtractAssign=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(subtractAssign),subtractAssign);
Stringsubtract=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(subtract),subtract);
*'
StringmultiplyAssign=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(multiplyAssign),multiplyAssign);
Stringmultiply=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(multiply),multiply);
/'
StringdivideAssign=line.substring(i,index+1);
Tokentoken=newToken(TokenTable.getTokenType(divideAssign),divideAssign);
Stringdivide=(line.substring(i,index));
Tokentoken=newToken(TokenTable.getTokenType(divide),divide);
//其他非法字符
elseif(!
Character.isSpaceChar(line.charAt(i)))
),line.substring(i,i+1));
returntokens;
三、主要仪器设备及耗材
PC机,IntelliJIDEA,JDK8
第二部分:
实验调试与结果分析(可加页)
一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)
在扫描源程序字符串时,旦识别出关键字、分隔符、标识符、无符号常数中之一即以单词形式,类单词均采用相同的结构,即二元式编码形式输出。
每次调用词法分析程序它均能自动继续扫描下去形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。
二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)
(1)
程序输入:
程序输出:
(2)
三、实验小结、建议及体会
通过这次实验,我加深了对词法分析原理的理解。
对上课学到的抽象知识有了一个实践的练习,对我的学习非常有帮助。
词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个单词序列,用以语法分析,执行词法分析的程序成为词法分析程序或扫描程序。
本次实验就是要做一个这样的程序。
在之后的编译实验中要以本次实验为基础展开,我会继续努力的!
赋值语句的翻译程序设计
2016年01月08日
一、实验内容描述(问题域描述)
对于常用高级语言(如Pascal、C语言)的赋值语句用所学过的语法分析方法和语义分析方法进行语法分析、语义分析,并把其翻译成为中间代码形式。
对于常用高级语言(如Pascal、C语言)的源程序从左到右进行扫描,把其中赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法将其转换为中间代码形式表示输出。
3.实验要求
(1)选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。
(2)选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用硬件逻辑或者算法描述)
#include<
stdio.h>
string.h>
#defineMAX150
#defineMAXBUF255
voidterm();
voidlrparser();
voidstatement();
voidyucu();
voidexpression();
voidfactor();
charprog[MAXBUF],token[MAX];
charch;
intsyn,p,m,n,sum,kk;
char*rwtab[6]={"
begin"
"
then"
end"
};
voidscaner()
for(m=0;
m<
MAX;
m++)
token[m]=NULL;
m=0;
sum=0;
ch=prog[p++];
while(ch=='
'
)ch=prog[p++];
if((ch<
='
z'
&
ch>
a'
)||(c