编译原理-03 词法分析

来源:互联网 发布:ai软件免费下载 编辑:程序博客网 时间:2024/06/16 05:01

1 词法分析接口: Lexical Analysis

输入: 源代码

输出: 单词二元组 (词性,值)


2 基本处理思路:

第一步确定 语言规范 Spec

第二步 用正则表达式描述语言规范

第三步 将正则表达式转化为NFA

第四步 将NFA转化为DFA

第五步 采用状态事件数组实现DFA


3 语言规范 Spec

  标识符(Identifier):  字母开头的字母数字串 + 下划线

 关键字(Keyword) :  class int char 等

 数值:   数字字符串 (有些复杂语言还支持科学表达法)

 操作符: + - * /等

终止符: 空格 换行\n  Tab \t等


4 用正则表达式描述语言规范

数学基础: 递归定义

初始: 空字符串 ASCII字符

递归式:

与:  A + B     字符串a或者b a属于集合A,b属于集合B 

连接: AB      字符串ab, a属于集合A,b属于集合B 

闭包(CLosure)  A*   所有由a构成的字符串包括空串


定义映射L:  正则表达式映射到 集合 (该集合的每一个元素:字符串均满足 正则表达式)

显然: 每个正则表达式只映射到集合,但可能有多个正则表达式映射到同一个集合。

L(A + B) = L(A) + L(B)

L(AB) = L(A)L(B)

L(A*) = L(A)*


5   将正则表达式转化为NFA

NFA:(S, Σ∪{ε}, δ, S0,  F) 

构建NFA,其实就是根据3个扩展规则构建相应的NFA。

A+ B       利用空字符串ε,很容易构建2个分支,分别是 A与B,即电路的并联

AB        电路串联 

A*        利用空字符串ε,可以构建2个分支, A 与结束F,并可以构建A的返回闭路

具体可以参考编译原理相关书籍。


6 NFA转化为DFA

主要思路是将NFA的可能转化状态看做一个S的子集,显然子集数目是2的|s|次方,是个有限集合。

这样每一次转化必然落到一个确定的子集中,即由不确定性变为了确定性。

具体可以参考编译原理相关书籍。


7 实现DFA

比较简单,伪算法如下:

设置初始状态

while(输入是否结束) {

根据状态表查下一个状态

如果当前状态为结束状态,输出2元组

}

注意,上面的结束状态包括错误状态。


由于数学公式输入麻烦,很多公式的证明与说明都略过,只能作为思维过程参考。

0 0