文档详情

词法分析器(c语言实现).doc

发布:2018-02-01约4.24千字共6页下载文档
文本预览下载声明
词法分析c实现 实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 实验要求 2.1 待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 : = + - * / = = = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2.2 各种单词符号对应的种别码: 表2.1 各种单词符号对应的种别码 单词符号 种别码 单词符号 种别码 bgin 1 : 17 If 2 := 18 Then 3 20 wile 4 21 do 5 = 22 end 6 23 lettet(letter|digit)* 10 = 24 dight dight* 11 = 25 + 13 ; 26 — 14 ( 27 * 15 ) 28 / 16 # 0 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 例如:对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的C语言程序源代码: #include stdio.h #include string.h char prog[80],token[8],ch; int syn,p,m,n,sum; char *rwtab[6]={begin,if,then,while,do,end}; scaner(); main() {p=0; printf(\n please input a string(end with #):/n); do{ scanf(%c,ch); prog[p++]=ch; }while(ch!=#); p=0; do{ scaner(); switch(syn) {case 11:printf(( %-10d%5d )\n,sum,syn); break; case -1:printf(you have input a wrong string\n); getch(); exit(0); default: printf(( %-10s%5d )\n,token,syn); break; } }while(syn!=0); getch(); } scaner() { sum=0; for(m=0;m8;m++)token[m++]=NULL; ch=prog[p++]; m=0; while((ch== )||(ch==\n))ch=prog[p++]; if(((ch=z)(ch=a))||((ch=Z)(ch=A))) { while(((ch=z)(ch=a))||((ch=Z)(ch=A))||((ch=0)(ch=9))) {token[m++]=ch; ch=prog[p++]; } p--; syn=10; for(n=0;n6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch=0)(ch=9)) { while((ch=0)(ch=9)) { sum=sum*10+ch-0; ch=prog[p++]; } p--; syn=11; } else switch(ch) { case :token[m++]=ch; ch=prog[p++]; if(ch===
显示全部
相似文档