实验一词法分析器的设计.docx
- 文档编号:2370326
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:17
- 大小:16.29KB
实验一词法分析器的设计.docx
《实验一词法分析器的设计.docx》由会员分享,可在线阅读,更多相关《实验一词法分析器的设计.docx(17页珍藏版)》请在冰点文库上搜索。
实验一词法分析器的设计
实验一词法分析器的设计
一、实验目的
(1)学会针对转换图实现相应的高级语言源程序。
(2)深刻领会状态转换图的含义,逐步理解有限自动机。
二、实验内容
(1)某计算机语言的编译程序的词法分析部分实现。
(2)从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token),送给语法分析程序。
三、实现原理
程序中先判断这个句语句中每个单元为关键字、常数、运算符、界符,对与不同的单词符号给出不同编码形式的编码,用以区分之。
PL/0语言的EBNF表示
<常量定义>:
:
=<标识符>=<无符号整数>;
<标识符>:
:
=<字母>={<字母>|<数字>};
<加法运算符>:
:
=+|-
<乘法运算符>:
:
=*|/
<关系运算符>:
:
==|#|<|<=|>|>=
<字母>:
:
=a|b|…|X|Y|Z
<数字>:
:
=0|1|2|…|8|9
四、设计过程
1.关键字:
void,main,if,then,break,int,Char,float,include,for,while,printfscanf并为小写。
2."+”;”-”;”*”;”/”;”:
=“;”:
”;”<“;”<=“;”>“;”>=“;”<>“;”=“;”(“;”)”;”;”;”#”为运算符。
3.其他标记如字符串,表示以字母开头的标识符。
4.空格符跳过。
5.各符号对应种别码
关键字分别对应1-13
运算符分别对应401-418,501-513。
字符串对应100
常量对应200
结束符#
五、心得体会
其实匹配并不困难,主要是C++知识要求相对较高,只要把握住指针就好了。
附源程序:
#include
#include
#include
#include
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={""};
charprogram[500];
intScan(charprogram[])
{
char*keywords[13]={"void","main","if","then","break","int",
"char","float","include","for","while","printf",
"scanf"};
number=0;
status=0;
j=0;
ch=program[i++];
/*Tohandlethelettlespaceandstab*/
/*handleletters*/
if((ch>='a')&&(ch<='z'))
{
while((ch>='a')&&(ch<='z'))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for(k=0;k<13;k++)
if(strcmp(words,keywords[k])==0)
switch(k)
{
case0:
{
flag=1;
status=1;
break;
}
case1:
{
flag=2;
status=1;
break;
}
case2:
{
flag=3;
status=1;
break;
}
case3:
{
flag=4;
status=1;
break;
}
case4:
{
flag=5;
status=1;
break;
}
case5:
{
flag=6;
status=1;
break;
}
case6:
{
flag=7;
status=1;
break;
}
case7:
{
flag=8;
status=1;
break;
}
case8:
{
flag=9;
status=1;
break;
}
case9:
{
flag=10;
status=1;
break;
}
case10:
{
flag=11;
status=1;
break;
}
case11:
{
flag=12;
status=1;
break;
}
case12:
{
flag=13;
status=1;
break;
}
}
if(status==0)
{
flag=100;
}
}
/*handledigits*/
elseif((ch>='0')&&(ch<='9'))
{
number=0;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
flag=200;
i--;
}
/*opereationandedgehandle*/
elseswitch(ch)
{
case'=':
{
if(ch=='=')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if(ch=='>')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if(ch=='<')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if(ch=='!
')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if(ch=='+')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif(ch=='+')
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if(ch=='-')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif(ch=='-')
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if(ch=='*')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if(ch=='/')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=417;
}
else
{
i--;
flag=418;
}
break;
}
case';':
{
words[j]=ch;
words[j+1]='\0';
flag=501;
break;
}
case'(':
{
words[j]=ch;
words[j+1]='\0';
flag=502;
break;
}
case')':
{
words[j]=ch;
words[j+1]='\0';
flag=503;
break;
}
case'[':
{
words[j]=ch;
words[j+1]='\0';
flag=504;
break;
}
case']':
{
words[j]=ch;
words[j+1]='\0';
flag=505;
break;
}
case'{':
{
words[j]=ch;
words[j+1]='\0';
flag=506;
break;
}
case'}':
{
words[j]=ch;
words[j+1]='\0';
flag=507;
break;
}
case':
':
{
words[j]=ch;
words[j+1]='\0';
flag=508;
break;
}
case'"':
{
words[j]=ch;
words[j+1]='\0';
flag=509;
break;
}
case'%':
{
if(ch=='%')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=510;
}
else
{
i--;
flag=511;
}
break;
}
case',':
{
words[j]=ch;
words[j+1]='\0';
flag=512;
break;
}
case'#':
{
words[j]=ch;
words[j+1]='\0';
flag=513;
break;
}
case'@':
{
words[j]='#';
flag=0;
break;
}
default:
{
flag=-1;
break;
}
}
returnflag;
}
main()
{
i=0;
printf("pleaseinputaprogramendwith@");
do
{
ch=getchar();
program[i++]=ch;
}while(ch!
='@');
i=0;
do{
flag=Scan(program);
if(flag==200)
{
printf("(%2d,%4d)",flag,number);
}
elseif(flag==-1)
{
printf("(%d,error)",flag);
}
else
{
printf("(%2d,%4s)",flag,words);
}
}while(flag!
=0);
system("pause");
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 词法 分析器 设计