资源描述:
《一个小语言的词法分析程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一个小语言的词法分析程序一个小语言的词法分析程序C/C++语言程序设计汇编语言程序设计BorlandC++BuilderDelphi操作系统数据结构数值分析网络通信密码安全自然语言处理人工智能数据挖掘图形图像编译原理综合算法软件使用程序开发文件格式书评新闻杂谈
2、首页
3、文章
4、下载
5、图片
6、论坛
7、留言
8、设为首页联系站长加入收藏
9、文章首页
10、计算机程序技术
11、计算机科学技术
12、计算机相关技术
13、程序人生
14、您现在的位置:纯C论坛>>文章>>计算机科学技术>>编译原理>>正文2004年4月5日星期一一个小语言的词法分析程
15、序热★★★一个小语言的词法分析程序[作者:loyalzu转贴自:不详点击数:223更新时间:2004-3-2文章录入:潇寒]示例代码:点击浏览该文件前些天写了个小语言的词法分析程序,因为前些天在VC知识库看到一个pascal词法分析的程序,觉得写得挺复杂的。其实词法分析程序的原理都是一样的,所以我想只要搞明白了简单的词法分析程序,再写复杂的就不难了,无非是多加几个关键字,多写几个条件判断语句而已。词法分析是编译程序的基础,也是最简单的。好,现在让我们看程序吧。先让我们看看这个小语言的文法吧。G[<程序
16、>]:<程序>∷=<程序首部>;<分程序>.<程序首部>∷=program<标识符><分程序>∷=<复合语句><复合语句>∷=begin<语句序列>end<语句序列>∷=<语句>{;<语句>}<语句>∷=<赋值语句>
17、<复合语句>
18、<条件语句><赋值语句>∷=<标识符>:=<表达式><条件语句>∷=if<布尔表达式>then<语句>else<语句><表达式>∷=<项>{(+
19、-)<项>}<项>∷=<因式>{(*
20、/)<因式>}<因式>∷=<标识符>
21、<无正负号常量>
22、’(’<表达式>’)’<布尔表达式
23、>∷=<表达式><关系运算符><表达式><关系运算符>∷==
24、<
25、<=
26、>
27、>=
28、<><标识符>∷=<字母>{<字母>
29、<数字>}<无正负号常量>∷=<数字>{<数字>}[.<数字>{<数字>}]<字母>∷=a
30、b
31、c
32、d
33、e
34、f
35、g
36、……
37、u
38、v
39、w
40、x
41、y
42、z<数字>∷=0
43、1
44、2
45、3
46、4
47、5
48、6
49、7
50、8
51、9根据此文法,构造一词法分析程序。输入以“#”为结束符按照这个文法,找出该语言的关键字,如program,begin,end,if,then,else,以及其他一些特殊符号,然后再构造一个分析表
52、,如下表:单词符号类别编号标识符1常数2if3then4else5program6begin7end8+9-10*11/12(13)14>15>=16<17<=18<>19:=20;21.22,23根据这个表来构造程序,程序的核心是下面的这个函数,/*******************************************************************以下为主分析函数从输入文件里面读,把分析结果写到输出文件中参数:fpin:输入文件指针fpout:输出文件指针******
53、*************************************************************/voidparse(FILE*fpin,FILE*fpout){chararr[MAXBUF];//读出的最长的字符串不超过MAXBUF,MAXBUF定义为255//够长了我想inti=0;//分析含字母的字符串用intj=0;//分析纯数字的字符串用while(1){fscanf(fpin,"%c",&ch);//从输入文件中读入一个字符if(ch==''''
54、
55、ch==''
56、t'')//过滤掉空格和tab;elseif(ch=='''')//回车换行符,为下面进行错误判断lineno++;elseif(IsDigit(ch))//读入的是数字{while(IsDigit(ch)){arr[j]=ch;j++;fscanf(fpin,"%c",&ch);}fseek(fpin,-1L,SEEK_CUR);//文件指针后退一个字节char*temp1=(char*)malloc(j+1);/memcpy(temp1,arr,j);temp1[j]='' '';//把数组
57、里面的内容拷贝到连外一个数组里面,因为我定义的//arr为255个字节,实际上写不到那么多,//所以只拷贝实际上有数据的j=0;//恢复初始状态,以备下次使用fprintf(fpout,"%stt%d",temp1,2);//常数free(temp1);//释放内存}elseif(IsAlpha(ch))//是字母开头的{while(IsAlpha(ch)
58、
59、IsDigit(ch)){arr[i]=ch;i++;fscanf(fpin,"%c",