Tiny语言的词法分析器C++版课程设计报告.docx

上传人:b****8 文档编号:12395701 上传时间:2023-06-05 格式:DOCX 页数:13 大小:133.79KB
下载 相关 举报
Tiny语言的词法分析器C++版课程设计报告.docx_第1页
第1页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第2页
第2页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第3页
第3页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第4页
第4页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第5页
第5页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第6页
第6页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第7页
第7页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第8页
第8页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第9页
第9页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第10页
第10页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第11页
第11页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第12页
第12页 / 共13页
Tiny语言的词法分析器C++版课程设计报告.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Tiny语言的词法分析器C++版课程设计报告.docx

《Tiny语言的词法分析器C++版课程设计报告.docx》由会员分享,可在线阅读,更多相关《Tiny语言的词法分析器C++版课程设计报告.docx(13页珍藏版)》请在冰点文库上搜索。

Tiny语言的词法分析器C++版课程设计报告.docx

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=("\t");

inte=("\t");

str=(s,e-s+1);

str+="\0";

returnstr;

}

 

voidscan(stringinputLine)

{

ofstreamoutput;

("",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<

();

}

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;

("");

stringline[50];

inti=0;

while(getline(input,line[i]))

{

//cout<

i++;

}

();

cout<

!

"<

intj=0;

remove("");

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:

if0

6:

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词法分析器。

增强了自己的编程能力和水平技巧,尝试了很多以前没有尝试过的方法学习到了新知识。

指导老师评议

 

 

成绩评定:

指导教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2