Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160264
  • 博文数量: 13
  • 博客积分: 125
  • 博客等级: 入伍新兵
  • 技术积分: 329
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-31 08:48
个人简介

爱学习,喜欢技术。

文章分类
文章存档

2017年(1)

2014年(7)

2011年(5)

我的朋友

分类: C/C++

2011-06-26 20:47:57

扫描过程,在前面已经有说过一些。这里不再重复说前面的内容。前面没有提到的内容有:
  • 文件读取。在AMRJ2010[1]中说到用缓冲区对的方式来处理文件读取。我写代码时用了最直接的变法,我把文件整个读出来,放到字符串中。因为我没见过太大的代码文件,最大的也只是3000来行而已,我们的PC机内存足以装得下,那不如整个文件都读进来,开发也方便一些。
  • 匹配原则。总是尽量匹配更多的字母。这方面我的做法是用两个指针,一个指针指向当前的状态(初始值为开始状态),另一个指针指向最后一次遇到的接受状态(初始值为开始状态)。当前状态会不断的接收字符,每次接收到一个字符就会跳转状态,如果跳转之后的状态是接受状态,那么就把最后一次遇到的接受状态指针指向这个状态,直到无法在接收输入时,并且最后一次遇到的接受状态指向的不再是开始状态,那么就已经识别出一个词素。之后把读字符的索引指向刚刚识别出的那个词素后面一位。
  • 冲突解决。这方面flex的方法是,如果有两个正则方法都可以匹配同一个词素,那么总是选择先被列出的那个模式。但根据我的经验,只有标识符和保留字之前才会有冲突,所以我识别标识符(保留字不写匹配模式),这样就没有冲突了。然后在代码中的一个字符串数组中记录所有的保留字,当匹配到标识符时,扫描一下那个数组即可。如果我再重写代码,那么我会考虑多级匹配模式的方法,即:当匹配到一个模式之后,再运行第二个DFA来解析。
  • 词法错误。我的做法是,在上面匹配原则中,如果当前状态的指针已经无法再接收字符的时候,还没有遇到一个可接受状态,则有词法错误(我们假设DFA不会错)。此时把读字符的索引指回到本次匹配的开头,丢掉第一个字符(此时报个错给用户),再开始新的匹配。

本节参考资料

  1. Alfred V.Aho、Monica S.Lam、Ravi Sethi、Jeffrey D.Ullman著,赵建华、郑滔、戴新宇译,《编译原理》,机械工业出版社,2010年4月。
  2. Michael L.Scoot著,裘宗燕译,《程序设计语言-实践之路》第2版,电子工业出版社,2007年6月。

我的代码
同前一篇文章。
阅读(2126) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~