1、lettet(letter|digit)*1024dight dight*1125+13;2614(27*15)28/16#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)三、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别
2、出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.1 主程序示意图:主程序示意图如图3-1所示。其中初始包括以下两个方面: 关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,; 否 是图3-1(2)程序中需要用到的主要变量为syn,token和sum3.2 扫描子
3、程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。 是 是否 字母 数字 其他 运算符、 符号 界符等符号 是图 3-2四、词法分析程序的C语言程序源代码:#include #includeconio.hstring.hchar prog80,token8,ch;int syn,p,m,n,sum;char *rwtab6=begin,ifthenwhiledoend; scaner();main()p=0; printf(n please input a string(end w
4、ith #):n); do scanf(%c,&ch); progp+=ch; while(ch!= p=0; switch(syn) case 11:printf( %-10d%5d )n,sum,syn); break; case -1:you have input a wrong stringn getch(); exit(0); default:( %-10s%5d )n,token,syn); while(syn!=0); scaner() sum=0; for(m=0;m8;m+)tokenm+=NULL; ch=progp+; m=0; while(ch= )|(ch=n)ch=
5、progp+; if(cha)|(chZA) while(ch0(ch9 tokenm+=ch; p-; syn=10; for(n=0;n) while(ch sum=sum*10+ch-; syn=11; else switch(ch) case :tokenm+=ch; if(ch= syn=22; tokenm+=ch; else syn=20; case syn=24; syn=23;+ syn=17; syn=13;- syn=29; syn=14;!ch=progp+; syn=21; syn=31; syn=25; syn=18;* syn=15;/ syn=16;( syn=
6、27;) syn=28; syn=5; syn=6; syn=26; syn=30; syn=0;syn=17; syn=-1; tokenm+=0五、结果分析:输入begin x: end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如图5-1所示: 图5-1六、总结:词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。 语法分析编制一个递归下降分析程序,实现对词法分析程序所提供的
7、单词序列的语法检查和结构分析。利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语言的语法用扩充的BNF表示如下:=begin=;+ | -* | /=ID | NUM | (19)printf( to long sentense!else for (j=0;jq;j+)printf( %s = %s %s %s nn,quadj.result1,quadj.ag11,quadj.op1,quadj.ag21);int lrparser() int schain=0; kk=0; if (syn=1)schain=yucu();if(syn=6) if(syn=0)&(kk=0)Success!else if(kk!=1)printf(short of ! return (schain);int yucu() int schain=0; schain=statement();int statement() char tt8,eplace8; in
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1