词法分析文档 1.docx
- 文档编号:4308134
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:11
- 大小:162.82KB
词法分析文档 1.docx
《词法分析文档 1.docx》由会员分享,可在线阅读,更多相关《词法分析文档 1.docx(11页珍藏版)》请在冰豆网上搜索。
词法分析文档1
词法分析
1、程序流程图:
是是
否
字母
数字其他
运算符、符号
界符等符号
否
是
图3-2
2、设计过程:
/*需要的库和全局变量、函数及主程序*/
#include
#include
#define_KEY_WORD_END"waitingforyourexpanding"/*定义关键字结束标志*/
typedefstruct/*单词二元组的结构*/
{
inttypenum;
char*word;
}WORD;
charinput[255];/*输入缓冲区*/
chartoken[255]="";/*单词缓冲区*/
intp_input;/*输入缓冲区指针*/
intp_token;/*单词缓冲区指针*/
charch;/*当前读入字符*/
char*rwtab[]={"begin","if","then","while","do","end",_KEY_WORD_END};/*关键字数组*/
/*需要用到的自编函数参考实现*/
charm_getch(){/*从输入缓冲区读取一个字符到ch中*/
ch=input[p_input];
p_input=p_input+1;
return(ch);
}
voidgetbc(){/*去掉空白符号*/
while(ch==''||ch==10){
ch=input[p_input];
p_input=p_input+1;
}
}
voidconcat(){/*拼接单词*/
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}
intletter(){/*判断是否是字母*/
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')return1;
elsereturn0;
}
intdigit(){/*判断是否是数字*/
if(ch>='0'&&ch<='9')return1;
elsereturn0;
}
intreserve(){/*检索关键字表格*/
inti=0;
while(strcmp(rwtab[i],_KEY_WORD_END)){
if(!
strcmp(rwtab[i],token)){
returni+1;
}
i=i+1;
}
return10;
}
voidretract(){/*回退一个指针*/
p_input=p_input-1;
}
WORDTokenize(){/*词法扫描程序*/
WORDlexical;
lexical.typenum=10;
lexical.word="";
p_token=0;
m_getch();
getbc();
if(letter()){
while(letter()||digit()){
concat();
m_getch();
}
retract();
lexical.typenum=reserve();
lexical.word=token;
returnlexical;
}
elseif(digit()){
while(digit()){
concat();
m_getch();
}
retract();
lexical.typenum=11;
lexical.word=token;
returnlexical;
}
elseswitch(ch){
case'+':
lexical.typenum=13;
lexical.word="+";
returnlexical;
break;
case'-':
lexical.typenum=14;
lexical.word="-";
returnlexical;
break;
case'*':
lexical.typenum=15;
lexical.word="*";
returnlexical;
break;
case'/':
lexical.typenum=16;
lexical.word="/";
returnlexical;
break;
case':
':
m_getch();
if(ch=='='){
lexical.typenum=18;
lexical.word=":
=";
returnlexical;
}retract();
lexical.typenum=17;
lexical.word=":
";
returnlexical;
break;
case'<':
m_getch();
if(ch=='='){
lexical.typenum=22;
lexical.word="<=";
returnlexical;
}
elseif(ch=='>'){
lexical.typenum=21;
lexical.word="<>";
returnlexical;
}
retract();
lexical.typenum=20;
lexical.word="<";
returnlexical;
break;
case'>':
m_getch();
if(ch=='='){
lexical.typenum=24;
lexical.word=">=";
returnlexical;
}retract();
lexical.typenum=23;
lexical.word=">";
returnlexical;
break;
case'=':
lexical.typenum=25;
lexical.word="=";
returnlexical;
break;
case';':
lexical.typenum=26;
lexical.word=";";
returnlexical;
break;
case'(':
lexical.typenum=27;
lexical.word="(";
returnlexical;
break;
case')':
lexical.typenum=28;
lexical.word=")";
returnlexical;
break;
case'\0':
lexical.typenum=1000;
lexical.word="OVER";
returnlexical;
break;
default:
lexical.typenum=-1;
lexical.word="ERROR";
returnlexical;
}
}
voidmain()/*主函数*/
{
intover=1;
WORDlexical;
printf("EnterYourwords(endwith#):
");
scanf("%[^#]s",input);
//指针回退为0
p_input=0;
printf("Yourwords:
\n%s\n",input);
while(over<1000&&over!
=-1)/*对源程序进行分析,直至结束符#*/
{
lexical=Tokenize();/*获得一个新单词*/
if(lexical.typenum<1000)
printf("(%d,%s)",lexical.typenum,lexical.word);/*打印种别码和单词自身的值*/
over=lexical.typenum;
}
printf("\npress#toexit:
");/*按#退出*/
scanf("%[^#]s",input);
}
输入为数字时,结果为:
输入为字符时,结果为:
3、写程序过程中遇到的问题:
1,主函数内,在判断万用户输入的字符串后,没有将prog[]的数组下标p赋值为0,所以程序不是从字符串的最开始执行,所以运行出不正确的结果,后来注意到添加的注释(从头扫描源程序),修改后运行成功。
2,刚开始不了解:
=、<=等符号等如何判断,尝试几次后皆失败,后来又仔细阅读了术中所给的程序才了解了具体过程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法分析文档 词法 分析 文档