§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\} L∪M={ s∣s∈L∨s∈M}
- 连接: L M = { s t ∣ s ∈ L ∧ t ∈ M } LM = \{st|s\in L\wedge t\in M\} LM={ st∣s∈L∧t∈M}
- Kleene闭包: L ∗ = ⋃ i = 0 ∞ L i , L 0 = { ϵ } L^* = \bigcup\limits_{i=0}^\infin L^i,L^0=\{\epsilon\} L∗=i=0⋃∞Li,L0={ ϵ}
- 正闭包: L ∗ = ⋃ i = 1 ∞ L i L^* = \bigcup\limits_{i=1}^\infin L^i