《编译原理》课程设计报告词法分析器Word下载.docx
《《编译原理》课程设计报告词法分析器Word下载.docx》由会员分享,可在线阅读,更多相关《《编译原理》课程设计报告词法分析器Word下载.docx(14页珍藏版)》请在冰点文库上搜索。
![《编译原理》课程设计报告词法分析器Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/8767a9bc-be9b-480e-b86b-3faf723c1a5b/8767a9bc-be9b-480e-b86b-3faf723c1a5b1.gif)
3.问题分析和相关知识介绍
4.设计思路和关键问题及其解决方案
5.测试和结果分析
6.总结和心得体会
附件1:
参考文献
附件2:
核心源代码
1.课程设计的目的
(1)编写词法分析器
(2)加深对词法分析器工作原理的了解和认识
编写词法分析器,词法分析器能够识别关系算符,词法分析器能够识别标识符和关键字,词法分析器能够识别无符号数。
构成词法分析器的一种简单方法是用状态转换图来描述源语言词法记号的结构,然后手工把这种状态转换图翻译成为识别词法记号的程序。
词法分析器的任务是把构成源程序的字符流翻译成词法记号流。
把自然语言构造成正规式,把正规式构造成有限自动机NFA,然后根据子集构造法把有限自动机构造成无限自动机DFA,根据极小化DFA状态数算法把DFA构造成最简DFA,其次根据最简DFA画出转换表,根据转换表画出装换图,最后根据装换图就可以编写词法分析器。
通过本次试验,不仅仅是我学会了C#基础知识,而且还是我对词法分析器有了更深入的认识,虽然在编写词法分析器过程中遇到了很多困难,例如:
C#语言不熟悉,对此法分析器的工作原理分析的不透彻,但在老师和同学的帮助下,我有了很大的提高,通过不断的努力最终顺利的完成了课程设计,很感谢帮助我的XX同学和XX老师。
参考文献
《编译原理(第2版)》高等教育出版社;
《C#程序设计及应用教程(第2版)》人民教育出版社。
1.Code文档截图
2.程序源代码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
namespaceLexicalAnalysis
{
classProgram
{
staticstring[]keys={"
static"
"
true"
return"
string"
Length"
break"
Console"
WriteLine"
bool"
false"
ture"
void"
if"
else"
while"
int"
float"
for"
enum"
default"
case"
double"
do"
};
staticList<
String>
key=newList<
string>
();
//保存关键字
bsf=newList<
//保存标识符
sz=newList<
//保存数字
gx=newList<
//保存关系运算符
ys=newList<
//保存数字运算符
//数字,标识符,空白,关系符,运算符
staticvoidMain(string[]args)
string[]date=File.ReadAllLines(@"
d:
\\code.txt"
);
//路径,并存入data
for(inti=0;
i<
date.Length;
i++)
Console.WriteLine("
第"
+(i+1)+"
行code:
"
+date.GetValue(i));
analysisByLine(date[i]);
}
//分别输出存储在四个List中的String
关键字,输入回车"
//输出所有的关键字
Console.ReadLine();
foreach(stringidinkey)
Console.WriteLine(id);
标识符,输入回车"
//输出所有的标识符
foreach(stringidinbsf)
数字,输入回车"
//输出所有的数字
foreach(stringidinsz)
关系运算符,输入回车"
//输出所有的关系运算符
foreach(stringidingx)
算数运算符,输入回车"
//输出所有的算数运算符
foreach(stringidinys)
输入回车退出"
staticvoidanalysisByLine(stringcode)
chara='
'
;
stringtemp="
"
intj=0;
while(j<
code.Length)
a=code[j];
temp="
if(Char.IsLetter(a)||a=='
_'
)//是否为标识符
temp=temp+a.ToString();
j++;
while(Char.IsLetterOrDigit(a))
if(isKey(temp))
//Console.WriteLine("
保留字:
+temp);
if(!
key.Contains(temp))
//Console.WriteLine("
添加成功"
key.Add(temp);
else
标识符:
bsf.Contains(temp))
添加成功标识符=="
bsf.Add(temp);
elseif(Char.IsDigit(a))
while(Char.IsDigit(a))
//判断是否是小数
if(a.Equals('
.'
))
//判读是否是科学记数法
E'
)||a.Equals('
e'
数字:
sz.Contains(temp))
sz.Add(temp);
elseif(a=='
<
'
)
if(a=='
='
>
关系符"
gx.Contains(temp))
gx.Add(temp);
添加成功关系=="
+'
||a=='
-'
/'
*'
运算符"
ys.Contains(temp))
ys.Add(temp
);
//判断是不是保留字的IsKey方法
staticboolisKey(stringkey)
boolflag=false;
keys.Length;
if(keys[i]==key)
flag=true;
//Console.WriteLine(key+"
是不是key"
+flag);
break;
flag=false;
//Console.WriteLine(flag+"
returnflag;
}