第3章 词法分析(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
3.1.3 词法单元的属性
用二元组<记号,属性值>表示;属性一般用符号表的指针来 表示 例如,position = initial + rate * 60 id,指向符号表中position这个条目的指针 assign _ op, id,指向符号表中initial这个条目的指针 add_op,+ id,指向符号表中rate这个条目的指针 mul_ op, * num,整数,值60
25
正则表达式的代数性质
AXIOM r|s=s|r r | ( s | t ) = ( r | s) | t ( r s) t = r ( s t ) r(s|t)=rs|rt (s|t)r=sr|tr r=r r=r r* = ( r | )* r** = r* DESCRIPTION | 是可交换的 | 是可结合的 “连接”是可结合的 “连接”是可分配的 是“连接”的单位元 * 和 之间的关系 * 的幂等性
备注
a r和s是正则式 r和s是正则式 r是正则式 r是正则式
都是左结合的。优先级从高到低:*,连接,|
24
letter_ {a,b,..z,A,B,…Z,0,1,…9, _ }
letter_ (letter_ | digit )*
正则表达式的例子( = {a, b})
正则表达式 正则集合(regular set ) a|b {a, b} ( a | b) ( a | b ) {aa, ab, ba, bb} aa | ab | ba | bb {aa, ab, ba, bb} a* 由0个或多个a构成的所有字符串集合 ( a | b) * 由a和b构成的所有字符串集合 …… a | a*b 复杂的例子 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 偶数个0和偶数个1组成的01字符串
5
3.1.1 词法分析与句法分析分开的原因
简化编译器的设计,让句法分析器简单化。 提高编译效率:使用适合词法分析的专门技术。 增强编译器的可移植性:输入设备相关的特殊性可 以被限制在词法分析器中。
6
3.1.2 词法单元、模式、词素
词法单元(token):一个词法单元名和一个可选的 属性值组成。用<token name, token value>表示。 它是源语言文法的终结符。
第三章 词法分析
1
本章内容
词法分析器:将源程序的字符流翻译成记号流,以 及用户接口等任务 构造词法分析器 手工 自动生成 重点 正则表达式 有限状态自动机 自动生成工具:Lex/Flex
2
3.1 词法分析器的作用
记号 源程序 词法分析器 语法分析器
取下一个记号 符号表
13
3.2.1 串和语言
字母表:有限符号的集合. 例: = {0,1},{a,b},{a,b,„,z,A,B,„,Z} 字符串:符号的有穷序列,例:0110, 字符串s的长度:出现在s中符号的个数,记作|s| 空串:长度为0的符号串,用表示 语言:给定字母表上的任意一个字符串集合 {,0,00,000,…}, {, a,b,aa,ab,ba,bb,…}, {}, 句子:属于语言的字符串。 本书中句子、字符串基本表达同一个意思。
3.2.2 语言上的运算
OPERATION
L和M的并(union) L和M的连接 (concatenation) L的Kleene闭包 (Kleene closure)
DEFINITION
L’ = L M = { s | s∈L 或 s ∈ M} L’ = LM = { st | s∈L且s ∈ M} L’= L*= L
i 0 i
L的0个或多个连接, {} L LLLLL … i += L L’ = L L的正闭包( positive i 1 closure) L的一个或多个连接, L LL LLL …
19
语言的运算
例如:L={a,b}, M={cc,dd} 和: L∪M = {s | s L 或 s M } 例如: L∪M ={ a, b, cc, dd } 连接: LM = {st | s L 且 t M} 例如: LM = { acc, add, bcc, bdd } 指数: L0 ={ },Li = Li -1L 例如: L1=L, L2=LL={aa,ab,ba,bb} L3={aaa, aab, aba, abb, baa, bab, bba, bbb} 闭包: L = L0 ∪ L1 ∪ L2 ∪… Kleene闭包 正闭包: L+ = L1 ∪ L2 ∪…
if(count>5) sum+=count; if ( count > 5 ) sum += count ;
3
自动生成词法分析器
词法分析的规则
词法分析器的 产生器 (eg. Lex 或 Flex)
字符流
词法分析器
词法单元流
4
词法分析器的主要任务
读入输入字符,产生token序列,交给语法分析使 用; 相关辅助任务 过滤注释、空格等; 为了报错,记录每个token在源文件中的位置
(b) (r)(s) 是一个正则表达式,表示语言L(r) L(s) (c) (r)* 是一个正则表达式,表示语言 (L(r))* (d) (r) 是一个正则表达式,表示语言 L(r)
所有的运算符都是左结合的。.
23
正则式 定义的语言 {} a {a } (r) | ( s) L(r)∪L(s) (r)(s) L(r) L(s) (r)* (L(r))* (r) L(r) ((a) (b)*)| (c)可以写成ab*| c
26
源自文库
正则表达式的代数性质
(rs)* ≠ r*s* (r|s)* ≠ r*|s*
27
3.2.4 正则定义
为了让正则表达式的表示简洁,可以对正则式命名。 d1 r1 d2 r2 ... dn rn 各个di的名字都不同, di 每个ri都是∪{d1, d2, …, di-1 }上的正则式
14
字符串例子及术语
串banana
前缀Prefix : 从s的尾部删除0个或多个符号后得到的串,
例如:, b, ba, ban, bana, banan, banana
后缀Suffix : , a, na, ana, nana, anana, banana 子串(Substring) : , b, a, n,…, ba, an, na, …, ban, ana, nan,…, bana, anan,nana, banan, anana, banana 子序列(Subsequence): bnan, nn 真前缀Proper prefix: b, ba, ban, bana, banan, 真后缀Proper suffix: a, na, ana, nana, anana
28
正则定义的例子1
C语言的标识符集合 letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_ ( letter_ | digit)*
Kleene 星号,克林星号
20
语言运算的例子
L = { A, B, …, Z, a, b, …, z },D = { 0, 1, …, 9 } L D :是字符和数字的集合; LD :一个字符的后面接一个数字的集合; L4 :四个字符的集合 L* = {以及 L 上的所有可能的串 } L (L D )* :以字符开头的字符和数字组成的串的 集合 D+ :一个或多个数字组成的串的集合。
…… } Attribute;
};
8
词法单元的例子
词法单元名 const for relation id num literal 词素例举 const for <,<=,=,… sum, count, D5 3.1, 10, 2.8E12 “hello” 模式的非形式描述 const for < 或 <= 或 = 或 … 由字母或下划线开头的字母数字串 任何数值常数 双引号之间的任意字符 串,但双引号本身除外
21
3.2.3 正则表达式
例如,C语言的标识符集可以定义为: letter_ (letter_ | digit )* 其中 letter_ { a,b,…z, A,B,…,Z, _ } 正则式(Regular Expression)可以用来表示简单的语 言,叫做正则集(regular set)。
#define ID 600
11
3.1.4 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 此时,使用“恐慌模式”的错误恢复 错误修补
12
3.2 词素的描述
正则表达式是模式的重要表示方法。
15
语言(Language)
可枚举
语言(Language):某个给定字母表上一个任意可数 的字符串集合。 Special Languages: and {}
16
语言的例子
字符集 {0,1} 语言 {1,10,100,1000,100000…} {0,1,00,11,000,111,…} {a,b,c} {abc,aabbcc,aaabbbccc,…} {A, … ,Z} {TEE,FORE,BALL,…} {FOR,WHILE,GOTO,…} {A,…,Z,a,…,z,0,…9, { 所有合法的C语言程序} +,-,…,<,>,…} { 所有语法正确的英语句子}
7
例子
C语言语句: printf(“total=%d”, score); <id, printf> #define ID_TOKEN 300 <(, > #define IF_TOKEN 400 #define FOR_TOKEN 500 <literal, “total=%d”> …… struct Token { <,, > int TokenName; <id, score> union { int IntValue; <), > double DblValue; <;, > IdItem * ptr;
9
词法单元的例子
下列结构作为词法单元token:关键字、操作符、 标识符、常量、字符串、标点符号 每个关键字对应一个词法单元(token) 表示多个运算符的词法单元tokens 一个表示所有标识符的词法单元 一个或多个表示常量的词法单元,比如数字和 字符串 每一个标点符号有一个词法单元,比如左右括 号、逗号和分号。
17
串的运算
xy 例如:x=ab y==cd, xy=abcd s = s = s 乘积(指数) 定义s0为,si为si-1s(i > 0) s1=s, s2=ss, s3=sss,… 例如,s=ab, s1=ab, s2=abab, s3=ababab 连接
18
Kleene ,星号,德语称 Kleensche Hülle
22
定义字母表上的正则表达式的规则
1. 是一个正则表达式,L()= { }
2. 如果a是上的一个符号,那么a是一个正则表达式,并且L(a)= {a} 3. 假设 r和s都是正则表达式,分别表示语言 L(r) and L(s),那么
p r e c e d e n c e
(a) (r) | (s) 是一个正则表达式,表示语言 L(r) L(s)
模式(pattern):源语言中特定记号的构成规则, 可以用正则表达式示。(例如:变量名的命名规则) 词素(lexeme):是源程序中的一个字符序列,它 和某个词法单元的模式匹配,并被词法分析器识别 为该词法单元的一个实例。
Lexeme ['lɛksim]
if ( count > 5 ) sum += count ;
3.1.3 词法单元的属性
用二元组<记号,属性值>表示;属性一般用符号表的指针来 表示 例如,position = initial + rate * 60 id,指向符号表中position这个条目的指针 assign _ op, id,指向符号表中initial这个条目的指针 add_op,+ id,指向符号表中rate这个条目的指针 mul_ op, * num,整数,值60
25
正则表达式的代数性质
AXIOM r|s=s|r r | ( s | t ) = ( r | s) | t ( r s) t = r ( s t ) r(s|t)=rs|rt (s|t)r=sr|tr r=r r=r r* = ( r | )* r** = r* DESCRIPTION | 是可交换的 | 是可结合的 “连接”是可结合的 “连接”是可分配的 是“连接”的单位元 * 和 之间的关系 * 的幂等性
备注
a r和s是正则式 r和s是正则式 r是正则式 r是正则式
都是左结合的。优先级从高到低:*,连接,|
24
letter_ {a,b,..z,A,B,…Z,0,1,…9, _ }
letter_ (letter_ | digit )*
正则表达式的例子( = {a, b})
正则表达式 正则集合(regular set ) a|b {a, b} ( a | b) ( a | b ) {aa, ab, ba, bb} aa | ab | ba | bb {aa, ab, ba, bb} a* 由0个或多个a构成的所有字符串集合 ( a | b) * 由a和b构成的所有字符串集合 …… a | a*b 复杂的例子 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 偶数个0和偶数个1组成的01字符串
5
3.1.1 词法分析与句法分析分开的原因
简化编译器的设计,让句法分析器简单化。 提高编译效率:使用适合词法分析的专门技术。 增强编译器的可移植性:输入设备相关的特殊性可 以被限制在词法分析器中。
6
3.1.2 词法单元、模式、词素
词法单元(token):一个词法单元名和一个可选的 属性值组成。用<token name, token value>表示。 它是源语言文法的终结符。
第三章 词法分析
1
本章内容
词法分析器:将源程序的字符流翻译成记号流,以 及用户接口等任务 构造词法分析器 手工 自动生成 重点 正则表达式 有限状态自动机 自动生成工具:Lex/Flex
2
3.1 词法分析器的作用
记号 源程序 词法分析器 语法分析器
取下一个记号 符号表
13
3.2.1 串和语言
字母表:有限符号的集合. 例: = {0,1},{a,b},{a,b,„,z,A,B,„,Z} 字符串:符号的有穷序列,例:0110, 字符串s的长度:出现在s中符号的个数,记作|s| 空串:长度为0的符号串,用表示 语言:给定字母表上的任意一个字符串集合 {,0,00,000,…}, {, a,b,aa,ab,ba,bb,…}, {}, 句子:属于语言的字符串。 本书中句子、字符串基本表达同一个意思。
3.2.2 语言上的运算
OPERATION
L和M的并(union) L和M的连接 (concatenation) L的Kleene闭包 (Kleene closure)
DEFINITION
L’ = L M = { s | s∈L 或 s ∈ M} L’ = LM = { st | s∈L且s ∈ M} L’= L*= L
i 0 i
L的0个或多个连接, {} L LLLLL … i += L L’ = L L的正闭包( positive i 1 closure) L的一个或多个连接, L LL LLL …
19
语言的运算
例如:L={a,b}, M={cc,dd} 和: L∪M = {s | s L 或 s M } 例如: L∪M ={ a, b, cc, dd } 连接: LM = {st | s L 且 t M} 例如: LM = { acc, add, bcc, bdd } 指数: L0 ={ },Li = Li -1L 例如: L1=L, L2=LL={aa,ab,ba,bb} L3={aaa, aab, aba, abb, baa, bab, bba, bbb} 闭包: L = L0 ∪ L1 ∪ L2 ∪… Kleene闭包 正闭包: L+ = L1 ∪ L2 ∪…
if(count>5) sum+=count; if ( count > 5 ) sum += count ;
3
自动生成词法分析器
词法分析的规则
词法分析器的 产生器 (eg. Lex 或 Flex)
字符流
词法分析器
词法单元流
4
词法分析器的主要任务
读入输入字符,产生token序列,交给语法分析使 用; 相关辅助任务 过滤注释、空格等; 为了报错,记录每个token在源文件中的位置
(b) (r)(s) 是一个正则表达式,表示语言L(r) L(s) (c) (r)* 是一个正则表达式,表示语言 (L(r))* (d) (r) 是一个正则表达式,表示语言 L(r)
所有的运算符都是左结合的。.
23
正则式 定义的语言 {} a {a } (r) | ( s) L(r)∪L(s) (r)(s) L(r) L(s) (r)* (L(r))* (r) L(r) ((a) (b)*)| (c)可以写成ab*| c
26
源自文库
正则表达式的代数性质
(rs)* ≠ r*s* (r|s)* ≠ r*|s*
27
3.2.4 正则定义
为了让正则表达式的表示简洁,可以对正则式命名。 d1 r1 d2 r2 ... dn rn 各个di的名字都不同, di 每个ri都是∪{d1, d2, …, di-1 }上的正则式
14
字符串例子及术语
串banana
前缀Prefix : 从s的尾部删除0个或多个符号后得到的串,
例如:, b, ba, ban, bana, banan, banana
后缀Suffix : , a, na, ana, nana, anana, banana 子串(Substring) : , b, a, n,…, ba, an, na, …, ban, ana, nan,…, bana, anan,nana, banan, anana, banana 子序列(Subsequence): bnan, nn 真前缀Proper prefix: b, ba, ban, bana, banan, 真后缀Proper suffix: a, na, ana, nana, anana
28
正则定义的例子1
C语言的标识符集合 letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_ ( letter_ | digit)*
Kleene 星号,克林星号
20
语言运算的例子
L = { A, B, …, Z, a, b, …, z },D = { 0, 1, …, 9 } L D :是字符和数字的集合; LD :一个字符的后面接一个数字的集合; L4 :四个字符的集合 L* = {以及 L 上的所有可能的串 } L (L D )* :以字符开头的字符和数字组成的串的 集合 D+ :一个或多个数字组成的串的集合。
…… } Attribute;
};
8
词法单元的例子
词法单元名 const for relation id num literal 词素例举 const for <,<=,=,… sum, count, D5 3.1, 10, 2.8E12 “hello” 模式的非形式描述 const for < 或 <= 或 = 或 … 由字母或下划线开头的字母数字串 任何数值常数 双引号之间的任意字符 串,但双引号本身除外
21
3.2.3 正则表达式
例如,C语言的标识符集可以定义为: letter_ (letter_ | digit )* 其中 letter_ { a,b,…z, A,B,…,Z, _ } 正则式(Regular Expression)可以用来表示简单的语 言,叫做正则集(regular set)。
#define ID 600
11
3.1.4 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 此时,使用“恐慌模式”的错误恢复 错误修补
12
3.2 词素的描述
正则表达式是模式的重要表示方法。
15
语言(Language)
可枚举
语言(Language):某个给定字母表上一个任意可数 的字符串集合。 Special Languages: and {}
16
语言的例子
字符集 {0,1} 语言 {1,10,100,1000,100000…} {0,1,00,11,000,111,…} {a,b,c} {abc,aabbcc,aaabbbccc,…} {A, … ,Z} {TEE,FORE,BALL,…} {FOR,WHILE,GOTO,…} {A,…,Z,a,…,z,0,…9, { 所有合法的C语言程序} +,-,…,<,>,…} { 所有语法正确的英语句子}
7
例子
C语言语句: printf(“total=%d”, score); <id, printf> #define ID_TOKEN 300 <(, > #define IF_TOKEN 400 #define FOR_TOKEN 500 <literal, “total=%d”> …… struct Token { <,, > int TokenName; <id, score> union { int IntValue; <), > double DblValue; <;, > IdItem * ptr;
9
词法单元的例子
下列结构作为词法单元token:关键字、操作符、 标识符、常量、字符串、标点符号 每个关键字对应一个词法单元(token) 表示多个运算符的词法单元tokens 一个表示所有标识符的词法单元 一个或多个表示常量的词法单元,比如数字和 字符串 每一个标点符号有一个词法单元,比如左右括 号、逗号和分号。
17
串的运算
xy 例如:x=ab y==cd, xy=abcd s = s = s 乘积(指数) 定义s0为,si为si-1s(i > 0) s1=s, s2=ss, s3=sss,… 例如,s=ab, s1=ab, s2=abab, s3=ababab 连接
18
Kleene ,星号,德语称 Kleensche Hülle
22
定义字母表上的正则表达式的规则
1. 是一个正则表达式,L()= { }
2. 如果a是上的一个符号,那么a是一个正则表达式,并且L(a)= {a} 3. 假设 r和s都是正则表达式,分别表示语言 L(r) and L(s),那么
p r e c e d e n c e
(a) (r) | (s) 是一个正则表达式,表示语言 L(r) L(s)
模式(pattern):源语言中特定记号的构成规则, 可以用正则表达式示。(例如:变量名的命名规则) 词素(lexeme):是源程序中的一个字符序列,它 和某个词法单元的模式匹配,并被词法分析器识别 为该词法单元的一个实例。
Lexeme ['lɛksim]
if ( count > 5 ) sum += count ;