[编译原理] 词法分析

本文基于龙书《编译原理》及华保健教授课程,深入探讨词法分析的基本概念和技术过程,如正则表达式、有穷自动机等,并介绍了词法分析器生成工具Lex的工作原理。

根据龙书《编译原理》和 网易云课堂华保健的《编译原理》整理而成的。

 

 

下面是思维导图的笔记

  • 主要工作
    • 识别词素
    • 过滤注释和空白
    • 将编译器生成的错误消息与源程序的位置联系起来
  • 技术过程
    • 1. 正则表达式
    • 2. NFA
    • 3. DFA
    • 4. 词法分析器
  • 词法分析的整体流程
    • 1. 源代码输入
      • 预读
        • 输入缓存,使用双缓冲区方案;
        • 通常只需预读一个字符,而且在必要时才进行预读
    • 2. 词法分析
      • 扫描阶段:不需要生成词法单元的简单处理
        • 删除注释
        • 处理空白
      • 词法分析阶段:生成词法单元
  • 一些基础概念
    • 词法单元:
      • 由一个词法单元名和一个可选的属性值组成
      • 词法单元名表示某种词法单位的抽象符号
    • 模式
      • 描述一个词法单元的词素可能具有的形式
    • 词素
      • 词素是源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例
  • 词法单元的规约
    • 串和语言
      • 字母表 alphabet
        • 是一个有限的符号集合
      • 串 string
        • 是该字母表中的有序序列
      • 语言 language
        • 是某个字母表上任意的可数的串集合
    • 语言上的运算
      • 基本运算
        • 并、连接和闭包运算
        • * 号代表 0 次或多次; + 号 代表 1 次或多次
        • 定义

    • 正则表达式
      • 定义:
      • 作用:
        • 描述所有通过对某个字母表上的符号应用这些运算符而得到的语言
      • 正则集合
        • 正则表达式定义的语言叫正则集合(regular set)
      • 正则表达式的代数定律

  • 词法单元的识别
    • 状态转换图

      • 双圈表示接受状态
    • 保留字和标识符的识别
      • 方法
        • 初始化时将保留字填入符号表中
        • 为每个关键字建立单独的状态转换图
  • 词法单元分析器生成工具 Lex
    • 核心
      • 使用正则表达式来描述各个词法单元的模式,由此给出一个词法分析器的规约
      • Lex 编译器将输入的模式转换成一个状态图,并生成相应的实现代码,并存放到文件 lex.yy.c 中
    • Lex 中的冲突解决规则
      • 总是选择最长的前缀
      • 如果最长的可能前缀与多个模式匹配,总是选择在 Lex 程序中先被列出的模式
  • 有穷自动机(finite automata)
    • 不确定的有穷自动机(Nondeterministic Finite Automata, NFA)
      • 特点
        • 多条边,包括空串 ε , 离开
      • 组成

      • 转换图
      • 只要存在某条其标号序列为某个符合串的路径能够从开始状态到某个接受状态,NFA 接受这个符号串,存在某些到达非接受状态的路径不影响这个结论
    • 确定的有穷自动机 (Deterministic Finite Automata, DFA)
      • 特点
        • 只有一条边离开
  • 从正则表达式到自动机涉及的算法
    • Tompson 算法
    • 子集构造算法(subset construction)
    • Hopcroft 最小化优化算法

 

1.1 编译器概述.flv 1.2 编译器结构.flv 1.3 编译器实例.flv 2.1 词法分析的任务.flv 2.2.1 词法分析器的手工构造1.flv 2.2.2 词法分析器的手工构造2.flv 2.2.3 词法分析器的手工构造3.flv 2.3.1 正则表达式1.flv 2.3.2 正则表达式2.flv 2.3.3 正则表达式3.flv 2.3.4 正则表达式4.flv 2.4.1 有限状态自动机1.flv 2.4.2 有限状态自动机2.flv 3.1.1 RE转换成NFA:Thompson算法1.flv 3.1.2 RE转换成NFA:Thompson算法2.flv 3.1.3 RE转换成NFA:Thompson算法3.flv 3.2.1 NFA转换成DFA:子集构造算法1.flv 3.2.2 NFA转换成DFA:子集构造算法2.flv 3.2.3 NFA转换成DFA:子集构造算法3.flv 3.2.4 NFA转换成DFA:子集构造算法4.flv 3.3.1 DFA的最小化:Hopcroft算法1.flv 3.3.2 DFA的最小化:Hopcroft算法2.flv 3.3.3 DFA的最小化:Hopcroft算法3.flv 3.4.1 从DFA生成分析算法1.flv 3.4.2 从DFA生成分析算法2.flv 3.4.3 从DFA生成分析算法3.flv 4.1.1 语法分析的任务1.flv 4.1.2 语法分析的任务2.flv 4.1.3 语法分析的任务3.flv 4.2.1 上下文无关文法和推导1.flv 4.2.2 上下文无关文法和推导2.flv 4.2.3 上下文无关文法和推导3.flv 4.2.4 上下文无关文法和推导4.flv 4.2.5 上下文无关文法和推导5.flv 4.3.1 分析树和二义性文法1.flv 4.3.2 分析树和二义性文法2.flv 4.3.3 分析树和二义性文法3.flv 4.3.4 分析树和二义性文法4.flv 4.4.1 自顶向下分析1.flv 4.4.2 自顶向下分析2.flv 4.4.3 自顶向下分析3.flv 4.4.4 自顶向下分析4.flv 4.5.1 递归下降分析算法1.flv 4.5.2 递归下降分析算法2.flv 4.5.3 递归下降分析算法3.flv 4.5.4 递归下降分析算法4.flv 5.1.1 LL(1)分析算法1.flv 5.1.2 LL(1)分析算法2.flv 5.1.3 LL(1)分析算法3.flv 5.1.4 LL(1)分析算法4.flv 5.1.5 LL(1)分析算法5.flv 5.1.6 LL(1)分析算法6.flv 5.1.7 LL(1)分析算法7.flv 5.1.8 LL(1)分析算法8.flv 5.2 LL(1)分析的冲突处理.flv 5.3.1 LR(0)分析算法1.flv 5.3.2 LR(0)分析算法2.flv 5.3.3 LR(0)分析算法3.flv 5.3.4 LR(0)分析算法4.flv 5.4 SLR分析算法.flv 5.5 LR(1)分析算法.flv 5.6.1 LR(1)分析工具1.flv 5.6.2 LR(1)分析工具2.flv 5.6.3 LR(1)分析工具3.flv 6.1.1 语法制导翻译1.flv 6.1.2 语法制导翻译2.flv 6.1.3 语法制导翻译3.flv 6.2.1 语法制导翻译的实现原理1.flv 6.2.2 语法制导翻译的实现原理2.flv 6.3.1 抽象语法树1.flv 6.3.2 抽象语法树2.flv 6.3.3 抽象语法树3.flv 6.3.4 抽象语法树4.flv 6.4.1 抽象语法树的自动生成1.flv 6.4.2 抽象语法树的自动生成2.flv 7.1.1 语义分析的任务1.flv 7.1.2 语义分析的任务2.flv 7.1.3 语义分析的任务3.flv 7.2.1 语义规则及实现1.flv 7.2.2 语义规则及实现2.flv 7.2.3 语义规则及实现3.flv 7.2.4 语义规则及实现4.flv 7.3.1 符号表1.flv 7.3.2 符号表2.flv 7.3.3 符号表3.flv 7.4 语义分析中的其它问题.flv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值