1、lect3lexical23北京大学信息科学技术学院2015年春季学期 编译技术第3章 词法分析(2)Lexical Analysis【对应教材 3.3- 3.5】上节内容回顾词法分析器的作用Token(词法单元)源程序词法单元的描述方法字母表、符号串和语言正则集合、正则表达式和正则定义Review Questions写一个正则表达式,表示所有能被5整除的十进制数。写一个正则表达式,表示所有能被5整除的不包含前导0的十进制数。写一个正则表达式,表示所有能被5整除的二进制数。词法分析器的作用词法单元的规约串和语言;正则表达式、正则定义词法单元的识别词法分析器生成工具LEX有限自动机 (Finit
2、e Automata)正则表达式到有限自动机词法分析器生成工具的设计一般有两种方式:借助状态转换图(有限自动机的图形表示)手工构造词法分析器。通过LEX自动生成词法分析器。o正则表达式 NFA DFA minDFA词法分析器状态转换图(transition diagram)状态(state):表示在识别词素时可能出现的情况o状态看作是已处理部分的总结o某些状态为接受状态或最终状态,表明已找到词素o加上*的接受状态表示最后读入的符号不在词素中o开始状态(初始状态):用“开始”边表示边(edge):从一个状态指向另一个状态;边的标 号是一个或多个符号o当前符号为s,下一个输入符号为a,就沿着从s离
3、开, 标号为a的边到达下一个状态eturn(relop, LE) return(relop, NE) return(relop, LT)return(relop, GE) return(relop, GT)letter或digit开始 letter other *11return(getToken(),installId( )number digit+ (.digit+)? (E (+ | -)? digit+)? digitEdigitdigitdigit开始12 digit 13 .14 digit 15 E+/-16digit17 18otherotherother*19delim bl
4、ank | tab | newline ws delim+delim手动编写词法分析程序:以relop为例TOKEN getRelop ( ) TOKEN retToken = new ( RELOP ) ;while ( 1 ) /* 反复读入字符,直到return或 遇到错误 */ switch (state) case 0 : c = nextChar ( ) ;if ( c = ) state = 6 ;else fail ( ) ; /* 非关系算符 */ break ;case 1 : 2=return(relop, LE)case 8 : retract ( );retToken
5、.attribute = GT; return (retToken); 开始1 5return(relop, EQ)2015年春季学期 编译技术课程=6other7return(relop, GE) 8 * return(relop1, G1T)o首先通过正则表达式来描述词法单元的模式o基本目标:判断一个串s是否属于一个正则表达式R表示的语言sL(R)o在现实中,还要能够连续识别多个不同类别的词法单元if (a = b) (1)分别为每一类词法单元写出正则表达式Ri(2)构造一个正则表达式R来匹配所有的词法单元R = R1 | R2 | | Rk(3)设输入为x1x2xn, 对1i n,检查是
6、否x1xiL(R)(4)如果匹配成功,则存在j,使得x1xiL(Rj)(5)把x1xi从输入中移走,继续执行(3)o如何确定匹配的长度?n有可能多个前缀都可以产生匹配n解决办法:匹配最长可能的串o选择哪个正则表达式来匹配?n有可能多个正则表达式都可以匹配n解决办法:排在前面的正则表达式优先匹配o如果所有正则表达式都不能匹配怎么办?n怎么报错?n解决办法:可以构造一个ERROR正则表达式, 放到所有表达式在后面,用来报告错误信息14Quiz:选择题o使用如下的词法描述,在识别字符串“dictatorial” 的过程中会如何进行分割?dict (1)dictator (2)a-z* (3)dict
7、atorial (4)a)4b)3c) 1, 3d) 2, 3内容提要o词法分析器的作用o词法单元的规约n串和语言;正则表达式、正则定义o词法单元的识别o词法分析器生成工具LEXo有限自动机 (Finite Automata)o正则表达式到有限自动机o词法分析器生成工具的设计Lex 简介oLex 是一种词法分析程序的自动构造工具。n通常和Yacc一起使用,生成编译器的前端o实现原理:n根据给定的正则表达式自动生成相应的词法分析程序。n利用正则表达式与DFA的等价性o转换方式:正则表达式 NFA DFA min DFA用Lex建立词法分析程序的过程LEX源程序lex.1lex.yy.cLex.y
8、y.c yylex输入串 单词序列o一个LEX源程序主要由三个部分组成:n声明n转换规则及动作n辅助子程序o各部分之间用%隔开o声明包括变量,C语言常量和正则定义式。o词法分析器返回给语法分析器一个单词,把单词的属性值存放于全局变量yylval中。19o转换规则及动作的形式为:p1 动作1p2 动作2 p n 动作no每个 pi 是正则定义式的名字,每个动作i 是正则定义式 pi 识别某类单词时,词法分析器应执行动作的程序段。n动作用C语言书写。o辅助子程序是执行动作所必需的。n这些子程序用C语言书写,可以分别进行编译。词法分析器的工作方式oLex生成的词法分析器作为一个函数被调用o在每次调用
9、过程中,不断读入余下的输入符号o发现最长的、与某个模式匹配的输入前缀时,调用相应的动作;n该动作进行相关处理,并把控制返回;n如果不返回,则词法分析器继续寻找其它词素22ws /* no action and no return */ If return(IF) ;then return (THEN) ; else return (ELSE) ;id yylval = (int ) installID () ; rettirn(ID) ;number yylval = (int) installNum() ; return (NUMBER) ; yylval = LT ; return (RE
10、LOP) ; = yylval = LE ; return (RELOP) ; = yylval = EQ ; return (RELOP) j yylval = NE ; return (RELOP) ; yylval = GT ; return (RELOP) ; = yylval = GE ; return (RELOP) ;%int installID () /*向符号表添加指向yytext,长度为yyleng的词法单元*/ int installNum () /*把数字常量添加到另外一个单独的表格中*/o冲突:多个输入前缀与某个模式相匹配,或者一个前缀和多个模式匹配oLex解决冲突的
11、方法n多个前缀可能匹配时,选择最长的前缀E.g, 保证词法分析器把 = 当作一个词法单元n某个前缀和多个模式匹配时,选择列在前面的模式E.g, 如果保留字的规则在标识符的规则之前,词法分析器将识别出保留字o词法分析器的作用o词法单元的规约n串和语言;正则表达式、正则定义o词法单元的识别o词法分析器生成工具LEXo有限自动机 (Finite Automata)o正则表达式到有限自动机o词法分析器生成工具的设计o有限自动机是词法分析器生成工具(Lex) 的关键技术。n正则表达式有限自动机词法分析程序o有限自动机与状态转换图类似,但是有限自动机是识别器,只能对每个可能的输入串简单地回答“yes”or
12、“no”。o有限自动机可以分为两类:n确定的有限自动机(DFA)n不确定的有限自动机(NFA)确定的有限自动机 (Deterministic FA)定义 一个确定的有限自动机 M (记作DFA M)是一个五元组 (, Q, qn, F, ), 其中(1)是一个有限字母表, 它的每个元素称为一个输入符号。(2)Q 是一个有限状态集合。(3)q 0Q, q0 称为开始状态。(4)F Q, F 称为终止状态(或接受状态)集合。(5)是一个从 Q到 Q 的单值映射 (称为转换函数) (q, a)q (q, qQ, a)表示当前状态为q, 输入符号为a 时, 自动机 M 将转换到下一个状态q,q 称为q
13、的一个后继。27DFA的表示形式可以使用转移矩阵来表示使用状态转换图来表示输入状态ab01213221333329DFA M 接受的语言如果对所有*,以下述方式递归地扩展的定义(q, )q(q, wa)(q, w), a)对任何 a , q,则有L(M) w | w*,若存在qF,使 ( q0, w)q对于前面例子中的 DFA M 和 w = baa,有(0, baa) =(2, aa) = (1, a) = 330babDFA示例-1 字母0 字母 1Pascal 标识符Pascal整数和实数32识别 =0,1上能被能5整除的二进制数 o画一个DFA,表示所有能被32整除的二进制数。o画一个
14、DFA,表示所有除32余1的二进制数。非确定的带_转移的有限自动机NFA定义: 非确定的带_转移的有限自动机NFA M是一个五元组(, , q, F, )其中, Q, q0, F 的意义和 DFA 的定义一样,而是一个从Q()到Q 的子集的映射,即:Q 2Q和DFA类似, NFA M 也可以用状态转换图表示,也可以定义 NFA M 接受的语言。abab4oNFA接受的字符串和语言n如果在NFA中存在一个从开始状态到接受状态的路径,该路径上的符号序列构成的字符串是w, 那么称该NFA可以接受字符串w一个字符串在NFA中可能对应不同的接受路径NFA接受的字符串可能存在其他不能接受的路径如果在某个状态对于输入字符a不存在可用的转移动作,那么不能通过该路径接受当前的字符串n一个NFA M接受的所有字符串的集合构成该NFA所接受的语言L(M)oDFA是NFA的一种特例nDFA的表达能力与NFA是等价的o给出接受 (a|b)*a(a|b)(a|b) 的DFA。o指出下面的正则表达式描述的语言,并画出接受该语言的最简DFA的状态转换图。 (1|01)* 0*作业o下周五交 Ex. 3.6.2 (本 Ex. 3.5.2) (1,2,3,6,9小题)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1