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

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

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

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

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

end

<

repeat

=

until

/

identifier(1ormoreletters)

read

write

;

:

二、构造Tiny语言DFA

ID:

letter(letter)*

Number:

digit(digit)*

三、根据DFA编写词法分析器

#include<

fstream>

string>

iostream>

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

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<

rowCounter<

"

<

line<

endl;

//输出每行

while(line[i]!

='

\0'

)//根据DFA扫描并判断

{

if(line[i]=='

{'

)//注释

{

bracketExist=true;

}

if(bracketExist==true)

output<

\t"

while(line[i]!

}'

{

output<

line[i];

//不处理,直接输出

if(line[i+1]!

=NULL)

{

i++;

}

else

break;

}

if(line[i]=='

)//注释结束

line[i]<

endl;

bracketExist=false;

if(bracketExist==false)

//数字

while(isdigit(line[i]))

temp=temp*10+line[i];

if(!

isdigit(line[i+1]))

output<

NUM,val="

temp-'

0'

=NULL&

&

temp=0;

//符号

while(!

(isdigit(line[i])||(line[i]>

a'

line[i]<

z'

)||(line[i]>

A'

Z'

)||line[i]=='

'

||line[i]=='

))

token=token+line[i];

if(isdigit(line[i+1])||(line[i+1]>

line[i+1]<

)||(line[i+1]>

)||line[i+1]=='

||line[i+1]=='

||line[i+1]==NULL)

if(isToken(token))

{

output<

token<

}

else

intj=0;

while(token[j]!

{

output<

token[j]<

j++;

}

continue;

token="

//字母

while((line[i]>

str=str+line[i];

((line[i+1]>

)))

if(isResearvedWord(str))//判断是否是保留字

ReversedWord:

str<

break;

ID,name="

str="

if(line[i+1]!

i++;

}

else

break;

if(line[i+1]==NULL)

'

break;

}

//清空,以备下一行读取

line="

str="

temp=0;

token="

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;

returnjudge;

boolisToken(strings)//存储符号,并判断

stringtoken[10]={"

+"

-"

*"

/"

="

("

)"

10;

if(s==token[i])

};

intmain()

ifstreaminput;

input.open("

SampleInput.tny"

stringline[50];

inti=0;

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

//cout<

line[i]<

i++;

input.close();

cout<

endl<

Readingsourcefilecompleted!

!

intj=0;

remove("

for(j=0;

j<

i;

j++)

Lexlex(line[j]);

Writingfilecompleted!

return0;

}

四、重要数据结构

stringline[]:

用于存储每一行的字符,并逐个读取分析。

stringtoken[]:

用于存储TINY语言的符号,并调用遍历进行判断。

stringreservedWord[]:

用于存储TINY语言的保留字,遍历进行判断,若为真,则输出Reservedword。

staticintrowCounter:

静态变量,存储行号,每创建一个类的实例便加一。

inttemp:

用于存储数字,并输出。

staticintbracketExist:

静态变量,标记注释是否存在。

stringtoken,str分别用于临时存储读取的符号的字母串。

五、算法总结

建立Lexclass,并读取每一行,创建Lex的实例,在Lex中处理。

先判断是否在注释范围内,若是,则输出注释内容,直至产生“}”字符。

若不在注释区内,则读取单个字符,根据DFA进行判断。

若为符号,则当下一个字符不是符号时输出;

若为数字,则继续往下读,直至下一个字符不是数字为止,输出。

若为字母,继续读取,直至下一个字符不是字母,把这一串字母和预先定义的保留字比对,若是,则输出“Reservedword”,若不是,则输出“ID,name=”字样。

一行处理完毕,便开始创建下一行实例,直至文件尾。

数据记录

和计算

Tiny测试程序

结论

(结果)

1:

{Sampleprogram

1:

2:

inTINYlanguage-

2:

3:

computesfactorial

3:

4:

4:

5:

readx;

{inputaninteger}

5:

ReversedWord:

read

ID,name=x

;

6:

if0<

xthen{don'

tcomputeifx<

=0}

6:

if

NUM,val=0

then

{don'

7:

fact:

=1;

7:

ID,name=fact

:

NUM,val=1

8:

repeat

8:

9:

=fact*x;

9:

*

10:

x:

=x-1;

10:

-

11:

untilx=0;

11:

until

=

12:

writefact{outputfactorialofx}

12:

write

{outputfactorialofx}

13:

end

13:

小结

顺利完成实验,熟悉了Tiny语言和其词法。

根据语言和词法规则,顺利构造DFA。

成功用C++语言,根据构造的DFA,实现了Tiny词法分析器。

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

指导老师评议

成绩评定:

指导教师签名:

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

当前位置:首页 > 解决方案 > 学习计划

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

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