准备写个词法分析器~~

  先好好学学DFA吧~~

该用C写还是用java呢?语言应该是无所谓吧!

然后在网上找了些资料,先留着~~给自己打点气,争取这个星期完工~~然后发帖~

 

整个程序用标准c语言写成,平台可移植。共分为四个模块:缓冲区,状态机,符号表,词法器。

 缓冲区:设置缓冲区的目的不言而喻了,是要用来减少文件访问次数,加快程序速度的。当然如果我们的内存有无限大,那就一次把文件加载到内存里就行了,但是现实是我们的内存总是有限大小的,所以我们的缓冲区不能过大。这就会带来一些问题:比如我们在查找一个单词的过程中已经到了缓冲区的末尾,如果此时只是简单的再从文件里读取源文件进来装载到缓冲区里,原来的缓冲区内容就会被覆盖掉,那么当前查找的单词的前半部分也就被丢弃了。我采用的方法是龙书上介绍的缓冲对(Buff Pair)。即装载缓冲区以缓冲器要一半大小为单位,当读到缓冲区前半段末尾的时候装载后半段,当读到后半段末尾的时候装载前半段,并且指针调到缓冲区开始。这样便构成了一个循环使用的缓冲区,当然这要要求每个单词的长度不超过半个缓冲区长度,这一点是很容易办到的,因为缓冲区再小(哪怕是手机),也可以1k以上吧?那每个单词也可以有512个字符了,足矣。

 

状态机:状态机是词法分析的中枢神经,整个词法分析过程由状态机驱动着。分析一个单词即是一个状态转换过程。状态始终是从初态(状态0)开始,根据一个个条件(即一个个读入的字符),在一个个状态之间跳转,最终达到终结态(找到单词)。当然其中还有一些细节,比如某些终结态也许是另一个终结态的中间态。比如<<=,当读到字符'<'时,虽然到达了小于号的终态(找到一个小于符),但是还不能断定,因为如果后面跟着一个字符'='那就应该算找到一个小于等于号,但是也有不跟'='的,也就是说是真正的小于号,那么就应该回退字符指针,返回小于号。等等。。再个关于状态机的访问速度问题,由于普通线性表实现的状态机每次查找下一个状态时都要遍历,这样效率很低,而且这个操作每读入一个字符就要执行一遍,再编译过程中使用非常频繁,所以这个操作的效率就至关重要了。龙书上有个比较好的算法,就是为状态机(其实就是一个数组)建立一张索引表(另一个数组),以每个状态号为下标,数组内容就是此状态在状态机中的基地址。这样就可以很名显得提高访问速度。当然也可以用哈希表,但任何哈希表实现都会浪费空间,而且建立一张哈希表的工作量比建索引表大。当然了,如果用第三方函数库(或类库)那就是另外一回事了。

 

符号表:我们知道一个程序里同一个关键字,变量名等等单词往往出现多次,如果每一次出现都为其创建一个存储区是不科学的,因为那样浪费的空间是巨大的。所有我们可以引入一个符号表的概念。每次找到一个新单词都可以先查找一下符号表,如果此单词已存在,则直接返回次单词的位置或索引号,否则便插入该单词。由于符号表经常要执行插入和查找操作,所以为了提高访问速度,可以采用哈希表来实现。

 

词法器:此模块是词法分析器的最上层,他通过一个函数NextToken为整个词法分析器的上层——语法分析器提供服务。其实现即每次从初态开始,不断地通过缓冲区模块提供的方法读入单个字符,然后交给状态机得到下一个状态,再继续取字符,继续状态转换,直到找到一个单词,于是调用符号表的Insert方法,至于是插入新的还是引用旧的就是符号表模块的事了,词法器只得到一个结果,即:此单词在符号表中的位置。http://blog.csdn.net/Cocoa17/archive/2005/05/21/377584.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一:词法分析程序 一、实验目的     通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的类型码及单词符号的自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 用C或C++写一个简单的词法分析程序,程序可以满足下列要求: 1、能分析如下几种简单的语言词法 (1) 标识符: ID=letter(letter|digit)* (2) 关键字(全部小写) main int float double char if then else switch case break continue while do for (3)整型常量:NUM=digit digit* (4)运算符 = + - * / < <= == != > >= ; ( )? : (5)空格由空白、制表符和换行符组成,用以分隔ID、NUM、运算符等,字符分析时被忽略。 2、单词符号和相应的类别码 假定单词符号和相应的类别码如下: 单词符号 种别码 int 1 = 17 float 2 < 20 if 3 <= 21 switch 4 == 22 while 5 != 23 Do 6 > 24 标识符 10 >= 25 整型常量 11 ; 26 + 13 ( 27 - 14 ) 28 * 15 ? 29 / 16 : 30 3、词法分析程序实现的功能 输入:单词序列(以文件形式提供),输出识别的单词的二元组序列到文件和屏幕 输出:二元组构成: (syn,token或sum) 其中: syn 为单词的种别码 token 为存放的单词自身符号串 sum 为整型常数 例: 源程序: int ab; float ef=20; ab=10+ef; 输出: (保留字--1,int) (标识符--10,ab) (分号--26,;) (保留字--2,float) (标识符--10,ef) (等号--17,=) (整数--11,20) (分号--26,;) (标识符--10,ab) (等号--17,=) (整数--11,10) (加号--13,+) (标识符--10,ef) (分号--26,;) 4、自己准备测试数据存放于TestData.txt文件中,测试数据中应覆盖有以上5种数据,测试结果要求以原数据与结果对照的形式输出并保存在Result.txt中,同时要把结果输出到屏幕。 5、提前准备 ① 实验前,先编制好程序,上机时输入并调试程序。 准备好多组测试数据(存放于文件TestData.txt中)。 6、写出实验报告 报告格式:要求有实验名称、实验目的、实验要求、实验内容、实验小结。 其中实验内容包括算法分析、程序流程图及程序代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值