编译原理 第03章 词法分析与有穷自动机
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.2 单词符号及输出单词的形式 if (a>1) b =100;经词法分析后,输出 的单词符号串是:
(2, ) (29, ) 基本字if (30, ) 右括号 ) 左括号 ( (10,‘b’) 标识符 (17, ) 赋值号 = (10,‘a’) 标识符 b a (23, ) 大于号 > (11,100)常数 100 (11,1) 常数 1 (26, ) 分号 ;
语 法 分 析 器
3.2 单词符号及输出单词的形式 语言的单词符号是指语言中具有独立 意义的最小语法单位。
关键字 也称基本字,例如,C语言中 的if,else,while, do等。
标识符 表示各种名字,如变量名、常 量名、数组名和函数名等。
3.2 单词符号及输出单词的形式 常数 整型常数125、实型常数0.718、 布尔型常数TRUE等 。
例如,(a|b)*=(a*b*)* ;
3.3.1 正规式和正规集
正规式具有如下性质 : 令A , B 和 C 均为正规式,则 1.A | B = B | A (交换律) 2.A | ( B | C) = (A | B) | C (结合律) 3.A(BC) = (AB)C (结合律) 4.A(B | C) = AB | AC (分配律) 5.(A | B)C = AC | BC (分配律) 6. Aε | εA = A 7. A* = AA* | ε = A | A* = (A | ε )* 8. (A* )* = A*
3.3.1 正规式和正规集 运算符的优先级:闭包“*” > 连 接“· ” > 或“|” 。连结符“· ”一般可省略不 写。 运算符均是左结合的。
3.3.1 正规式和正规集 例1 设有字母表Σ={a,b} ,有:
1. a 和 b是正规式,相应正规集为 L(a)={a} , L(b)={b} 2. a | b 是正规式,相应正规集为 L(a | b )=L(a)∪L(b)={a ,b} 3. ab 是正规式,相应正规集为 L(ab)=L(a)L(b)={a}{b}={ab}
对B根据规则(4)变换为 A a*b 转换成 A aB | bB A aA | b B aaB | a | b B (aa)*(a | b) 根据规则(3)变换为 A aB | bB B aC | a | b C aB 即前面例2中的文法。
3.3.2 正规文法与正规式 例2 将描述标识符的正规式 R=l ( l | d )* 转换成相应的正规文法 令I为文法的开始符号,根据规则(2)有 I l ( l | d )* 根据规则(3)变换为 I lT T ( l | d )* 根据规则(4)变换为 I lT T ( l | d )T | ε
3.2 单词符号及输出单词的形式 例如: if (a>1) b =100; 假定: 关键字、运算符和界符都是一符一种;
标识符自身的值用自身的字符串表示;
常数自身的值用常数本身的值表示;
3.2 单词符号及输出单词的形式
假设: 标识符的种别编码为整数10 ; 常数的种别编码为整数11 ; 基本字if种别编码为2 ; 赋值号的种别编码为17 ; 大于号的种别编码为23 ; 分号的种别编码为26 ; 左括号的种别编码为29 ; 右括号的种别编码为30 ;则程序段 :
3.3.2 正规文法与正规式
例2 设有正规文法G: A aB | bB B aC | a | b C aB 试给出该文法生成语言的正规式。 正规式方程组如下:
A = aB + bB (1) B = aC + a + b (2) C = aB (3)
3.3.2 正规文法与正规式
A = aB + bB (1) B = aC + a + b (2) C = aB (3) 将(3)代入(2)中的C得 B = aaB + a + b (4) X =αX + β, 则解为 X= α*β 对(4)使用求解规则得 B = (aa)*(a + b) (5) (5)代入(1)中的B得 A = (a + b)(aa)*(a + b) 即正规文法G[A]所生成语言的正规式是 R = (a | b)(aa)*(a | b)
3.3 单词符号的两种定义方式
正规文法
正规式
以标识符为例: I→l|Il|Id 或 I→l|lT T→l|d|lT|dT 以标识符为例: l ( l | d )*
3.3.1 正规式和正规集
设有字母表Σ={a1, a2,…, an} ,在字母表 Σ上的正规式和它所表示的正规集(正规式描 述的语言)用如下规则定义: 1. Φ是Σ 上的正规式,它所表示的正规 集是 Φ ,即空集{ }。 2. ε是Σ 上的正规式,它所表示的正规 集仅含一空符号串,即{ε}。 3. ai是∑上的一个正规式,它所表示的 正规集是由单个符号ai 所组成,即{ai}。
3.3.2 正规文法与正规式
例1 设有正规文法G: Z 0A A 0A | 0B B 1A | ε 试给出该文法生成语言的正规式。 正规式方程组如下: Z = 0A A = 0A + 0B (1) (2)
B = 1A + ε
(3)
3.3.2 正规文法与正规式
Z = 0A (1) 将(3)代入(2)中的B得 A = 0A + 0B (2) A = 0A + 01A + 0 (4) B = 1A +ε (3) 对(4)利用分配律得 A = (0 + 01)A + 0 (5) X =αX + β, 则解为 X= 对(5)使用求解规则得 α*β A = (0 + 01)* 0 (6) 将(6)代入(1)式中的A,得 Z = 0 (0 + 01)* 0 即正规文法G[Z]所生成语言的正规式是 R = 0 (0 | 01)* 0
运算符 如+、-、*、/、<等。
分界符 如 ,、;、(、)、:等 。
3.2 单词符号及输出单词的形式 词法分析程序所输出的单词符号通 常表示成如下的二元式:
(单词种别,单词自身的值) 单词种别:单词的种类
3.2 单词符号及输出单词的形式 关键字: 可全体视为一种,也可一字 一种。 标识符: 一般统归为一种。 常数: 可统归为一种,也可按类型 (整型、实型、布尔型等)划分。
3.3.2 正规文法与正规式
例3 设有正规文法G: Z U0 | V1 U Z1 | 1 V Z0 | 0 相应的正规式方程组为 Z = U0 + V1 U = Z1 + 1 V = Z0 + 0 (1) (2) (3)
3.3.2 正规文法与正规式
Z = U0 + V1 U = Z1 + 1 V = Z0 + 0 (1) (2) (3)
运算符和界符: 可一符一种类,也可统 归为一种。
3.2 单词符号及输出单词的形式 单词自身的值
一个种别只含一个单词符号 一个种别含有多个单词符号 (1) 对于标识符其自身值是标识符自 身的字符串; (2) 常数自身值是常数本身的二进制 数值。
3.2 单词符号及输出单词的形式 (3) 用指向某类表格一个特定项目指 针值来区分同类中不同的单词。 例如, 对于标识符用它在符号表的入口 指针作为它自身值; 常数用它在常数表 的入口指针作为它自身的值。
第三章 词法分析与有穷自动机 ◇ 词法分析程序功能 ◇ 单词符号及输出单词的形式 ◇ 语言单词符号的两种定义方式 ◇ 正规式与有穷自动机
◇ 正规文法与有穷自动机
◇ 词法分析程序的编写方法
3.1 词法分析程序的功能
回顾:词法分析的任务字符源自 表示的 源程序字符词 法 分 析 器
单词符号
取下一个 单词符号
3.3.1 正规式和正规集
例2 设Σ={a,b,c},则 aa*bb*cc* 是∑上的一 个正规式 , 它所表示的正规集: + + +
abc
L={ abc, aabc, abbc, abcc, aaabc, …}
={ ambnck | m, n, k≥1}
3.3.1 正规式和正规集
例3 设程序语言字母表是键盘字符集合, 则程序语言部分单词符号可用如下正规 式定义: 关键字 标识符 整常数 if | else | while | do l (l | d)* l代表a~z中任一字母 dd* d代表0~9中任一数字
3.3.2 正规文法与正规式 1. 正规文法到正规式的转换
(1) 将正规文法中的每个非终结符表示成关于 它的一个正规式方程,获得一个方程组。 (2) 依照求解规则: 若 X = αX|β(或 X =αX + β ) 则解为 X= α*β 若 X = Xα|β(或 X =Xα + β ) 则解为 X = βα* 以及正规式的分配律、交换律和结合律求关于 文法开始符号的正规式方程组的解。
3.3.1 正规式和正规集
5. ba*是正规式,相应的正规集为 L(ba* )=L(b)L(a*)={b,ba,baa,baaa,…} 6. (a | b)*(aa | bb) (a | b)* 是正规式,相应 正规集为 L((a | b)*(aa | bb) (a | b)*) =L((a | b)*)L(aa | bb)L((a | b)*) ={a,b}*{aa,bb}{a,b}* 即Σ上所有含两个相继a或两个相继 b组成的串。
3.3.1 正规式和正规集 4. 如果 e1和 e2 是∑上的正规式,它们所表 示的正规集分别为 L(e1)和L(e2) ,则: (1) e1 | e2是∑上的一个正规式,它所表示 的正规集为L(e1 | e2)=L(e1 )∪L(e2)
(2) e1.e2 也是∑上的一个正规式,它所表示 的正规集为L(e1.e2)=L(e1)L(e2) (3) (e1)*也是∑上的一个正规式,它所表示的 正规集为L((e1)*)=(L(e1))*
3.3.2 正规文法与正规式 例1 将 R=(a | b)(aa)*(a | b) 转换成相应的 正规文法 令A是文法开始符号,根据规则(2)变换为 A (a | b)(aa)*(a | b) 根据规则(3)变换为 A (a | b)B B (aa)*(a | b)
3.3.2 正规文法与正规式
关系运算符 <<=>>=<>
3.3.1 正规式和正规集
注意: 正规式与正规文法之间的区 别和联系: 标识符 I = l (l | d)* l代表a~z中任一字母 d代表0~9中任一数字 I→l | Il | Id
3.3.1 正规式和正规集 如果正规式 R1 和 R2 描述的正规集相 同, 则我们称正规式R1与R2等价。 记为 R1=R2。
3.3.2 正规文法与正规式
进一步变换为 I lT T lT | dT | ε
去掉 ε 规则 I l | lT T l | d | lT | dT
即前面描述标识符的右线性文法。
3.3.1 正规式和正规集
4. (a | b)* 是正规式,相应正规集为 L((a | b)*)= (L(a | b))* ={a ,b}*={ε, a, b, aa, ab, ba, bb, …} 需要指出的是,{a,b}*的任一子集不 一定是正规集。如:{a ,b}* 的子集 {an bn | n≥1}
2. 正规式到正规文法的转换 (1) 令 VT=Σ 。 (2) 对任何正规式R选择一个非终结符Z生 成规则ZR并令S=Z。
(3) 若a和b都是正规式,对形如 Aab 的 规则转换成 AaB 和 Bb 两规则, 其中B是新增的非终结符。
3.3.2 正规文法与正规式
(4) 对已转换的文法中, 形如A a*b 的规 则,进一步转换 成 A aA | b 。 (5) 不断利用规则(3)和(4)进行变换,直到 每条规则最多含有一个终结符为止。
X =Xα + β , 则解为 X = βα*
(2)和(3)代入(1)得 Z = Z10 + 10 + Z01 + 01 (4) 对(4)使用求解规则得 Z = (10 + 01) (10 + 01 )* 即正规文法G[Z]所生成语言的正规式是 R = (10 | 01)(10 | 01)*
3.3.2 正规文法与正规式