1、词法分析文档 1词法分析1、程序流程图: 是 是 否 字母 数字 其他 运算符、 符号 界符等符号 否 是 图 3-2 2、设计过程:/*需要的库和全局变量、函数及主程序*/#include /*包含库所用的某些宏和变量*/#include /*包含字符串处理库*/#define _KEY_WORD_END waiting for your expanding /*定义关键字结束标志*/typedef struct /*单词二元组的结构*/ int typenum; char * word;WORD;char input255; /*输入缓冲区*/char token255=; /*单词缓冲区
2、*/int p_input; /*输入缓冲区指针*/int p_token; /*单词缓冲区指针*/char ch; /*当前读入字符*/char * rwtab=begin,if,then,while,do,end,_KEY_WORD_END; /*关键字数组*/*需要用到的自编函数参考实现*/char m_getch() /*从输入缓冲区读取一个字符到ch中*/ ch=inputp_input; p_input=p_input+1; return (ch);void getbc() /*去掉空白符号*/ while(ch= |ch=10) ch=inputp_input; p_input=
3、p_input+1; void concat() /*拼接单词*/ tokenp_token=ch; p_token=p_token+1; tokenp_token=0;int letter() /*判断是否是字母*/ if(ch=a&ch=A&ch=0&ch=9)return 1; else return 0;int reserve() /*检索关键字表格*/ int i=0; while(strcmp(rwtabi,_KEY_WORD_END) if(!strcmp(rwtabi,token) return i+1; i=i+1; return 10;void retract() /*回退
4、一个指针*/ p_input=p_input-1;WORD Tokenize() /*词法扫描程序*/ WORD lexical; 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; return lexical; else if(digit() while(digit() concat()
5、; m_getch(); retract(); lexical.typenum=11; lexical.word=token; return lexical; else switch(ch) case+: lexical.typenum=13; lexical.word=+; return lexical; break; case-: lexical.typenum=14; lexical.word=-; return lexical; break; case*: lexical.typenum=15; lexical.word=*; return lexical; break; case/:
6、 lexical.typenum=16; lexical.word=/; return lexical; break; case:m_getch(); if(ch=) lexical.typenum=18; lexical.word=:=; return lexical; retract(); lexical.typenum=17; lexical.word=:; return lexical; break; case:m_getch(); if(ch=) lexical.typenum=22; lexical.word=) lexical.typenum=21; lexical.word=;
7、 return lexical; retract(); lexical.typenum=20; lexical.word=:m_getch(); if(ch=) lexical.typenum=24; lexical.word=; return lexical; retract(); lexical.typenum=23; lexical.word=; return lexical; break; case=: lexical.typenum=25; lexical.word=; return lexical; break; case;: lexical.typenum=26; lexical
8、.word=; return lexical; break; case(: lexical.typenum=27; lexical.word=(; return lexical; break; case): lexical.typenum=28; lexical.word=); return lexical; break; case0:lexical.typenum=1000; lexical.word=OVER; return lexical; break; default: lexical.typenum=-1; lexical.word=ERROR; return lexical; vo
9、id main() /*主函数*/ int over=1; WORD lexical; printf(Enter Your words (end with #):); scanf(%#s,input); /指针回退为0 p_input=0; printf(Your words:n%sn,input); while(over1000&over!=-1) /*对源程序进行分析,直至结束符#*/ lexical=Tokenize(); /*获得一个新单词*/ if(lexical.typenum1000) printf(%d,%s),lexical.typenum,lexical.word); /*打印种别码和单词自身的值*/ over=lexical.typenum; printf(npress # to exit:); /*按#退出*/ scanf(%#s,input);输入为数字时,结果为:输入为字符时,结果为:3、写程序过程中遇到的问题:1,主函数内,在判断万用户输入的字符串后,没有将prog的数组下标p赋值为0,所以程序不是从字符串的最开始执行,所以运行出不正确的结果,后来注意到添加的注释(从头扫描源程序),修改后运行成功。2,刚开始不了解:=、=等符号等如何判断,尝试几次后皆失败,后来又仔细阅读了术中所给的程序才了解了具体过程。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1