编译原理-简洁笔记 (一)

编译原理

计算机程序语言及编译

  1. 高级语言
  2. 数学公式
  3. 和自然语言表达
  4. 汇编语言
    1. 引入主记符
  5. 机器语言
    1. 01组成的二进制形式
    2. 一般使用十六进制数表示[易于理解]
    3. 可以被计算机直接理解
  6. 三者之间的关系
  7. 高级语言->编译->汇编语言->汇编->机器语言
  8. 高级语言->编译->机器语言
  9. 源语言: 高级语言
  10. 目标语言:机器或者汇编语言

编译的本质就是一个翻译的过程

编译器在语言处理系统中的位置

源程序
|
预处理器
|
经过预处理的源程序
|
编译器
|
汇编语言程序
|
汇编器
|
可重定向的机器代码   [可重定向: 内存中起始地址是不固定的]
|
链接起/加载器  [加载器:可修改重定向地址] [链接器:连接库文件,解决外部内存地址,引用其他程序的文件]
|
目标机器代码  [绝对地址=起始地址+相对地址]

编译系统的结构

字符流
|
词法分析  [词法单元流] 
|
语法分析  [语法树]
|
语义分析  [语法树][独立于具体的编程语言]
|
中间代码生成器 [中间表示形式]
|
机器无关代码优化 [中间表示形式]
|
目标代码生成器 [目标机器语言]
|
机器相关代码优化 [目标机器语言]
  1. 组成
  2. 分析部分 [与源语言相关]
  3. 综合部分 [与目标语言相关]
  4. 还有一个就是中间阶段

词法分析

  1. 工作任务
    1. 从左向右逐行扫描源程序的字符
    2. 识别单词 [机内表示->词法单元形式表示,也就是token表示] [token类似于一个map键值对,多个token和其他字符组成token序列]
    3. 确定单词类型
  2. 单词类型 [种别码]
  3. 关键字 :一对一
  4. 标识符: 多对一
  5. 常量: 一对一
  6. 运算符:一对一
  7. 界限符:一对一

语法分析 [概述]

  1. 工作任务
    1. 处理词法分析器中输出的token序列 [token序列上述略有提到]
    2. 识别各类短语
    3. 构造语法分析树
  2. 文法
  3. D:声明语句
  4. T:类型
  5. DIS:标识符序列

语义分析[概述]

  1. 工作任务
    1. 收集标识符的属性信息
    2. 语义检查
  2. 属性信息
  3. 种属 [比如:数组,常数]
  4. 类型
  5. 存储位置和长度
  6. 作用域
  7. 参数和返回值信息
  8. 符号表
  9. 存储标识符的属性信息的一个数据结构
  10. 语义检查
  11. 变量或者函数未经声明就使用
  12. 变量或者函数重复声明
  13. 运算类型不一致 [隐式转换]
  14. 操作数和操作符之间的类型不匹配
    1. 数组下标非整数
    2. 非数组标量使用下标访问
    3. 非函数使用函数调用
    4. 函数参数或者参数类型不正确
    5. 函数返回值不正确

中间代码生成

  1. 源程序的中间表示形式

    1. 三地址码 [每个指令最多有三个操作数]
    2. 语法结构树/语法树
  2. 指令类型

    1. 赋值指令
    2. 赋值类型
    3. 条件跳转
    4. 非条件跳转
    5. 参数传递
    6. 函数调用
    7. 函数返回
    8. 数组引用
    9. 数组赋值
    10. 地址和指针操作
  3. 三地址表示形式

  4. 四元式 [最多三个操作数,一个操作符]

  5. 三元式

  6. 间接三元式

文法

  1. 字母表
  2. ∑ 表示
  3. 有穷符合集合 [符号: 字母,数字,标点符号 ]
  4. 字母表运算
  5. 相乘
  6. 幂次方
  7. 正闭包 [长度正数的符号构成的集合] [{a,b,c,d}+]
  8. 克林闭包 [任意符号串构成的集合,长度可以为0]
  9. 又穷的字符序列
  10. 串的运算
    1. 连接
    2. 空串
    3. 幂运算
  11. 文法定义
    1. 未使用尖括号括起来的表示基本符号
    2. 尖括号括起来的表示语法表示
  12. 文法的形式化定义
  13. 终结符集合: token
  14. 非终结符集合:语法变量
  15. 产生式集合:产生串的式子
  16. 开始符号:
  17. 产生式简写
    1. a->b,a->c [可以写成 a->b |c] b,c为a的候选式
  18. 符号约定
  19. 终结符的约定
  20. 非终结符的约定
  21. 文法符号串 [可以表示终结符或者非终结符]
  22. 推到和规约 [这是一个逆过程]
  23. 文法的分类
    1. 0型文法
    2. 无限制文法
    3. a->b ,a至少包含一个非终结符
    4. 1 型文法
      1. 上下文有关文法
      2. a->b,a符号的个数小于等于b符号的个数
      3. b不包含空串形式
    5. 2型文法
      1. 上下文无关文法
    6. 3型文法
      1. 正则文法
      2. 左线性
      3. 右线性

上下文无关文法分析树

  1. 根节点: 文法开始符号
  2. 内部节点: 产生式的a->b应用
  3. 叶节点: 可以是终结符或者非终结符
  4. 边缘或者树的产出: 从左到右排列叶节点
  5. 短语: 分析树中每棵子树的边缘组成短语
  6. 直接短语: 只有父子两代的节点的短语
  7. 二义性文法: 一个文法生成多个分析树

正则表达式

  1. 何为正则 RE
    1. 字符串匹配模式
  2. +出现1 多 次
  3. *出现0 1 多 次
  4. ?出现0 1 次
  5. $ 结束位置
  6. ()子表达式的开始和结束
  7. .除换行符之外的任意单字符
  8. ^开始位置
  9. |两项之间的选择
  10. {2}确定的两次
  11. {2,}至少两次
  12. {2,5}最少两次,最多五次
  13. \b边界单词
  14. \B非边界单词
  15. x|y两者中的一个
  16. [xyz]任意一个
  17. [^xyz]不匹配其中的任意一个
  18. [a-z]范围

有穷自动机

  1. 离散的输入输出
  2. 又穷的内部状态
  3. 转换图
  4. 初始状态 :start箭头指示
  5. 终止状态: 双圈 [可以有多个]
  6. 带有标记的箭头
  7. 分类
  8. 确定的有穷自动机 DFA
  9. 不确定的有穷自动机 NFA
  10. 由正则表达式构造确定有穷自动
  11. 先是RE->NDF
  12. 再是NFA->DFA
  13. r1r2串联
  14. r1|r2并联
  15. r1*克林闭包自我循环
  16. DFA的每一个状态都是NFA状态的集合
  17. 空边,直接进入下一个状态
发布了92 篇原创文章 · 获赞 15 · 访问量 8613

猜你喜欢

转载自blog.csdn.net/printf123scanf/article/details/104261588