编译原理-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元组
}
注意,上面的结束状态包括错误状态。
由于数学公式输入麻烦,很多公式的证明与说明都略过,只能作为思维过程参考。
- 编译原理-03 词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理--词法分析
- 【编译原理】词法分析
- 编译原理-词法分析
- 编译原理词法分析
- 编译原理实验----词法分析
- 编译原理词法分析程序
- 编译原理:PL0词法分析
- 编译原理 之 词法分析
- 编译原理简单词法分析
- 编译原理之词法分析
- ZOJ-1439
- 数组排序【解】--英雄会
- tomcat用户配置及Address already in use: JVM_Bind错误的解决
- PGXC: data distribution in a subset of nodes
- 线程清除处理程序
- 编译原理-03 词法分析
- Hibernate:反向生成的pojo有两个的问题
- 快速阅读
- 设计模式-创建型01-简单工厂
- 看懂论文的机器学习基本知识(五)--随机森林、决策树
- berkeley db--进阶特性分析
- 使用node.js + express开发web应用笔记(2) - vash视图引擎
- 幽默
- 3D 分析