**
词法分析
**
词法分析的首要任务是从左至右逐个扫描源程序的字符流,输出一个个单词符号:
**
词法分析程序和语言分析程序的关系
**
词法分析程序的设计
那么问题来了为什么要将缓冲区对半而且其字符串的大小不能超过半缓冲区呢?
eg: I …LOVE … YOU
这个单词可能很长,,长到一个缓冲区无法将它们全部都一次装进去比如说装到I…LOVE…YO刚好缓冲区装满了,还剩一个U你没有办法再装进去了,但是你将缓冲区对半以后可能把这个单词的I…LO一部分装入了前半段,VE…YOU另一部分装入了后半段,这样你还是一次性的装入了缓冲区,提高了词法分析程序的效率。
为什么要超前扫描呢?
**
DO 99 K = 1,10 和 DO 99 K = 1.10
前一个是一个循环的语句,而后一个是一个赋值语句,扫描到.和,才发现不同时,就需要回溯,降低了词法分析程序的效率,所有用超前扫描,这样就提高了效率。
记号(输出的内容——字符串,记号)
**
标识符—— (id,指向标识符在符号表入口的地址)ps:这里尖括号显示不出来所以用来圆括号
常数——<,值>
无符号数——<无符号数,值>
分界符——<分界符,->
运算符——<运算符,->
关键字——<关键字,->
例 C程序
while (i>=j) i–;
输出单词符号:
< while, - >
< (, - >
< id, 指向i的符号表项的指针 >
< >=, - >
< id, 指向j的符号表项的指针 >
< ), - >
< id, 指向i的符号表项的指针 >
< –, - >
< ;, - >
那怎么来实现词法分析程序了?
正规集和正规表达式等价,一个程序语言的单词表(词法分析语言的对象),单词表里面的所有单词构成了一种字符串的集合,这种特殊的集合——正规集,为了很好的描述正规集,我们运用一套正规系统给它命名,这个记号系统——正规式。每一个正规式对应一个正规集,每一个正规集都可以用一个直观的与它里面的字的结构对应的很好的表达式——正规式去对应。
DFA和NFA等价,DFA是确定的,很容易进行程序实现,DFA识别一个语言的时候很困难,NFA去识别一个语言是很容易的,很容易去进行设计。(NFA转化为DFA是用子集构造法)为了提高程序的效率我们又把DFA化简形成了最简DFA(第一次划分为终态和非终态,用空来进行区分,因为一个终态识别了空之后还在终态,而一个非终态识别了空之后就可能转向其他状态了)。
现在桥的两头已经搭建好了,需要一个一座桥把它们串联一起来,这时候就需要用到正规表达式和NFA等价。此时词法分析程序器的大致模型已经出来了。
有了这些我们的词法分析程序器应该很完美了,这时候我们在加入正规文法和NFA等价,有了正规文法和NFA等价之后就可以由正规文法和正规表达式等价,正规文法和正规集等价,正规文法和DFA等价,构成了一条通路,使我们的词法分析程序器更加锦上添花。
此片文章是听了国防科技大学和我们学校的老师讲词法分析的结合,所写的感悟。