1 概述
词法分析(lexical analysis),也称scanning, 编译程序的第一阶段,其作用是识别单词(程序意义上)并找出词法错误. 读入源程序的输入字符、将它们拆分成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素
回顾词法分析在整个编译过程的位置
![[【笔记】编译原理L1#^53d248| 回顾编译原理的各个模块顺序]]
1.1 词法分析的常见做法
- 由语法分析器调用,需要的时候不断读取、生成词法单元。这样可以避免额外的输入输出。
- 词法分析可以使用:[[【笔记】编译原理L2:词法分析(lexical analysis)#3.2 正则表达式 | RE]] 和 [[【笔记】编译原理L2:词法分析(lexical analysis)#3.4 正则语言(RL)| RL]]
Note:在识别出词法单元之外,还会完成一些不需要生成词法单元的简单处理,比如删除注释、将多个连续的空白字符压缩成一个字符等
1.2 一些经典名词
词素(Lexeme) | 词法单元 (Token) <词法单元名、属性值(可选)> | 词性划分 |
---|---|---|
源程序中的字符序列,它和某类词法单元的模式匹配,被词法分析器识别为该词法单元的实例。 | 单元名是表示词法单位种类的抽象符号,语法分析器通过单元名即可确定词法单元序列的结构, 是有意义的最小的程序单位。属性值通常用于语义分析之后的阶段![]() |
根据作用对程序子串进行分类![]() |
- 词法分析的输出是单词(token)的序列<词法单元名、属性值(可选)>:
- Token序列将作为语法分析程序的输入:
- 一个具体的示例:
2 语言的定义
2.1 什么是语言
- 作用:沟通,交流,传递信息
- 自然语言:英语,中文,日语
2.2 你如何定义语言?
- 无限的集合
- 抽象地来看:字符组成了单词; 单词组成了句子; 句子携带了信息
- 语言是形式化的内容提取——单词、句子、语言:是三种不同的语言
单词(Token) | 句子(Sentence) | 语言(Language) |
---|---|---|
满足一定规则的字符(Character)串 | 满足一定规则的单词序列 | 满足一定条件的句子集合 |
示例:程序设计语言:形式化的内容提取
程序设计语言(Programming Language) | 程序(Program) | 语句(Sentence) | 单词(Token) |
---|---|---|---|
组成程序的所有语句的集合。 | 满足语法规则的语句序列 | 满足语法规则的单词序列。 | 满足词法规则的字符串 |
-
语言是字和组成字的规则
“doge”(it’s not a word ): reserved words and some rules forwords (词法)
“Long time no see”(It’s not a correct sentence): rules forsentences(语法)
检查单词错误是词法负责的范畴,检查句子错误是语法负责的范畴
-
语言是用有限的规则来描述的无限集
-
语言的组成部分
符号 (Symbol/Character) | 字母表 | 符号串(字符串) |
---|---|---|
语言中不可再分的单位 | 符号的非空有穷集合,Σ,V或其它大写字母, 其中的元素可称为字母、符号、字符。例如:V1 = {a, b, c}, V2 = {+, -, 0, 1, …,9}, Σ= {x|x∈ASCII字符} | 某字母表上的符号的有穷序列。a, b, c, abc, bc,…:V1上的符号串; 1250, +2, -1835,…:V2上的符号串。空串(ε):不含任何符号的串 |
- 语句: 字母表上符合某种构成规则的符号串序列。
- 语言 L:某字母表上的语句的集合: L(Σ); 注意:定义在同一个字母表上的语言有很多!
比如:Σ定义了语言中允许出现的全部符号;若Σ = 英文字母,L(Σ)是英文句子, 若Σ = ASCII字符, L(Σ)可以定义成C语言程序,但也可以定义成Java程序或者其他的程序语言,这里就可以构成多种语言。(此现象产生的原因:L(Σ)是字符串集合,但不是包含Σ上任意的字符串,而是满足某种规则的字符串——引出了我们要如何定义规则?)
2.3 如何定义规则
文法(G, Grammar): 四元组G = ( V N V_{N} VN , V T V_{T} VT , S S S, P P