Tiny语言的词法分析器C版课程设计报告.docx
《Tiny语言的词法分析器C版课程设计报告.docx》由会员分享,可在线阅读,更多相关《Tiny语言的词法分析器C版课程设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
Tiny语言的词法分析器C版课程设计报告
实验报告
学号:
姓名:
专业:
计算机科学与技术班级:
2班第9周
课程名称
?
编译原理课程设计
实验课时
8
实验项目
手工构造Tiny语言的词法分析器
实验时间
7-10周
实验目的
熟悉Tiny语言词法;构造DFA;设计数据类型、数据结构;用C++实现Tiny语言的词法分析器
实验环境
?
Windows10专业版
MicrosoftVisualStudio2013
实验内容(算法、程序、步骤和方法)
一、Tiny语言记号
Reservedwords
SpecialSymbols
Other
if
+
number(1ormoredigits)
then
-
else
*
end
<
repeat
=
until
/
identifier(1ormoreletters)
read
(
write
)
;
:
=
二、构造Tiny语言DFA
ID:
letter(letter)*
Number:
digit(digit)*
三、根据DFA编写词法分析器
#include
#include
#include
usingnamespacestd;
staticintrowCounter=1;//静态变量,用于存储行数
staticboolbracketExist=false;//判断注释存在与否,false为不存在
classLex
{
public:
ofstreamoutput;
stringline="";
Lex(stringinputLine)
{
line=inputLine;
scan(Trim(line));
rowCounter++;
}
stringTrim(string&str)//函数用于去除每行前后空格
{
ints=str.find_first_not_of("\t");
inte=str.find_last_not_of("\t");
str=str.substr(s,e-s+1);
str+="\0";
returnstr;
}
voidscan(stringinputLine)
{
ofstreamoutput;
output.open("SampleOutput.txt",ios:
:
app);
stringline=inputLine;
inti=0;
stringstr="";
inttemp;
stringtoken="";
output<"<while(line[i]!
='\0')//根据DFA扫描并判断
{
if(line[i]=='{')//注释
{
bracketExist=true;
}
if(bracketExist==true)
{
output<<"\t"<";
while(line[i]!
='}')
{
output<if(line[i+1]!
=NULL)
{
i++;
}
else
break;
}
if(line[i]=='}')//注释结束
{
output<bracketExist=false;
}
}
if(bracketExist==false)
{
//数字
while(isdigit(line[i]))
{
temp=temp*10+line[i];
if(!
isdigit(line[i+1]))
{
output<<"\t"<"<<"NUM,val="<}
if(line[i+1]!
=NULL&&isdigit(line[i+1]))
i++;
else
break;
}
temp=0;
//符号
while(!
(isdigit(line[i])||(line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z')||line[i]==''||line[i]=='{'||line[i]=='}'))
{
token=token+line[i];
if(isdigit(line[i+1])||(line[i+1]>='a'&&line[i+1]<='z')||(line[i+1]>='A'&&line[i+1]<='Z')||line[i+1]==''||line[i+1]=='{'||line[i+1]=='}'||line[i+1]==NULL)
{
if(isToken(token))
{
output<<"\t"<"<}
else
{
intj=0;
while(token[j]!
='\0')
{
output<<"\t"<"<j++;
}
}
}
else
{
i++;
continue;
}
if(line[i+1]!
=NULL)
i++;
else
break;
}
token="";
//字母
while((line[i]>='a'&&line[i]<='z')||(line[i]>='A'&&line[i]<='Z'))
{
str=str+line[i];
if(!
((line[i+1]>='a'&&line[i+1]<='z')||(line[i+1]>='A'&&line[i+1]<='Z')))
{
if(isResearvedWord(str))//判断是否是保留字
{
output<<"\t"<"<<"ReversedWord:
"<break;
}
else
{
output<<"\t"<"<<"ID,name="<break;
}
}
if(line[i+1]!
=NULL)
i++;
}
str="";
if(line[i+1]!
=NULL)
{
i++;
}
else
break;
}
if(line[i+1]==NULL)
{
if(line[i]==';')
output<<"\t"<"<break;
}
}
//清空,以备下一行读取
line="";
str="";
temp=0;
token="";
output<output.close();
}
boolisResearvedWord(strings)//存储保留字,并判断
{
stringreservedWord[8]={"if","then","else","end","repeat","until","read","write"};
booljudge=false;
for(inti=0;i<8;i++)
{
if(s==reservedWord[i])
{
judge=true;
break;
}
}
returnjudge;
}
boolisToken(strings)//存储符号,并判断
{
stringtoken[10]={"+","-","*","/","=","<","(",")",";",":
="};
booljudge=false;
for(inti=0;i<10;i++)
{
if(s==token[i])
{
judge=true;
break;
}
}
returnjudge;
}
};
intmain()
{
ifstreaminput;
input.open("SampleInput.tny");
stringline[50];
inti=0;
while(getline(input,line[i]))
{
//cout<i++;
}
input.close();
cout<!
"<intj=0;
remove("SampleOutput.txt");
for(j=0;j
{
Lexlex(line[j]);
}
cout<!
"<return0;
}
四、重要数据结构
stringline[]:
用于存储每一行的字符,并逐个读取分析。
stringtoken[]:
用于存储TINY语言的符号,并调用遍历进行判断。
stringreservedWord[]:
用于存储TINY语言的保留字,遍历进行判断,若为真,则输出Reservedword。
staticintrowCounter:
静态变量,存储行号,每创建一个类的实例便加一。
inttemp:
用于存储数字,并输出。
staticintbracketExist:
静态变量,标记注释是否存在。
stringtoken,str分别用于临时存储读取的符号的字母串。
五、算法总结
建立Lexclass,并读取每一行,创建Lex的实例,在Lex中处理。
先判断是否在注释范围内,若是,则输出注释内容,直至产生“}”字符。
若不在注释区内,则读取单个字符,根据DFA进行判断。
若为符号,则当下一个字符不是符号时输出;若为数字,则继续往下读,直至下一个字符不是数字为止,输出。
若为字母,继续读取,直至下一个字符不是字母,把这一串字母和预先定义的保留字比对,若是,则输出“Reservedword”,若不是,则输出“ID,name=”字样。
一行处理完毕,便开始创建下一行实例,直至文件尾。
数据记录
和计算
Tiny测试程序
结论
(结果)
1:
{Sampleprogram
1:
{Sampleprogram
2:
inTINYlanguage-
2:
inTINYlanguage-
3:
computesfactorial
3:
computesfactorial
4:
}
4:
}
5:
readx;{inputaninteger}
5:
ReversedWord:
read
5:
ID,name=x
5:
;
5:
{inputaninteger}
6:
if06:
ReversedWord:
if
6:
NUM,val=0
6:
<
6:
ID,name=x
6:
ReversedWord:
then
6:
{don'tcomputeifx<=0}
7:
fact:
=1;
7:
ID,name=fact
7:
:
=
7:
NUM,val=1
7:
;
8:
repeat
8:
ReversedWord:
repeat
9:
fact:
=fact*x;
9:
ID,name=fact
9:
:
=
9:
ID,name=fact
9:
*
9:
ID,name=x
9:
;
10:
x:
=x-1;
10:
ID,name=x
10:
:
=
10:
ID,name=x
10:
-
10:
NUM,val=1
10:
;
11:
untilx=0;
11:
ReversedWord:
until
11:
ID,name=x
11:
=
11:
NUM,val=0
11:
;
12:
writefact{outputfactorialofx}
12:
ReversedWord:
write
12:
ID,name=fact
12:
{outputfactorialofx}
13:
end
13:
ReversedWord:
end
小结
顺利完成实验,熟悉了Tiny语言和其词法。
根据语言和词法规则,顺利构造DFA。
成功用C++语言,根据构造的DFA,实现了Tiny词法分析器。
增强了自己的编程能力和水平技巧,尝试了很多以前没有尝试过的方法学习到了新知识。
指导老师评议
成绩评定:
指导教师签名: