📄 一个小语言的词法分析程序.htm
字号:
<tr>
<td vAlign=center width="3%"><IMG src="/Images/arrow.gif" align=absMiddle></td>
<td width="66%"><STRONG>一个小语言的词法分析程序</STRONG></td>
<td width="18%"> <font color=red>热</font> <font color='#009999'>★★★</font></td>
<td align=right width="13%">【字体:<A href="javascript:fontZoomA();"><FONT color=#ffffff>小</FONT></A> <A href="javascript:fontZoomB();"><FONT color=#ffffff>大</FONT></A>】</td>
</tr>
</table>
</td>
</tr>
<tr vAlign=center align=middle>
<td class=main_ArticleTitle style="WORD-BREAK: break-all" colSpan=2 height=50>一个小语言的词法分析程序</td>
</tr>
<tr vAlign=center align=middle>
<td class=main_ArticleSubheading style="WORD-BREAK: break-all" colSpan=2></td>
</tr>
<tr align=middle>
<td class=Article_tdbgall colSpan=2>作者:<a href='#' title='loyalzu'>loyalzu</a> 文章来源:不详 点击数:<script language='javascript' src='/Article/GetHits.asp?ArticleID=40'></script> 更新时间:2004-3-2</td>
</tr>
<tr>
<td class=main_tdbg_760 id=fontzoom style="WORD-BREAK: break-all" vAlign=top colSpan=2 height=300>
<table cellSpacing=0 cellPadding=10 align=left border=0>
<tr>
<td><!--插入广告JS代码--></td>
</tr>
</table>
示例代码:<BR><br><IMG SRC="images/zip.gif" border=0> <a href="/Article/UploadFiles/2004328831139.zip">点击浏览该文件</a><BR><BR> 前些天写了个小语言的词法分析程序,因为前些天在VC知识库看到一个pascal词法分析的程序,觉得写得挺复杂的。其实词法分析程序的原理都是一样的,所以我想只要搞明白了简单的词法分析程序,再写复杂的就不难了,无非是多加几个关键字,多写几个条件判断语句而已。词法分析是编译程序的基础,也是最简单的。好,现在让我们看程序吧。<BR>先让我们看看这个小语言的文法吧。<BR><BR>G[<程序>]:<BR><程序>∷=<程序首部>;<分程序>.<BR><程序首部>∷=program<标识符> <BR><分程序>∷=<复合语句> <BR><复合语句>∷=begin<语句序列>end <BR><语句序列>∷=<语句>{;<语句>}<BR><语句>∷=<赋值语句>|<复合语句>|<条件语句> <BR><赋值语句>∷=<标识符>:=<表达式><BR><条件语句>∷=if <布尔表达式> then <语句> else <语句><BR><表达式>∷=<项>{(+|-)<项>}<BR><项>∷=<因式>{(*|/)<因式>}<BR><因式>∷=<标识符>|<无正负号常量>|’(’<表达式>’)’<BR><布尔表达式>∷=<表达式><关系运算符><表达式><BR><关系运算符>∷= =|<|<=|>|>=|<><BR><标识符>∷=<字母>{<字母>|<数字>}<BR><无正负号常量>∷=<数字>{<数字>}[.<数字>{<数字>}]<BR><字母>∷=a|b|c|d|e|f|g|……|u|v|w|x|y|z<BR><数字>∷=0|1|2|3|4|5|6|7|8|9<BR><BR>根据此文法,构造一词法分析程序。输入以“#”为结束符<BR>按照这个文法,找出该语言的关键字,如program,begin,end ,if,then,else,以及其他一些特殊符号,然后再构造一个分析表,如下表:<BR><BR>单词符号 类别编号 <BR>标识符 1 <BR>常数 2 <BR>if 3 <BR>then 4 <BR>else 5 <BR>program 6 <BR>begin 7 <BR>end 8 <BR>+ 9 <BR>- 10 <BR>* 11 <BR>/ 12 <BR>( 13 <BR>) 14 <BR>> 15 <BR>>= 16 <BR>< 17 <BR><= 18 <BR><> 19 <BR>:= 20 <BR>; 21 <BR>. 22 <BR>, 23 <BR><BR>根据这个表来构造程序,程序的核心是下面的这个函数,<BR><BR>/*******************************************************************<BR>以下为主分析函数<BR>从输入文件里面读,把分析结果写到输出文件中<BR>参数:fpin :输入文件指针 fpout: 输出文件指针<BR>*******************************************************************/<BR>void parse(FILE* fpin,FILE* fpout)<BR>{<BR> char arr[MAXBUF];//读出的最长的字符串不超过MAXBUF,MAXBUF定义为255<BR> //够长了我想<BR> int i=0;//分析含字母的字符串用<BR> int j=0;//分析纯数字的字符串用<BR> <BR><BR> while(1)<BR> {<BR> fscanf(fpin,"%c",&ch);//从输入文件中读入一个字符<BR> if( ch=='' ''|| ch ==''\t'')//过滤掉空格和tab<BR> ;<BR> else if( ch==''\n'')//回车换行符,为下面进行错误判断<BR> lineno++;<BR> else if( IsDigit(ch))//读入的是数字<BR> {<BR> while(IsDigit(ch))<BR> {<BR> arr[j] = ch;<BR> j++;<BR> fscanf(fpin,"%c",&ch);<BR> }<BR><BR> fseek(fpin,-1L,SEEK_CUR);//文件指针后退一个字节<BR><BR> char* temp1 =(char*)malloc(j+1);/<BR> memcpy(temp1,arr,j);<BR> temp1[j] =''\0'';//把数组里面的内容拷贝到连外一个数组里面,因为我定义的<BR> //arr为255个字节,实际上写不到那么多,<BR> //所以只拷贝实际上有数据的<BR><BR> j=0;//恢复初始状态,以备下次使用<BR> fprintf(fpout,"%s\t\t%d\n",temp1,2);//常数<BR><BR> free(temp1);//释放内存<BR> }<BR> else if(IsAlpha(ch))//是字母开头的<BR> {<BR> while(IsAlpha(ch) || IsDigit(ch))<BR> {<BR> arr[i] =ch;<BR> i++;<BR> fscanf(fpin,"%c",&ch);<BR> }<BR> fseek(fpin,-1L,SEEK_CUR);<BR><BR> char* temp = (char*)malloc(i+1) ;<BR> memcpy(temp,arr,i);<BR> temp[i] =''\0'';<BR><BR> i=0;<BR> /*基本思想同处理数字的*/<BR><BR> if(FindOK(temp))//FindOK函数在关键字表中查找和temp字符串相同的,<BR> //找到就返回类别编号<BR> {<BR> fprintf(fpout,"%s\t\t%d \n",temp,FindOK(temp));<BR> }<BR> else<BR> {<BR> fprintf(fpout,"%s\t\t%d\n",temp,1);//标示符号<BR> }<BR> free(temp);<BR> }<BR><BR> //以下为2字节的运算符号<BR> else if( ch=='':'')//符号“:=”<BR> {<BR> fscanf(fpin,"%c",&ch);<BR> if(ch==''='') <BR> fprintf(fpout,"%s\t\t%d\n",":=",20);<BR> else <BR> fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了<BR> }<BR> else if(ch==''>'')//符号 “> “ 和”>=”<BR> { <BR> fscanf(fpin,"%c",&ch);<BR> if(ch==''='')<BR> fprintf(fpout,"%s\t\t%d\n",">=",16);<BR> ellse<BR> fprintf(fpout,">\t\t15\n");<BR> }<BR> else if( ch==''<'') //符号 “< “ 和”<=”<BR> {<BR> fscanf(fpin,"%c",&ch);<BR> if(ch==''='')<BR> {fprintf(fpout,"<=\t\t18\n");}<BR> else if( ch==''>'')<BR> {fprintf(fpout,"<>\t\t19");}<BR> else <BR> {fprintf(fpout,"<\t\t19\n");}<BR> }<BR> else {<BR> //以下为一个字节的运算符号<BR> if(ch==''-'') {fprintf(fpout,"%s\t\t%d\n",''-'',10);continue;}//在文件中输出为“- 10”<BR> if(ch=='';'') {fprintf(fpout,";\t\t21\n");continue;}<BR> if(ch==''+'') {fprintf(fpout,"+\t\t9\n");continue;}<BR> if(ch==''*'') {fprintf(fpout,"*\t\t11\n");continue;}<BR> if(ch==''/'') {fprintf(fpout,"/ \t\t12\n");continue;}<BR> if(ch==''('') {fprintf(fpout,"(\t\t13\n");continue;}<BR> if(ch=='')'') {fprintf(fpout,")\t\t14\n");continue;}<BR> if(ch==''.'') {fprintf(fpout,".\t\t22\n");continue;}<BR> if(ch=='','') {fprintf(fpout,",\t\t23\n");continue;}<BR> if(ch==''#'') break;//分析结束<BR> else fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了,输出出错信息<BR> }<BR> }<BR>}<BR><BR> 其他请看源代码,注释很详细,但是肯定有不足的地方,请大家吝赐教。有什么问题,可以给我发邮件。这是我第一次向VC知识库投稿,以后将会陆续写一些VC方面的程序来和大家共享。我的email:brilliant_zhang@21cn.com,QQ:110902663, 谢谢大家。</p><p align='center'><font color='red'><b>[1]</b></font></p> </td>
</tr>
<tr>
<td class=Article_tdbgall align=right colSpan=2>文章录入:潇寒 责任编辑:潇寒 </td>
</tr>
<tr>
<td width=5></td>
<td width=752><li>上一篇文章: 没有了</li><BR><li>下一篇文章: <a href='/Article/Class6/Class24/200404/95.html' title='文章标题:编译原理学习导论
作 者:tangl_99
更新时间:2004-4-11 6:43:31'>编译原理学习导论</a></li></td>
</tr>
<tr class=Article_tdbgall align=right>
<td colSpan=2>【<a href='/Article/Comment.asp?ArticleID=40' target='_blank'>发表评论</a>】【<a href='/User/User_Favorite.asp?Action=Add&ChannelID=1&InfoID=40' target='_blank'>加入收藏</a>】【<a href='/Article/SendMail.asp?ArticleID=40' target='_blank'>告诉好友</a>】【<a href='/Article/Print.asp?ArticleID=40' target='_blank'>打印此文</a>】【<a href='javascript:window.close();'>关闭窗口</a>】 </td>
</tr>
</table>
<table class=center_tdbgall cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr>
<td class=main_shadow></td>
</tr>
</table>
<!--文章显示代码结束-->
<!--最新热点、最新推荐、相关文章代码开始-->
<table class=center_tdbgall style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr>
<td class=main_title_282 width="33%"><B>最新热点</B></td>
<td width=5 rowSpan=2></td>
<td class=main_title_282 width="33%"><B>最新推荐</B></td>
<td width=5 rowSpan=2></td>
<td class=main_title_282 width="33%"><B>相关文章</B></td>
</tr>
<tr>
<td class=main_tdbg_760 vAlign=top height=100><script language="javascript" src="/Article/JS/Article_Hot3.js"></script></td>
<td class=main_tdbg_760 vAlign=top width="33%"><script language="javascript" src="/Article/JS/Article_Elite3.js"></script></td>
<td class=main_tdbg_760 vAlign=top width="33%"><li><a href='/Article/Class6/Class24/200410/327.html' title='文章标题:工欲善其事,必先利其器 -- lex和yacc工具介绍
作 者:高立琦
更新时间:2004-10-31 8:32:29'>工欲善其事,必先利其器 -- </a></li><br></td>
</tr>
</table>
<table class=center_tdbgall cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr>
<td class=main_shadow></td>
</tr>
</table>
<!--最新热点、最新推荐、相关文章代码结束-->
<!--网友评论代码开始-->
<table class=center_tdbgall style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr class=main_title_760>
<td height=25> <IMG src="/Images/TEAM.gif" align=absMiddle> <STRONG>网友评论:</STRONG>(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) </td>
</tr>
<tr>
<td class=main_tdbg_760><script language="javascript" src="/Article/Comment.asp?Action=JS&CommentNum=10&ArticleID=40"></script> </td>
</tr>
</table>
<table class=center_tdbgall cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr>
<td class=main_shadow></td>
</tr>
</table>
<!--网友评论代码结束-->
<!-- ********网页中部代码结束******** -->
<!-- ********网页底部代码开始******** -->
<table class=Bottom_tdbgall style="WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width=760 align=center border=0>
<tr align=middle>
<td class=Bottom_Adminlogo colSpan=2>| <A class='Bottom' href='#' onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://purec.binghua.com');">设为首页</A> | <A class=Bottom href="javascript:window.external.addFavorite('http://purec.binghua.com','哈工大·纯C论坛');">加入收藏</A> | <A class=Bottom href="mailto:iamxiaohan@126.com">联系站长</A> | <A class=Bottom href="/FriendSite/Index.asp" target=_blank>友情链接</A> | <A class=Bottom href="/Copyright.asp" target=_blank>版权申明</A> | <a class='Bottom' href='/Admin/Admin_Index.asp' target='_blank'>管理登录</a> | </td>
</tr>
<tr class=Bottom_Copyright>
<td width="20%"><IMG height=55 src="/Skin/blue/powerease_logo.gif" width=165></td>
<td width="80%"><font color=blue>哈工大·纯C论坛 http://purec.binghua.com·版权所有</a> 站长:<A href="mailto:iamxiaohan@126.com">潇寒</A> </td>
</tr>
</table>
<!-- ********网页底部代码结束******** -->
</body>
</html><NOSCRIPT><IFRAME src='*' Width='0' Height='0'></IFRAME></NOSCRIPT>
<!-- Powered by: PowerEasy 2005 -->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -