第3章 词法分析(1)

合集下载

词法分析及词法分析程序

词法分析及词法分析程序
语义加工过程:
– w,p,n初值为0,e初值为1;
– 处理整数部分时,对于每个di ,令w=w10+di ; – 处理小数部分时,对于每个di ,令w=w10+di ;及n++;
– 处理指数时,E后若有‘-’号,令e=-1;计算指数值 p=p10+d;
– 在出口处,令ICON=w或FCON=w10^(e(p-n)).
(2)设当前处在Ai状态,所扫描的字符为ai+1,在结点Ai所 射出的诸矢线中,寻找标记为ai+1的矢线(若不存在,则 表明w有语法错误),读入ai+1,并进入状态Ai+1;
(3)重复(2),直到w中所有字符被读完且恰好进入终态F 时,宣告整个识别结束,w可被接受.
28
例:G[Z]:
状态转换图:
Z→0U∣1V
{return ( ICON= w ); {n++; w=w*10+d;}
{return (FCON =w*pow(10,e*p-n) ) ;} {n++;w=w*10+d;} error {p=p*10+d;}
e=-1; error {p=p*10+d;} error {p=p*10+d;} {return (FCON=w*pow(10,e*p-n) );
(1)对于G中形如Aa 的产生式,引矢线RA,且标记
为a;
(2)对于G中形如ABa 的产生式,引矢线 BA,且标
记为a。
34
由左线性文法构造状态转换图
已给文法G=({S,U},{0,1},{SS1 |U1, UU0 | 0},S)
R0
0
1
U1 S

《编译原理》第3章

《编译原理》第3章

NFA到相应的DFA的构造的基本思路是: DFA的每 一个状态对应NFA的一组状态. DFA使用它的状 态去记录在NFA读入一个输入符号后可能达到的 所有状态.
NFA M所能接受的符号串的全体记为L(M)
结论:
上一个符号串集V是正规的,当且仅当存 在一个上的不确定的有穷自动机M,使得 V=L(M)。
DFA是NFA的特例.对每个NFA N一定存在一个DFA M,使得 L(M)=L(N)。对每个NFA N存在着与之 等价的DFA M。 有一种算法,将NFA转换成接受同样语言的DFA.这 种算法称为子集法. 与某一NFA等价的DFA不唯一.
0
1
S P
Z
{P} {}
{P}
{S,Z} {Z}
{P}
• δ为S * 到S的子集(2 S)的一种映射
• 从NFA的矩阵表示中可以看出,表项通常是一状态的集合, 而在DFA的矩阵表示中,表项是一个状态
∑*上的符号串t被NFA M接受:
• 对于Σ*中的任何一个串t,若存在一条从某一初态 结点到某一终态结点的道路,且这条道路上所有 弧的标记字依序连接成的串(不理采那些标记为ε 的弧)等于t,则称t可为NFA M所识别(读出或接 受)。 • 若M的某些结点既是初态结点又是终态结点;或 者存在一条从某个初态结点到某个终态结点的道 路,其上所有弧的标记均为ε,那么空字ε可为M所 接受。
其中: δ(S,0)={P}
δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z} • 状态图表示
1 1 S 0 0,1 Z
P
1
• 矩阵表示
状态 输入
δ(S,0)={P} δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z}

北航编译原理课件 03.词法分析

北航编译原理课件 03.词法分析

3. 词法分析程序算法
北京航空航天大学计算机学院
17
1.单词及内部表示 单词及内部表示: 单词及内部表示
单词名称
BEGIN END FOR DO IF THEN ELSE 标识符 常数(整 常数 整) : + * , ( ) :=
保留字和分界符采用一符一类
记忆符
BEGINSY ENDSY FORSY DOSY IFSY THENSY ELSESY IDSY INTSY COLONSY PLUSSY STARSY COMSY LPARSY RPARSY ASSIGNSY
字母、数字
标识符 无符号整数
单字符分界符
S S S
字母
标 数字
非字母数字
出口
数字

非数字
出口
+ * , 单界 ( ) :
其他字符 非=
出口
双字符分界符
北京航空航天大学计算机学院
S
冒号
=
双界
其他字符
出口 15
查保留字表 读字符
字母、数字
S
字母
标 数字
非字母数字
标识符
非数字
数字

