词法分析设计实验报告附代码文档格式.docx
- 文档编号:22262727
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:170.86KB
词法分析设计实验报告附代码文档格式.docx
《词法分析设计实验报告附代码文档格式.docx》由会员分享,可在线阅读,更多相关《词法分析设计实验报告附代码文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
=、=、>
、>
=、<
>
;
◆分界符:
;
、,、(、)、[、];
三、实验要求
1、编程时注意编程风格:
空行的使用、注释的使用、缩进的使用等。
2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、根据测试数据进行测试。
测试实例应包括以下三个部分:
◆全部合法的输入。
◆各种组合的非法输入。
◆由记号组成的句子。
4、词法分析程序设计要求输出形式:
例:
输入VC++语言的实例程序:
Ifi=0thenn++;
a﹤=3b%);
输出形式为:
单词二元序列类型位置(行,列)
(单词种别,单词属性)
for(1,for)关键字(1,1)
i(6,i)标识符(1,2)
=(4,=)关系运算符(1,3)
0(5,0)常数(1,4)
then(1,then)关键字(1,5)
n(6,n)标识符(1,6)
++ErrorError(1,7)
(2,;
)分界符(1,8)
a(6,a)标识符(2,1)
﹤=(4,<
=)关系运算符(2,2)
3bErrorError(2,4)
%ErrorError(2,4)
)(2,))分界符(2,5)
)分界符(2,6)
实验报告正文:
◆功能描述:
该程序具有词法分析功能,即面对一段程序源代码,通过该程序,能检查出源代码是否由词法错误。
◆三、词法分析实验设计思想及算法:
◆首先构造六个表,key[]={"
auto"
"
break"
case"
catch"
char"
class"
const"
continue"
default"
delete"
do"
double"
else"
enum"
float"
for"
if"
int"
long"
new"
private"
protected"
public"
register"
return"
short"
static"
struct"
switch"
this"
void"
while"
then"
};
关键字表,单词种别码1;
Delimiter[]={"
;
"
("
)"
["
]"
."
{"
}"
分界符表单词种别码2
Operator[]={"
+"
-"
*"
/"
算术运算符表单词种别码3
R_operators[]={"
<
="
=="
},关键字表,单词种别码1;
stringNumber[100];
常数表单词种别码5;
stringIdentifier[100];
标示符表单词种别码6;
构造关键字判断函数Iskey(),字母判断函数Isletter(),数字判断函数Isnumber();
构造标示符判别函数InsertId(),若输入的标示符在标示符数组Identifier[]中,返回其下标,若不在,将该标示符插到数组末尾。
构造标示符判别函数InsertNumber(),若输入的数字在数字数组Number[]中,返回其下标,若不在,将该数字插到数组末尾。
具体分析函数analyse()具体实现输入源代码的识别。
anaiyse()构造思路,程序设计图:
综合以上分析,画出整个程序的运行分析程序图,如下:
整个程序的运行分析程序图
◆软件的测试方法和测试结果:
首先,将要分析的源代码写入一个文本,存于磁盘中,然后运行程序,输入源代码文件存放的路径,若输入路径正确,程序将自动分析源代码,若输入路径不正确,程序将显示,路径错误,请重新输入的提示。
下面为具体的运行实例:
源代码为:
a﹤=3b%)
输出满足要求。
◆实验总结(设计的特点、不足、收获与体会):
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,熟悉了构造词法分析程序的手工方式的相关原理,加深了对编译原理词法分析的理解,本次使用C++语言直接编写此法分析程序,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
本程序的数据输入采取直接从文件中读取,而不是由键盘输入,因此在测试过程中,输入得到大大简化,但是本程序的关键字表只初始化了一部分关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字),而且程序的测试数据存在不足,程序可能存在未发现的漏洞,以上两点有待改善。
附录该程序的源代码:
#include<
iostream>
#include<
string>
usingnamespacestd;
//数据定义
#defineMAX33
charch='
'
staticintline=1,row=0;
intNumberCount=0,IdCount=0;
stringkey[]={"
//关键字表单词种别码1
stringDelimiter[]={"
//分界符表单词种别码2
stringOperator[]={"
//算术运算符表单词种别码3
stringR_operators[]={"
//关系运算符表单词种别码4
//常数表单词种别码5
//标示符表单词种
别码6//数据分析
intIskey(stringc){//关键字判断
inti;
for(i=0;
i<
MAX;
i++){
if(key[i].compare(c)==0)return1;
}
return0;
}//判断是否为字母
intIsLetter(charc){
if(((c<
='
z'
)&
&
(c>
a'
))||((c<
Z'
A'
))){
if((ch<
(ch>
))ch=ch+32;
//转换成小写
return1;
}
elsereturn0;
}
intIsNumber(charc){//判断是否为数字
if(c>
0'
c<
9'
)return1;
//将arr中的标示符插入符号表并且返回符号表的指针
intInsertId(strings){
for(inti=0;
IdCount;
i++)
{
if(Identifier[i]==s){
returni;
break;
}
elseif(IdCount==i+1){
Identifier[IdCount]=s;
returnIdCount;
IdCount++;
}
}//将arr中的常实数插入常数表并且返回常数表的指针
intInsertNumber(strings){
for(inti=0;
NumberCount;
if(Number[i]==s){
elseif(NumberCount==i+1){
Number[NumberCount]=s;
returnNumberCount;
NumberCount++;
voidanalyse(FILE*fpin){
//arr相当于课本中的strToken
stringarr="
while((ch=fgetc(fpin))!
=EOF)//判断是否读取到文件末尾或者读取出错
arr="
if(ch=='
||ch=='
\t'
\n'
)//删除空格类字符,包括回车、制表符空格
{
if(ch=='
){
line++;
row=0;
elseif(IsLetter(ch))
while(IsLetter(ch)||IsNumber(ch))
{
arr=arr+ch;
ch=fgetc(fpin);
fseek(fpin,-1L,SEEK_CUR);
//文件指针回移一个位置
if(Iskey(arr))
{
row++;
//识别出一个字符,列增加一
cout<
arr<
\t\t(1,"
<
\t\t关键字"
\t\t("
line<
row<
endl;
}
else
row++;
InsertId(arr);
cout<
\t\t(6,"
\t\t标识符"
//处理常数
elseif(IsNumber(ch))
{
while(IsNumber(ch))//||ch=='
.'
IsNumber(fgetc(fpin))
arr=arr+ch;
if(IsLetter(ch))
while(IsLetter(ch)||IsNumber(ch))
{
arr=arr+ch;
}
fseek(fpin,-1L,SEEK_CUR);
cout<
\t\tError"
else{
InsertNumber(arr);
row++;
cout<
\t\t(5,"
\t\t常数"
}//处理算符
else{
arr=ch;
switch(ch){
case'
+'
:
{
ch=fgetc(fpin);
('
||IsNumber(ch)||IsLetter(ch))
fseek(fpin,-1L,SEEK_CUR);
\t\t(3,+)"
\t\t算术运算符"
else
arr+ch<
}break;
-'
:
if(ch=='
{fseek(fpin,-1L,SEEK_CUR);
\t\t(3,-)"
else{cout<
*'
\t\t(3,*)"
)
{cout<
\t\t(4,==)"
\t\t关系运算符"
else{fseek(fpin,-1L,SEEK_CUR);
\t\t(4,=)"
\t("
/'
ch<
\t\t(3,"
)"
break;
)'
['
]'
case'
'
'
{'
}'
\t\t(2,"
\t\t分界符"
{ch=fgetc(fpin);
)cout<
\t\t(4,>
=)"
else{cout<
}break;
\t\t(4,<
elseif(ch=='
default:
intmain(){
charin_fn[30];
FILE*fpin;
请输入源文件名(包括路径和后缀名):
for(;
cin>
in_fn;
if((fpin=fopen(in_fn,"
r"
))!
=NULL)break;
elsecout<
文件路径错误!
\n********************分析如下*********************"
单词二元序列类型位置(行,列)"
analyse(fpin);
fclose(fpin);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 设计 实验 报告 代码