合肥工业大学编译原理实验Word格式文档下载.docx
《合肥工业大学编译原理实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《合肥工业大学编译原理实验Word格式文档下载.docx(39页珍藏版)》请在冰豆网上搜索。
一、实验目的和要求
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设
计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的
理解,并能正确地、熟练地运用。
二、实验原理
(1)实验数据结构说明
K[]String数组-关键字表;
s[]char数组—分界符;
m[]char数组—算术运算符;
r[]String数组—关系运算符;
ArrayList型String数组ci—常数;
ArrayList型String数组id—标识符
(2)实验算法描述
(3)算法流程图
三、源程序代码和测试结果
packagelexicalAnalysis;
importjava.util.*;
importjava.io.*;
publicclasslexicalAnalysis{
staticStringk[]={"
for"
"
main"
if"
while"
void"
public"
static"
printf"
scanf"
asm"
do"
return"
typedef"
auto"
double"
break"
short"
using"
default"
long"
};
//关键字
staticchars[]={'
'
;
'
('
)'
['
]'
{'
}'
//2分界符
staticcharm[]={'
+'
-'
*'
/'
//3算术运算符
staticStringr[]={"
<
"
="
>
//4关系运算符
ArrayList<
String>
ci=newArrayList<
();
//5常数
id=newArrayList<
//6标识符
StringtempToken="
//临时存放组成一个“词”单位串
intpint,row=1,line=1;
//当前指针指示,行数,列数
charch;
//存放最新读入源程序字符
Stringinstring;
//存放输入de源程序代码
publicstaticvoidmain(String[]args)throwsException{
//TODOAuto-generatedmethodstub
lexicalAnalysisone=newlexicalAnalysis();
System.out.println("
单词"
+"
\t二元序列"
\t类型"
\t位置(行,列)"
);
one.readtext();
}
booleanisdigit(charc){//判断所读字符是否为数字,是则返回ture,否则返回false
if(c>
=48&
&
c<
=57)
returntrue;
else
returnfalse;
booleanisletter(charc){//判断所读字符是否为字母,是则返回true,否则返回false
if((c>
64&
c<
91)||(c>
96&
123))
booleanisline(charc){//判断字符c是否是下划线"
_"
if(c=='
_'
)
}
booleanremove(){//用于在判断关系运算符时,判断是否是要再读一个字符
charb=instring.charAt(pint+1);
//string类charAt()方法用于返回指定索引处的字符。
索引范围为从0到length()-1
if(b=='
='
||b=='
)//当其后的字符是=或>
时,要再读一个字符。
否则不要再读。
voidclearBlank(){//检查空白直到读入字符非空白
while(ch=='
'
){
getchar();
}
voidgetchar(){
pint++;
if(pint<
=instring.length()-1){
ch=instring.charAt(pint);
if(ch=='
\n'
change_row_line();
ch='
//instring数据读取完,需重新读入
voidretract(){//读入前一个字符
pint--;
voiddistinguishLeter(){//识别字符串
tempToken="
//清空
while(isletter(ch)||isdigit(ch)||isline(ch)){//字母,数字,下划线仍是字符串合法组成,继续识别
tempToken=tempToken+ch;
getchar();
voiddistinguishDigit(){//识别数字串
tempToken="
//先将strtoken置空
while(isdigit(ch)){//当数字时继续识别数字串
tempToken=tempToken+ch;
//将新识别的字符加到strtoken后
if(isletter(ch)||isline(ch)){//识别完数字串而其后是字母,下划线时出错处理
while(isletter(ch)||isline(ch)||isdigit(ch)){//当是字母,数字,下划线时继续识别错误数字串
tempToken=tempToken+ch;
getchar();
}
display(0,tempToken,'
//输出错误数字串
tempToken="
//将strtoken置空返回
}
voiddisplay(inti,Strings,chara){//各种输出处理
switch(i){
case-1:
System.out.println(a+"
\tError"
\t"
+row+"
+line+"
)"
break;
case0:
System.out.println(s+"
\t("
case1:
\t(1,"
+s+"
\t关键字"
case2:
\t(2,"
+a+"
\t分界符"
case3:
\t(3,"
\t算术运算符"
case4:
\t(4,"
\t关系运算符"
case5:
\t(5,"
\t常数"
("
case6:
\t(6,"
\t标识符"
line++;
//列数加一
voidchange_row_line(){//改变行数和列数
row++;
line=1;
voidhandleString(){//输入串处理
pint=-1;
//将搜索指示器置-1
要处理的语句为:
"
+instring);
getchar();
//读入一个字符
while(pint<
instring.length()){//当搜索指示器没有越界时
clearBlank();
//检查空白直到读入读入非空
if(isdigit(ch)){//当ch为数字时进行数字串识别
distinguishDigit();
//数字串识别
if(tempToken.length()!
=0){//经过数字串识别后,如果strtoken不为空
if(reseverci(tempToken)==-1){//如果strtoken不在ci表中,将strtoken加入ci表中
ci.add(tempToken);
//将strtoken加入ci表中
display(5,tempToken,'
//输出数字串
}
else{//如果strtoken在ci表中,仅输出
elseif(isletter(ch)){//当ch为字母时进行字符串识别
distinguishLeter();
//字符串识别
if(reserve(tempToken)==-1){//如果strtoken不在k表中
if(reseverid(tempToken)==-1){//如果strtoken不在id表中
id.add(tempToken);
//将strtoken加入id表中
display(6,tempToken,'
//输出标识串
else{//如果strtoken在id表中
else{//如果strtoken在关键字表
display(1,te