无符号整数 单字符分界符
如:b{ab} = {ba}b {a|b} = {{a} {b}} = (a*b*)*
北京航空航天大学计算机学院 23
例:设 ∑ = { a,b },下面是定义在∑上的正则表达式和正则集合 正则表达式 ba* a(a|b)* (a|b)*(aa|bb)(a|b)* 正则集合
北京航空航天大学计算机学院
北京航空航天大学计算机学院 20
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :

编译原理词法分析及词法分析程序

编译原理词法分析及词法分析程序
∴M能识别出L(G)中的全部句子。
状态图=>右线性文法
文法G[0] 0->a1
d 0
S->aA A->dA A->b
a c
1 2
b
d
3
1->d1 1->b
0->c
0->c2 2->d
S->c
S->cB,2有出弧 B->d
左线性文法=>状态转换图
设G=(VN,VT,P,S)是一左线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为终止状态 3) 起始状态,用R(VN)标记
识别符号串与归约
S





从初态R到下一状态A对应Ba,即终结 符a归约成非终结符B; U 从状态B转换到状态A对应ABa,即将 Ba归约为A; 状态A转换到状态S(终态)对应S Aa,即 U 将Aa归约为开始符S. 归约成功,恰好进入终态,即状态转换图识 U 别了(或接受)该符号串. 识别00011的例子的归约过程
f是转换函数,是在K×Σ →K上的映像,即:如果f(ki,a)=kj, (ki,kj∈K)意味着,当前状态为ki,输入字符为a时,将转换 为下一个状态kj,我们把kj称作ki的一个后继状态;
1.确定的有限自动机
通常把这五要素组成的五元式M=(K,∑,f, S0,Z)称为确定的 有限自动机(DFA),它是相应的状态转化图的一种形式描 述,或者说,是状态转换矩阵的另一种表示。 在状态转换的每一步,据DFA当前所处状态及扫视的输入 字符,能唯一确定下一状态。

