编译原理 $1 词法分析

本文详细介绍了编译器中词法分析的作用,包括预处理、词法单元生成、错误处理以及词法分析与语法分析的分离。重点讨论了正则表达式和有限自动机的概念,阐述了NFA与DFA的转换、状态最小化以及在实现中的细节,如缓冲区管理和保留字识别策略。此外,提到了自动化工具如Lex/Flex在词法分析代码生成中的应用。
摘要由CSDN通过智能技术生成

§1 词法分析

C1 词法分析

1)作用:从源程序中提取词法单元,收集信息填写符号表,供语法分析使用

2)扫描阶段:源程序预处理

  • 过滤注释和空白
  • 宏处理扩展

3)词法分析阶段:

  • 生成语法单元
  • 收集与词法单元有关的信息

4)词法错误处理:

  • 防御式:尝试进行修改剩余输入使其能够匹配某个模式,如删除、替换、插入字符,交换两相邻字符
  • 契约式:报错

语法分析和词法分析分离:

  • 简化编译器设计:通过预处理将源程序预处理为标准形式
  • 提高编译效率:使用字符缓冲技术提升编译速度,使用专门的词法分析技术
  • 增强可移植性:将输入设备相关的特殊性限制在词法分析器中

5)词法单元:词法单元类型+属性

  • 词素:源程序中匹配某个此番单元的字符序列
  • 模式:能够匹配词法单元的词素具有的形式
  • 属性:该词法单元的信息,如整数值,或指向符号表的引用(符号表保存了标识符的位置,类型等)

C2 词法

1)字母表:有限字符集合 Σ \Sigma Σ串/字/句子:字母表中符号的有穷序列;语言:任意可数的串集合

  • 空串:不含字符,记 ϵ \epsilon ϵ

  • ∅ , { ϵ } \varnothing,\{\epsilon\} ,{ ϵ}是特殊的语言

  • 前缀:从串尾删除零或多个连续字符得到的串;后缀:从串头删除零或多个连续字符得到的串;

    子串:删除某个前缀和后缀后得到的串;:至少删除一个字符

    子序列:删除零或多个字符后得到的串

  • 连接:字符序列相连成一个串

2)语言的运算:

  • 并: L ∪ M = { s ∣ s ∈ L ∨ s ∈ M } L\cup M = \{s|s\in L \vee s\in M\} LM={ ssLsM}
  • 连接: L M = { s t ∣ s ∈ L ∧ t ∈ M } LM = \{st|s\in L\wedge t\in M\} LM={ stsLtM}
  • Kleene闭包: L ∗ = ⋃ i = 0 ∞ L i , L 0 = { ϵ } L^* = \bigcup\limits_{i=0}^\infin L^i,L^0=\{\epsilon\} L=i=0Li,L0={ ϵ}
  • 正闭包: L ∗ = ⋃ i = 1 ∞ L i L^* = \bigcup\limits_{i=1}^\infin L^i
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值