词法分析文档 1.docx

上传人:b****4 文档编号:4308134 上传时间:2022-11-29 格式:DOCX 页数:11 大小:162.82KB
下载 相关 举报
词法分析文档 1.docx_第1页
第1页 / 共11页
词法分析文档 1.docx_第2页
第2页 / 共11页
词法分析文档 1.docx_第3页
第3页 / 共11页
词法分析文档 1.docx_第4页
第4页 / 共11页
词法分析文档 1.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

词法分析文档 1.docx

《词法分析文档 1.docx》由会员分享,可在线阅读,更多相关《词法分析文档 1.docx(11页珍藏版)》请在冰豆网上搜索。

词法分析文档 1.docx

词法分析文档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,刚开始不了解:

=、<=等符号等如何判断,尝试几次后皆失败,后来又仔细阅读了术中所给的程序才了解了具体过程。

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

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

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1