例:文法G=({S,U},{0,1},{SS1 |U1,

第1讲-确定的有限自动机

第1讲-确定的有限自动机

对于Σ*中的任何字符串α,若DFA M中存在一条从 初态结点到某一终态结点的路,且这条路上所有弧的标
记连接成的字符串等于α,则称α可以被DFA M所接受 (识别)。
若M的初态结点同时又是终态结点,则空串ε可被 M所接受(识别)。
若α∈Σ*,f(S, α)=P,其中S为DFA M的初始状 态,P∈Z,Z为终态集,则称字符串α可以被DFA M 所接受(识别) 。
DFA M= ({S,U,V,Q}, {a,b}, f,S,{Q})
事实上,状态转换图是有限自动机的一种表示形式,假定DFA M 含有m个状态,n个输入字符,那么这个状态转换图含有m个状态 (结点),每个结点最多有n个弧射出,整个图含有唯一一个初态 结点(冠以“⇒” )和若干个终态结点(用双圈表示),若有f(ki,a)=kj (ki∈K,kj∈K,a∈Σ),则从状态结点ki到状态结点kj画标记为a的弧。
(4) S0∈S,是唯一的初始状态;
(5) F ⊆ S,是终止状态集合。
编 译 技术
chapter3 词法分析——有限自动机
例:为下图所示的状态图构造确定的有限自动机。
f(S,a)=U f(S,b)=V f(V,a)=U f(V,b)=Q f(U,a)=Q f(U,b)=V f(Q,a)=Q f(Q,b)=Q
编 译 技术
chapter3 词法分析——有限自动机
一个DFA还可以用一个矩阵(状态矩阵)表示: 矩阵的行表示状态,列表示输入字符,矩阵元素表示 相应状态行和输入字符列下的新状态。
例:上例的DFA的矩阵表示如下:
字符
状态
a
S
U
U
Q
V
U
Q
Q
b
V0 V0 Q0 Q1

计算语言学讲义(03)词法分析(一)

计算语言学讲义(03)词法分析(一)
计算语言学讲义(04)词法分析I
6
序列标注问题
• 输入:一个符号序列 • 输出:给每一个输入符号赋予一个标记 • 常见具体问题:
– 音字转换:拼音序列 – 词性标注:词语序列 – 词义排歧:词语序列 汉字序列 词性序列 词义标记序列
计算语言学讲义(04)词法分析I
7
序列结构化
• 输入:一个符号序列 • 输出:一个结构,刻划符号之间的关系 • 常见具体问题:
• 输入:一段文本 • 输出:单词串 • 算法:(略)
计算语言学讲义(04)词法分析I
21
Stemming
屈折型语言的词语变化形式: • 屈折变化:即由于单词在句子中所起的语法作用的不同而 发生的词的形态变化,而单词的词性基本不变的现象,如 ( take, took, takes)。识别这种变化是词法分析的最 基本的任务。 • 派生变化:即一个单词从另外一个不同类单词或词干衍生 过来,如morphological morphology,英语中派生变化 主要通过加前缀或后缀的形式构成;在其他语言中,如德 语和俄语中,同时还伴有音的变化。 • 复合变化:两个或更多个单词以一定的方式组合成一个新 的单词。这种变化形式比较灵活,如well-formed, 6year-old等等。 Stemming的目的:将上述变化还原
– 成分句法分析:词语序列 短语结构树 – 依存句法分析:词语序列 依存树 – 语义分析:词语序列 语义网络
计算语言学讲义(04)词法分析I
8
问题与方法
• 计算语言学常用方法:
– 规则方法
• 形式语法理论 • 形式逻辑 • ……
– 统计方法
• • • • n元语法模型 隐马尔科夫模型 最大熵模型 ……
计算语言学讲义(04)词法分析I

程序设计语言编译原理(第三版)第3章

程序设计语言编译原理(第三版)第3章

程序设计语言编译原理(第三版)第3章第3章词法分析任务:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串。

§3.1§3.2§3.3§3.4对于词法分析器的要求词法分析器的设计正规表达式与有限自动机词法分析器的自动产生(LE某)—略1§3.1对于词法分析器的要求一.功能和输出形式二.接口设计§3.1对于词法分析器的要求一.功能和输出形式1.功能:输入源程序,输出单词符号2.单词符号的分类(1)关键字:由程序语言定义的具有固定意义的标识符,也称为保留字或基本字。

例如:Pacal语言中begin(2)标识符:用来表示各种名字。

endifwhile等。

如变量名、数组名、过程名等。

(3)常数:整型、实型、布尔型、文字型等例:100(5)界符:,;3.14159()true等ample(4)运算符:+、-、某、/3§3.1对于词法分析器的要求3.输出的单词符号形式二元式:(单词种别,单词符号的属性值)通常用“整数编码”“单词符号的特征或特性”单词符号的编码:标识符:一般统归为一种常数:常按整型、实型、布尔型等分类关键字:全体视为一种/一字一种运算符:一符一种界符:一符一种4§3.1对于词法分析器的要求例:考虑下述C++代码段:while(i>=j)i--;经词法分析器处理后,它将被转换为如下的单词符号序列:<while,-><(,-><id,指向i的符号表项的指针><>=,-><id,指向j的符号表项的指针><),-><id,指向i的符号表项的指针><--,-><;,->§3.1对于词法分析器的要求二.接口设计1.词法分析器作为独立的一遍词法分析字符流(源程序)单词序列(输出在一个中间文件上)2.词法分析器作为一个独立的子程序,但并不一定作为独立的一遍语法分析器单词(至少一个)调用(取下一个单词)词法分析器优点:使整个编译程序的结构更简洁、清晰和条理化.6§3.2词法分析器的设计一.输入和预处理二.单词符号的识别三.状态转换图及其实现§3.2词法分析器的设计一.输入、预处理1.预处理:剔掉空白符、跳格符、回车符、换行符、注解部分等.原因:编辑性字符除了出现在文字常数中之外,在别处的任何出现都无意义.#注解部分不是程序的必要组成部分,它的作用仅在于改善程序的易读性和易理解性.8§3.2词法分析器的设计2.预处理子程序:每当词法分析器调用时,就处理出一串确定长度(如120个字符)的输入字符,并将其装进词法分析器所确定的扫描缓冲区中。

ch3 词法分析

ch3 词法分析

19
例子
数字 数字 其他 * 1 2 3
识别整常数的状态转换图 字母或数字 字母 其他 *
1
2
3
识别标识符的状态转换图
20
词法分析程序的构造


程序设计语言各类单词的词法都能用相应的正规文法 来描述,由正规文法可以构造出相应的状态图,进而 识别一个单词。 状态转换图非常容易用程序来实现, 最简单的办法是让每一个状态结对应一小段程序 一个词法分析程序可以通过一下步骤得到: 1.根据语言的词法规则写出描述单词的正规文法; 2.将正规文法转换成相应的状态图; 3.将状态图转换成算法的流程图,进而实现词法分析 程序。
31
else if (ch =„*‟) begin GetChar(); if (ch =„*‟) return ($POWER, -); Retract(); return ($STAR, -); end else if (ch =„;‟) return ($SEMICOLON, -); else if (ch =„(‟) return ($LPAR, -); else if (ch =„)‟) return ($RPAR, -); else ProcError( ); /* 错误处理*/
正规文法又成为右线性文法。 左线性文法:产生式为 A→Ba或 A→a
15
由正规文法构造状态图
1.对于右线性文法,状态图的构造步骤如下:



步骤1:增加节点Z为终态(假定文法的字母表中 不包括符号Z); 步骤2:将每一个非终结符号设置为一个对应的状 态; 步骤3:对于形如A→a的每一个规则,引一条从状 态A到Z的弧,弧上标记为a;而对于形如A→aB的 每个规则,引一条从状态A到B的弧,标记为a(其 中B∈VN ,a∈VT )。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(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
5
3.1.1 词法分析与句法分析分开的原因
简化编译器的设计,让句法分析器简单化。 提高编译效率:使用适合词法分析的专门技术。 增强编译器的可移植性:输入设备相关的特殊性可 以被限制在词法分析器中。
6
3.1.2 词法单元、模式、词素
词法单元(token):一个词法单元名和一个可选的 属性值组成。用<token name, token value>表示。 它是源语言文法的终结符。
26
正则表达式的代数性质
(rs)* ≠ r*s* 定义
为了让正则表达式的表示简洁,可以对正则式命名。 d1 r1 d2 r2 ... dn rn 各个di的名字都不同, di 每个ri都是∪{d1, d2, …, di-1 }上的正则式
备注
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字符串
#define ID 600
11
3.1.4 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 此时,使用“恐慌模式”的错误恢复 错误修补
12
3.2 词素的描述
正则表达式是模式的重要表示方法。
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;
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
…… } 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)。
28
正则定义的例子1
C语言的标识符集合 letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_ ( letter_ | digit)*
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 ∪…
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语言程序} +,-,…,<,>,…} { 所有语法正确的英语句子}
9
词法单元的例子
下列结构作为词法单元token:关键字、操作符、 标识符、常量、字符串、标点符号 每个关键字对应一个词法单元(token) 表示多个运算符的词法单元tokens 一个表示所有标识符的词法单元 一个或多个表示常量的词法单元,比如数字和 字符串 每一个标点符号有一个词法单元,比如左右括 号、逗号和分号。
模式(pattern):源语言中特定记号的构成规则, 可以用正则表达式示。(例如:变量名的命名规则) 词素(lexeme):是源程序中的一个字符序列,它 和某个词法单元的模式匹配,并被词法分析器识别 为该词法单元的一个实例。
Lexeme ['lɛksim]
if ( count > 5 ) sum += count ;
第三章 词法分析
1
本章内容
词法分析器:将源程序的字符流翻译成记号流,以 及用户接口等任务 构造词法分析器 手工 自动生成 重点 正则表达式 有限状态自动机 自动生成工具:Lex/Flex
2
3.1 词法分析器的作用
记号 源程序 词法分析器 语法分析器
取下一个记号 符号表
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 | 是可交换的 | 是可结合的 “连接”是可结合的 “连接”是可分配的 是“连接”的单位元 * 和 之间的关系 * 的幂等性
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
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,…}, {}, 句子:属于语言的字符串。 本书中句子、字符串基本表达同一个意思。
22
定义字母表上的正则表达式的规则
1. 是一个正则表达式,L()= { }
2. 如果a是上的一个符号,那么a是一个正则表达式,并且L(a)= {a} 3. 假设 r和s都是正则表达式,分别表示语言 L(r) and L(s),那么
相关文档
最新文档