一、词法分析器的作用
1、词法分析器的作用
读入字符流,组成词素,输出词法单元序列
2、词法单元、模式、词素
- <词法单元名、属性值 (可选) >
- 单元名是表示词法单位种类的抽象符号,语法分析器通过单元名即可确定词法单元序列的结构
- 属性值通常用于语义分析之后的阶段
- 描述了一类词法单元的词素可能具有的形式
- 源程序中的字符序列
- 它和某个词法单元的模式匹配,被词法分析器识别为该词法单元的实例
二、词法单元的规约 (正则表达式)
正则表达式助记-CSDN博客文章浏览阅读129次。https://blog.csdn.net/m0_74161592/article/details/140027909?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522E80E9AD4-1FD2-4D32-AEC8-09FB80BE9503%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=E80E9AD4-1FD2-4D32-AEC8-09FB80BE9503&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-140027909-null-null.nonecase&utm_term=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F&spm=1018.2226.3001.4450
1、串和语言
(1)概念
- Eg:{ 0, 1 }, ASCII, Unicode
- 在理论上,我们可以把任意的有限集合看作字母表
- 串s的长度,即 |s|,是指s中符号出现的次数
- 空串:长度为0的串,ε
(2)术语
(3)串的运算
连接 (concatenation):x和y的连接是把y附加到x的后面而形成的串,记作xy
2、语言上的运算
3、正则表达式和正则定义
4、正则表达式的扩展
三、词法单元的识别 (状态转换图)
1、状态转换图 (transition diagram)
(1)状态 (state):表示在识别词素时可能出现的情况
- 状态看作是已处理部分的总结
- 某些状态为接受状态或最终状态,表明已找到词素
- 加上*的接受状态表示最后读入的符号不在词素中
- 开始状态 (初始状态):用Start边表示
(2)边 (edge):从一个状态指向另一个状态
- 边的标号是一个或多个符号,当前状态为s,下一个输入符号为a,就沿着从s离开, 标号为a
2、保留字和标识符的识别
3、词法分析器的体系结构
- 这段代码根据读入的符号,确定下一个状态
- 如果找不到相应的边,则调用fail()进行错误恢复
4、处理多个模式的方法
- 按照优先级,顺序地尝试各个状态转换图,如果引发fail(),回退并尝试下一个状态图
- 更好的方法:并行地运行各个状态转换图;通过greedy策略,识别最长的与某个模式匹配的输入前缀
- 实际使用的方法:预先把各个状态转换图合成一个状态转换图,然后运行这个状态转换图 (后面介绍)
四、词法分析器生成工具及设计
1、词法分析工具Lex
- 模式是正则表达式
- 动作表示识别到相应模式时应采取的处理方式
- 处理方式通常用是C语言代码表示
- 调用相应的动作,该动作进行相关处理
- 之后词法分析器继续寻找其它词素