Tiny语言的词法分析器C++版课程设计报告.docx
《Tiny语言的词法分析器C++版课程设计报告.docx》由会员分享,可在线阅读,更多相关《Tiny语言的词法分析器C++版课程设计报告.docx(15页珍藏版)》请在冰点文库上搜索。
![Tiny语言的词法分析器C++版课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/2/30d616ae-d30f-454c-ab8c-80cafa62e69f/30d616ae-d30f-454c-ab8c-80cafa62e69f1.gif)
Tiny语言的词法分析器C++版课程设计报告
实验报告
学号:
:
专业:
计算机科学与技术班级:
2班第9周
课程名称
编译原理课程设计
实验课时
8
实验项目
手工构造Tiny语言的词法分析器
实验时间
7-10周
实验目的
熟悉Tiny语言词法;构造DFA;设计数据类型、数据结构;用C++头现Tiny语言的词法分析器
实验环境
Windows10专业版MicrosoftVisualStudio2013
实验内容
(算法、程序、步骤和方法)
一、Tiny语言记号
ReservedwordsSpecialSymbolsOther
if+
then-
else*number(1ormoredigits)
end<
repeat=
until/
read(
write)identifier(1ormoreletters)
二、构造Tiny语言DFA
ID:
letter(letter)*
Number:
digit(digit)*
stringline="";Lex(StringinputLine){
line=inputLine;sean(Trim(line));rowCounter++;
stringTrim(string&str)//函数用于去除每行前后空格J{
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]=='{')//注释
output<<"\t"<='}')
{
output<=NULL)
{
i++;
}else
break;
}
if(line[i]=='}')//注释结束
{
output<}
if(bracketExist==false
{
//数字
while(isdigit(line[i]))
{
temp=temp*10+line[i];
if(!
isdigit(line[i+1]))
{
output<<"\t"<"<<"NUM,val="<'O'<}
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))
while(token[j]!
='\0')
output<<"\t"<"<endl;
j++;
}
}
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;
output<<"\t"<"<<"ID,name="<<break;
}
}
if(line[i+1]!
=NULL)i++;
}
str="";
if(line[i+1]!
=NULL)
丄
i++;
if(line[i]==';')
output<<"\t"<"<break;
//清空,以备下一行读取
line="";
str="";
temp=0;
J
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])
returnjudge;
boolisToken(strings)//存储符号,并判断
{
stringtoken[10]={"+","-","*","/","=","<","(",")",";",":
="};booljudge=false;
for(inti=0;i<10;i++)
{
if(s==token[i])
returnjudge;
}};
intmain()
{
ifstreaminput;
input.open("SampleInput.tny");
stringline[50];
inti=0;
while(getline(input,line[i]))
//cout<i++;
input.close();
cout<!
"<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”,若不是,则输出“D,name=”字样。
一行处理完毕,
便开始创建下一行实例,直至文件尾。
Tiny测试程序
数据记录和计算
|{Sampleprogram
inTINYlanguage-
corriputesiactorial
}
readx;{inputaninteger}
if0=1;
repeat
het:
=fact=*=x;
5:
=I-1;
untilx=0;
writetact{outputfactcirialofx)end
戡)
fiii*til..iiJtrlngMI
木・■WM@
EcMMl世M日・凰
*»Fl・^l*lti'»■*»M*rhl
口亦
D-*
«
iifwin0
HUE«uU.出tllv-uffE-lwUil!
pl^TT半
twit&«idltdiKdlttiTXHUiM^I&T
►:
™Wrd*・«X»
□Ij1:
iifuipwi
■;|iiiI''泌I.•LiXtCSOj.
in*n■・
■Lie-faIfv^lx&k"ufiAii,3miCd,]*lI
■Bi—B■-b>>■--■■-!
>■■IEBr>L_U5O-&F.-OQ-h66&ft-^7777
(Ha呼^cofran1:
l血郎诞K0$7Pn
2:
EbniTL-
StMTEW-
3£oaKviHiHrtvirial
3rC^^erUl
1,|Iftucm3r.l^iff}u?
nM-llarc^nid血Mkl-g£
nUitu(m'etawu^*Sf10J
肚可4liiLC:
Li
血r-M*pc
Uvrcxd1arc2Uun
(皈"t氐《weitx卩♦】
结论(结果)
1:
{Sampleprogram
1:
{Sampleprogram
2:
inTINYIanguage-
2:
inTINYIanguage-
3:
computesfactorial
3:
computesfactorial
4:
}
4:
}
5:
readx;{inputaninteger}
5:
ReversedWord:
read
5:
ID,name=x5:
;
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词法分析器。
增强了自己的编程能力和水平技巧,尝试了很多以前没有尝试过的方法学习到了新知识。
指导老师评议
成绩评定:
指导教师签名: