编译原理与编译构造 课堂笔记9
来源:互联网 发布:易语言2017盗号源码 编辑:程序博客网 时间:2024/06/09 17:06
DFA ⇒ 转换表
例:
则由表的前两行得
大概代码如下
state = 0;while(1) { ch = getchar(); s = lookup(state, ch); if(s == ' ' && s is non-terminal state) { error; } else if(s == ' ' && s is terminal-state) { ungetchar(); return; } else { state = s; }}
Language ⇒By experience RE
- 逐步求精法
- FA-based
例:一个2进制数能被3整除,我们做出在某个数后面添加一个0/1后模3余的结果电路转换图
语法分析
自上而下
递归下降分析法
一个非终结符对应一个子程序
若有以下文法:
则有对应程序:
int S() { ch = getchar(); if(ch == 'a') { return A(); } else if(ch == 'b') { return B(); } else { return 0; }}int A() { ch = getchar(); if(ch == 'c') { return D(); } else if(ch == 'd') { return 1; // 表示结束 } else { return 0; // 表示出错 }}// 其余同理
换一种文法:
int S() { ch = getchar(); if(ch == 'a') { if(A()) { return 1; } else { return B(); } }}int A() { A(); if(ch == 'd') { return 1; } else { return 0; }}
在这种情况下会出现回溯和栈溢出
不能出现公共左子表达式和左递归,会出现回溯。
因此想用这种方法的话,对文法的要求比较高。
预测分析法
预处理:
提取最大公共左子表达式
消除左递归
把左递归变成右递归的形式
左递归:
- 直接左递归:
A→Aα|β - 间接左递归:
A→Bα|β,B→Aβ|θ
消除直接左递归
记
消除间接左递归
此时有间接左递归
我们强行规定优先级:
此时由消除直接左递归的方法得,
先消除直接左递归,再消除间接左递归
此时再用消除直接左递归的方法再消除一下就好了
阅读全文
0 0
- 编译原理与编译构造 课堂笔记9
- 编译原理与编译构造 课堂笔记1 导论
- 编译原理与编译构造 课堂笔记2
- 编译原理课堂笔记(1)编译概述
- 学渣课堂笔记--编译原理(1)
- 编译原理与编译构造 目录
- 编译原理与编译构造 LR文法
- 编译原理与编译构造 由语言构造文法1
- 编译原理与编译构造 由语言构造文法2
- 编译原理与编译构造 预测分析程序的构造
- 自己动手构造编译原理 & CSAPP 笔记
- 编译原理与编译构造 文法的优化1
- 编译原理与编译构造 文法的优化2
- 编译原理与编译构造 二义文法
- 编译原理与编译构造 由NFA变为DFA
- 编译原理与编译构造 Intermadiate Code Generation
- 编译原理学习笔记
- 编译原理学习笔记
- SpringMVC文件上传与下载
- Color a Tree
- java.lang.UnsatisfiedLinkError解决方法汇集
- hadoop文件系统操作
- MUI常用组件之对话框
- 编译原理与编译构造 课堂笔记9
- Windows消息机制
- LeetCode 2 Add Two Number
- java--charAt()
- META-INF文件夹是干啥的,META-INF文件夹的作用, META-INF文件夹能删吗
- HDU1789Doing Homework again
- PS(三)
- vue.js初学3之vue指令②
- OSPF笔记-8