2013 lecture03-Scanner.ppt_第1页
2013 lecture03-Scanner.ppt_第2页
2013 lecture03-Scanner.ppt_第3页
2013 lecture03-Scanner.ppt_第4页
2013 lecture03-Scanner.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第三章 词 法 分 析,10/8/2020,1,Lecture 3,3.1 引言,10/8/2020,2,3.1.1 词法分析与词法分析程序 1. 概况 功能:读入源程序, 识别开单词(符号)并转换为内部表示, 做力所能及的工作( 删除无效字符、预处理 )。 输入:源程序字符序列 输出:属性字序列 基础文法:正则文法,Lecture 3,C语言符号:标识符、常量、字符串、标号、 界限符(关键字,专用符号) 符号都可用正则文法规则来定义: U:=VT U:=T,3.1.2 符号的识别与重写规则的关系,3.1 引言,:=字母|数字|字母 :=数字|数字 :=|=| := = := !,10/8/2

2、020,Lecture 3,3,关于关键字else的定义 :=e :=s :=l :=e 因此,关键字的定义都可采用正则文法规则形式,完全融合 相对独立 完全独立,3.1.2 符号的识别与重写规则的关系,3.1 引言,实现方式,10/8/2020,Lecture 3,4,3.1正则表达式与有穷状态自动机,3.2.1 状态转换图 1. 状态转换图的引进,:=L | L | D,引进目的:识别正则文法的句子,状态转换图:为识别正则文法的句子专门设计的有向图,10/8/2020,Lecture 3,5,3.1正则表达式与有穷状态自动机,3.2.1 状态转换图,例 正则文法GZ: Z=ZaAbBa A

3、=Bba B=Aab,10/8/2020,Lecture 3,6,2. 状态转换图的构造 状态转换图构造步骤如下: 步骤1 以符号S为开始状态作结点(假定文法的字汇表中不包含符号S); 步骤2 以每一个非终结符号为状态作结点; 步骤3 对于形如Q=T的每个规则,引一条从开始状态S到状态Q的弧,其标记为T;而对形如Q=RT的规则引一条从状态R到Q的弧,其标记为T。其中R为非终结符号,T为终结符号; 步骤4 识别符号为终止状态。,3.2.1 状态转换图,10/8/2020,Lecture 3,7,3. 应用状态转换图来识别句子 一般地识别步骤如下: 步骤1 从开始状态开始,以它作为当前状态,并从输

4、入字符串x的最左字符开始,重复步骤2直到达到x的右端为止。 步骤2 扫描x的下一字符(当前字符),在当前状态射出的各个弧中找出标记有该字符的弧,并沿此弧前进,以所达到的状态作为下一当前状态。 假定有输入字符串aababb,要识别它是否是其句子。,3.2.1 状态转换图,10/8/2020,Lecture 3,8,Z是终止状态,所以,输入字符串aababb是上述文法的句子。,输入字符串x=aababb, 是否是该文法的句子?,当识别一个字符串x时,如果能从状态转换图的开始状态出发,行进达到x的右端, x为句子的充分必要条件是最后的当前状态为终止状态。,或: (S)a(A)a(B)b(A)a(B)

5、b(A)bZ,3.2.1 状态转换图,10/8/2020,Lecture 3,9,为什么可以通过运行状态转换图来识别正则文法的句子?,10/8/2020,Lecture 3,10,3.2.1 状态转换图,利用状态转换图识别正则文法句子,10/8/2020,Lecture 3,11,GZ: Z:=Cb C:=Bb | b B:=Ab A:= a | Ba,3.2.1 状态转换图,4. 应用状态转换图为正则语言构造正则文法,例 正则语言 (ab)nb2n0,进而,GZ: S:=aA|bC A:=bB B:=bC|bA C:=bZ,10/8/2020,Lecture 3,12,ai bji, j1

6、GZ: Z:=Ab|Zb S A Z A:=a|Aa ai bj cki, j, k1 GZ: Z:=Bc|Zc S A B Z B:=Ab|Bb A:=a|Aa,10/8/2020,Lecture 3,13,1. 定义 定义 一个确定的有穷状态自动机DFA是五元组 DFA D=(K,M,S,F), 其中: K:状态集, :字母表, M:KK 映象, SK 开始状态, F K 终止状态集,例 DFA D=(S, Z, A, B, a, b, M, S, Z), 其中, M: M (S, a)=A M (S, b)=B M (A, a)=Z M (A, b)=B M (B, a)=A M (B,

7、 b)=Z M (Z, a)=Z,3.2.2 确定有穷状态自动机DFA,10/8/2020,Lecture 3,14,扩充了的映象M: M(R,)=R,其中R为任意状态; M(R, Tt)=M(M(R, T),t),其中t*,T。,所以,字符串bababb可为该DFA所接受。,接受: 对于某个DFA D=(K, M, S, F),如果 M(S, t)=P, PF, 则称字符串t可被该DFA D所接受。,例 串bababb 是否可为上述DFA所接受,M(S,bababb)=M(M(S,b),ababb)=M(M(B,a),babb) =M(M(A,b),abb)=M(M(B,a),bb)=M(M

8、(A,b),b) =M(B,b)=Z,运行DFA: 识别输入字符串是否可被DFA所接受的过程,3.2.2 确定有穷状态自动机DFA,2. 运行DFA,10/8/2020,Lecture 3,15,3.2.2 确定有穷状态自动机DFA,3. FA在计算机内的存储表示,2)表结构表示,1)矩阵表示,10/8/2020,Lecture 3,16,3.2.3 非确定有穷状态自动机NFA,映像不唯一:状态W,字符T下映像到U或V。,1. NFA的引进 例 U=WT 和 V=WT 或者:W:=TU和W:=TV,10/8/2020,Lecture 3,17,NFA是一个五元组(K, , M, S, F),其

9、中K:状态集, :字母表 M: KK的子集所组成集合; S K 开始状态集 F K 终止状态集,2.定义,3.2.3 非确定有穷状态自动机NFA,文法GZ: Z=Z0T101 T=Z00 NFA N=(S, T, Z, 0, 1, M, S, Z) 其中M=?,NFA与DFA的区别 : 开始状态 与映像,10/8/2020,Lecture 3,18,文法GZ: Z=Z0T101 T=Z00 NFA N=(S, T, Z, 0, 1, M, S, Z) M:M(S, 0)=T, Z M(S, 1)=Z M(T, 0)= M(T, 1)=Z M(Z, 0)=T, Z M(Z, 1)= ,3.2.3

10、 非确定有穷状态自动机NFA,10/8/2020,Lecture 3,19,3. 运行NFA 扩充了的映象M: M(R,)=R, 其中R是任意的状态; M(R,Tt)=M(Q1,t)M(Q2,t)M (Qn, t), 其中, M(R,T)=Q1,Q2,Qn 接受:若对于某NFA存在状态P, PF, 有PM(S, t), SS,则说字符串t可被该NFA所接受。 当一个输入字符串为NFA所接受时,它就是相应文法的句子。,3.2.3 非确定有穷状态自动机NFA,10/8/2020,Lecture 3,20,文法GZ: Z=Z0T101 T=Z00 输入字符串010010的运行过程,所以输入字符串01

11、0010是该文法的句子,3.2.3 非确定有穷状态自动机NFA,10/8/2020,Lecture 3,21,3. 从NFA生成DFA 思路: 假定对于一个NFA,存在状态R,对于它有: M(R,T)=Q1, Q2, Qn 即,转换到的状态可能是Q1 或Q2,也可能是Qn。为使NFA成为等价的DFA,把状态集合Q1, Q2, , Qn看成单个状态,用Q1, Q2, Qn表示这单个状态,如, M(S, 0) = T, Z M(S,0) = T,Z 注意: DFA的状态名中所包含的原有状态名按字典顺序排列,3.2.3 非确定有穷状态自动机NFA,10/8/2020,Lecture 3,22,定义:

12、对于任何两个有限自动机M和M,如果L(M)=L(M),则称M与M等价。 自动机理论中一个重要的结论:判定两个自动机等价性的算法是存在的。 对于每个NFA M存在一个DFA M,使得 L(M)=L(M)。亦即DFA与NFA描述能力相同。,10/8/2020,23,Lecture 3,1. 假定NFA M=,我们对M的状态转换图进行以下改造: 1) 引进新的初态结点X和终态结点Y,X,YS, 从X到S0中任意状态结点连一条箭弧, 从F中任意状态结点连一条箭弧到Y。 2) 对M的状态转换图进一步施行替换,其中k是新引入的状态。,证明:,10/8/2020,24,Lecture 3,代之为,代之为,代

13、之为,按下面的三条规则对V进行分裂:,10/8/2020,25,Lecture 3,逐步把这个图转变为每条弧只标记为上的一个字符或,最后得到一个NFA M,显然L(M)=L(M),10/8/2020,26,Lecture 3,识别所有含相继两个a或相继两个b的字,10/8/2020,27,Lecture 3,把上述NFA确定化采用子集法.,设I是的状态集的一个子集,定义I的-闭包-closure(I)为: i) 若sI,则s-closure(I); ii) 若sI,则从s出发经过任意条弧而能到达的任何状态s都属于-closure(I) 即 -closure(I)=Is|从某个sI出发经过任意条

14、弧能到达s,10/8/2020,28,Lecture 3,设a是中的一个字符,定义 Ia= -closure(J) 其中,J为I中的某个状态出发经过一条a弧而到达的状态集合。,10/8/2020,29,Lecture 3,-closure(1)=1,2=I J=5,4,3 Ia= -closure(J)= -closure(5,4,3) =5,4,3,6,2,7,8,设a是中的一个字符,定义 Ia= -closure(J) 其中,J为I中的某个状态出发经过一条a弧而到达的状态集合。,10/8/2020,30,Lecture 3,把确定化的过程: 不失一般性,设字母表只包含两个a和b,我们构造一

15、张表:,10/8/2020,31,Lecture 3,首先,置第1行第1列为-closure(X)求出这一列的Ia,Ib; 然后,检查这两个Ia,Ib,看它们是否已在表中的第一列中出现,把未曾出现的填入后面的空行的第1列上,求出每行第2,3列上的集合. 重复上述过程,知道所有第2,3列子集全部出现在第一列为止。,10/8/2020,32,Lecture 3,I,Ia,Ib,X,5,1,5,3,1,5,4,1,5,3,1,5,2,3,1,6,Y,5,4,1,5,4,1,5,3,1,5,2,4,1,6,Y,5,2,3,1,6,Y,5,2,3,1,6,Y,5,4,6,1,Y,5,4,6,1,Y,5,

16、3,6,1,Y,5,2,4,1,6,Y,5,2,4,1,6,Y,5,3,6,1,Y,5,2,4,1,6,Y,5,3,6,1,Y,5,2,3,1,6,Y,5,4,6,1,Y,10/8/2020,33,Lecture 3,现在把这张表看成一个状态转换矩阵,把其中的每个子集看成一个状态。 这张表唯一刻划了一个确定的有限自动机M,它的初态是-closure(X) ,它的终态是含有原终态Y的子集。 不难看出,这个DFA M与M等价。,10/8/2020,34,Lecture 3,10/8/2020,35,Lecture 3,NFA N= (K, , M, S, F) , 其中S =S1,S2,Sn 确定

17、化为: DFA N=(K, , M, S, F) 其中,K =K的一切子集组成的集合 S = S1,S2,Sn M:M(R1,R2,Ri,T)=Q1,Q2,Qj j 这里 M(R1,R2,Ri, T)= M(Ri, T)=Q1,Q2, ,Qj i=1 F= Sj, Sk, , Sl | Sj, Sk, , SlK,且 Sj, Sk, , SlF ,10/8/2020,Lecture 3,36,对于文法GZ, GZ: Z:=Z0|T1|0|1 T:=Z0|0 NFA N=(S, T, Z, 0, 1, M, S, Z) M: M(S,0)=T, Z M(T,0)= M(Z,0)=T, Z M(S

18、,1)=Z M(T,1)=Z M(Z,1)= DFA N=( K, 0,1, M, S, TZ, Z ) K=S, T, Z, ST, SZ, TZ, STZ M: M(S, 0)=TZ M(S, 1)=Z M(Z, 0)=TZ M(T, 1)=Z M(ST, 0)=TZ M(ST, 1)=Z M(SZ, 0)=TZ M(SZ, 1)=Z M(TZ, 0)=TZ M(TZ, 1)=Z M(STZ,0)=TZ M(STZ,1)=Z,10/8/2020,Lecture 3,37,0 TZ 0 ST 1 1 0 0 S 1 Z 1 SZ 1 1 0 T STZ,有很多状态是无用状态或死状态,应删除。

19、 注意: 状态名未写出与。,相应的状态转换图:,10/8/2020,Lecture 3,38,从NFA生成DFA的简单办法:列表 思路:从开始状态出发,能转换到的状态才是需要的。 DFA N=(S,Z,TZ, 0,1, M,S, Z,TZ), 其中, M: M(S,0)=TZ M(S,1)=Z M(Z,0)=TZ M(TZ,0)=TZ M(TZ,1)=TZ 显然,状态的个数大大减少,避免了繁琐的构造工作。,10/8/2020,Lecture 3,39,从NFA N 构造DFA N的一般步骤如下。 步骤1 把NFA的一切开始状态S1,S2,.,Sm合并成一个新的开始状态S1,S2,.,Sm; 步

20、骤2 从新开始状态出发,列表求出其它一切新状态; 步骤3 以状态名中包含原有终止状态名的一切新状态作为新终止状态; 步骤4 构造DFA N。,NFA确定化采用子集法,10/8/2020,Lecture 3,40,3.2.4 确定有穷状态自动机的化简,对DFA M的化简:寻找一个状态数比M少的DFA M,使得L(M)=L(M) 假设s和t为M的两个状态,称s和t等价:如果从状态s出发能读出某个字而停止于终态,那么同样,从t出发也能读出而停止于终态;反之亦然。 两个状态不等价,则称它们是可区别的。,10/8/2020,Lecture 3,41,具体做法: 对M的状态集进行划分 首先,把S划分为终态

21、和非终态两个子集,形成基本划分。 假定到某个时候,已含m个子集,记为=I(1),I(2),I(m),检查中的每个子集看是否能进一步划分: 对某个I(i),令I(i)=s1,s2, ,sk,若存在一个输入字符a使得Ia(i) 不会包含在现行的某个子集I(j)中,则至少应把I(i)分为两个部分。,10/8/2020,42,3.2.4 确定有穷状态自动机的化简,Lecture 3,例如,假定状态s1和s2经a弧分别到达t1和t2,而t1和t2属于现行中的两个不同子集,说明有一个字, t1读出后到达终态,而t2读出后不能到达终态,或者反之,那么对于字a , s1读出a后到达终态,而s2读出a不能到达终

22、态,或者反之,所以s1和s2不等价。,s1,t1,a,s2,t2,a,i,j,10/8/2020,43,Lecture 3,则将I(i)分成两半,使得一半含有s1 : I(i1)=s|sI(i)且s经a弧到达t, 且t与t1属于现行中的同一子集 另一半含有s2 : I(i2)=I(i)-I(i1),10/8/2020,44,3.2.4 确定有穷状态自动机的化简,Lecture 3,一般地,对某个a和I(i),若Ia(i) 落入现行中 N个不同子集,则应把I(i)划分成N个不相交的组,使得每个组J的Ja都落入的同一子集。这样构成新的划分。 重复上述过程,直到所含子集数不再增长。 对于上述最后划分

23、中的每个子集,我们选取每个子集I中的一个状态代表其他状态,则可得到化简后的DFA M。 若I含有原来的初态,则其代表为新的初态,若I含有原来的终态,则其代表为新的终态。,10/8/2020,45,Lecture 3,I(1)=0, 1, 2 I(2)=3, 4, 5, 6,Ia(1) =1, 3 I(11) =0, 2 I(12) =1,I(2)=3, 4, 5, 6,I(11) =0, 2 Ia(11) =1 Ib(11) =2, 5 I(111) =0 I(112) =2,I(12) =1 I(2)=3, 4, 5, 6,Ia(2) =3, 6 Ia(2) =4, 5,10/8/2020,

24、46,Lecture 3,10/8/2020,47,Lecture 3,1. 引进的必要性 1)一种适合于描述符号的表示法 易理解正被定义的是什么符号集合; 更容易构造高效识别程序; 有利于自动地构造识别程序; 可用于其他各种信息流的处理。,3.2.5 正则表达式,代数系统,10/8/2020,Lecture 3,48,正规式和正规集的递归定义: 对给定的字母表 (1) 和都是上的正规式,它们所表示的正规集为和; (2)任何a ,a是上的正规式,它所表示的正规集为a ;,10/8/2020,49,3.2.5 正则表达式,Lecture 3,(3) 假定e1和e2都是上的正规式,它们所表示的正规

25、集为L(e1)和L(e2),则 i) (e1|e2)为正规式,它所表示的正规集为L(e1)L(e2), ii) (e1.e2)为正规式,它所表示的正规集为L(e1)L(e2), iii) (e1)*为正规式,它所表示的正规集为(L(e1)*, 仅由有限次使用上述三步骤而定义的表达式才是上的正规式,仅由这些正规式表示的字集才是上的正规集。,10/8/2020,50,3.2.5 正则表达式,Lecture 3,所有词法结构一般都可以用正规式描述。 若两个正规式所表示的正规集相同,则称这两个正规式等价。如 b(ab)*=(ba)*b(a*b*)*=(a|b)*,L( (ba)*b) = L(ba)*

26、) L(b) = (L(ba)*L(b) = (L(b)L(a)* L(b) = ba* b = , ba, baba, bababa, b = b, bab, babab, bababab, ,L(b(ab)*) = L(b)L(ab)*) = L(b) (L(ab)* = L(b) (L(a)L(b)* =b ab* = b , ab, abab, ababab, = b, bab, babab, bababab, , L(b(ab)*)= L( (ba)*b) b(ab)*=(ba)*b,10/8/2020,51,Lecture 3,对正规式,下列等价成立: e1|e2 = e2|e1

27、交换律 e1 |(e2|e3) = (e1|e2)|e3 结合律 e1(e2e3) = (e1e2)e3 结合律 e1(e2|e3) = e1e2|e1e3 分配律 (e2|e3)e1 = e2e1|e3 e1分配律 e = e = e e1e2 e2 e1,L(e1|e2) = L(e1 ) L(e2) = L(e2 ) L(e1) = L(e2|e1),10/8/2020,52,Lecture 3,代之为,代之为,代之为,按下面的三条规则对r进行分裂:,10/8/2020,53,2) 正则表达式的形成,Lecture 3,例 状态转换图到正则表达式的转换 a S a A b B a C b

28、 Z b ba S a b B a C b Z b S abab B a C b Z S (abab) a C b Z b b S (abab) a)|b C b Z S (abab) a)|b)b Z 最终(abab)a)|b) b 为所求。,A,10/8/2020,Lecture 3,54,2. 正则表达式的定义及其性质 1)定义 字母表上的正则表达式: (1)与; (2) a; (3) (e1)、e1e2、e1e2 与e1,3.2.5 正则表达式,10/8/2020,Lecture 3,55,正则表达式e的值是字母表上正则集, 记作e。 |= |= |a|=a |(e)|=|e| |e1

29、e2|=|e1|e2|=xy|x|e1|,且y|e2| |e1|e2|=|e1|e2|=x|x|e1|或x|e2| |e|=|e|* 即,|e|的闭包,3.2.5 正则表达式,10/8/2020,Lecture 3,56,例如,|a|= a |DD|=|D| |D|=|D| |D|*=DD*=D+ (D是数字) 所以,|DD|=x|x是整数,3.2.5 正则表达式,10/8/2020,Lecture 3,57,设e、e1、e2与e3都是某个字母表上的正则表达式,则有: 零正则表达式: e|=|e=e e=e= 单位正则表达式: e=e=e 交换律:e1|e2=e2|e1 结合律:e1|(e2|

30、e3)=(e1|e2)|e3 e1(e2e3)=(e1e2)e3 分配律:e1(e2|e3)=e1e2|e1e3 (e1|e2)e3=e1e3|e2e3,3.2.5 正则表达式,10/8/2020,Lecture 3,58,2)等价: 若|e1|=|e2|,则称e1与e2是等价的,记为e1=e2 3)正则表达式的性质 4)正则表达式与语法规则的联系 标识符= 字母字母数字 字母字母数字 字母字母数字 5 数字数字,3.2.5 正则表达式,10/8/2020,Lecture 3,59,10/8/2020,Lecture 3,60,设计要点 确定程序设计语言(或其子集) 设计属性字,设计各类表格

31、画出总控流程图,确定个子程序功能, 画出控制流程图 编程,设计调试实例,进行调试,3.3 词法分析程序的实现,10/8/2020,Lecture 3,61,属性字是符号的内部中间表示。所有属性字是等长、定长的。属性字指明是什么符号,且刻划了符号的属性。 1. 属性字的一般结构 符号类区别不同类的符号, 符号值区别同一类中不同的符号。,3.3.1 符号与属性字,10/8/2020,Lecture 3,62,2. 属性字的设计 属性字的设计是词法分析程序之实现的重要方面。它的设计要有利于语法分析阶段的处理。 符号编码表如下。,3.3.1 符号与属性字,10/8/2020,Lecture 3,63,

32、10/8/2020,Lecture 3,64,例 属性字序列 试为下列C语言程序写出属性字序列。 int main( ) int x,AB,C; x=(AB+C*C)/8; return 0; ,3.3.1 符号与属性字,10/8/2020,Lecture 3,65,10/8/2020,Lecture 3,66,属性字结构的改进 分成两大类:特定符号、非特定符号 指明说明符还是运算符 运算符时给出优先级 0 1 2 3 6 7 15 特定 说 运 优 编码 符号值 符号 明 算 先 符 符 级,10/8/2020,Lecture 3,67,例 改进的属性字序列,10/8/2020,Lectur

33、e 3,68,词法分析时使用的表: 字符表 符号机内表示对照表 关键字表 标识符表(符号表) 无正负号整数表,10/8/2020,Lecture 3,69,3.3.2 标识符的处理 1. 区别标识符的定义性出现与使用性出现 2. 确定标识符的作用域 3. 确定属性字中的符号值,10/8/2020,Lecture 3,70,1. 区别标识符的定义性出现与使用性出现 1)定义性出现时填标识符表(符号表) 应用性出现时查标识符表(符号表) 2)定义性出现一般在程序的说明部分 应用性出现一般在程序的控制部分 例见下页。,10/8/2020,Lecture 3,71,例 设有程序如下: /*PROGRA

34、M 求max*/ float max2(float x, float y) float max; if(xy) max=x; else max=y; return max; ,main( ) float a,b,max; printf(Input values of a and b: ); scanf(%f%f, ,10/8/2020,Lecture 3,72,标识符表 max2 0 0 0 0 1 max2 x 0 0 0 0 1 x y 0 0 0 0 1 y max 0 0 0 0 1 max a 0 0 0 0 1 a b 0 0 0 0 1 b,10/8/2020,Lecture 3

35、,73,2. 标识符作用域 概念:标识符与某类型属性相关联的范围,也即相应数据对象有定义的范围。 /* Scope for identifiers */ int m=13; int fun(int x, int y) int m=3, a=10; return (x*(y+a)-m); main( ) int a=7, b=5; printf( fun(%d,%d)/%d)=%dn, a, b, m, fun(a,b)/m ); ,10/8/2020,Lecture 3,74,3. 标识符属性字之符号值的确定 简单变量为标识符表序号; 常量为常量表序号; 其它各类标识符为相应信息表之序号。,1

36、0/8/2020,Lecture 3,75,3.3.3 词法分析程序的编写 1. 词法分析程序手工编写的基本思路 当设计了属性字、相应的各种表格后,画出词法分析程序总控流程图,进而给出各个相关子程序的控制流程示意图。这样将给出词法分析程序的控制过程和程序结构的清晰构思。 总控程序流程示意图,10/8/2020,Lecture 3,76,词法分析程序的基本子程序(函数) 取字符子程序、 取符号子程序、 查造常量表子程序、 查造标识符表子程序、 查符号机内表示对照表子程序 (查关键字子程序) 注意:取字符子程序的编写。,10/8/2020,Lecture 3,77,取符号子程序的程序控制流程示意图

37、,关键字,10/8/2020,Lecture 3,78,取符号子程序的约定: 约定1 进入时已取到当前符号的第一个字符; 约定2 在离开时已取到当前符号的后继字符。,10/8/2020,Lecture 3,79,手工实现词法分析程序的基本思路 确定所要实现的语言(或其子集) 设计属性字,并设计各类表格 ( 标识符表、常量表、符号机内表示对照表等 ) 画出总控流程图及各子程序的流程图 最终完成词法分析程序的编程及其调试,10/8/2020,Lecture 3,80,2. 词法分析程序实现之考虑 要点是数据结构(包括表格)的设计, 数据结构 typedef struct 符号类 属性字符号类; c

38、har 符号MaxSymbolLength;/*属性字符号值,即符号本身*/ 属性字; 其中符号类定义如下: typedef struct int 符号大类; /* 1:特定符号类 0:非特定符号类 */ int 说明符标志; /* 1:说明符, 0:非说明符 */ int 运算符标志; /* 1:运算符, 0:非运算符 */ int 运算符优先级; int 符号类编码; 符号类; 属性字 属性字序列MaxAttriWordNum;,10/8/2020,Lecture 3,81,表格的输入,以赋初值方式给出: 属性字 符号机内表示对照表23= 1,0,1,6,3, + , 1,0,1,6,4,

39、 - , 1,0,1,7,5, * , 1,0,1,7,6, / , 1,0,1,5,7, , 1,0,1,5,10,=, 1,0,1,4,11, =, 1,0,1,4,12,!=, 1,0,1,8,13, ,10/8/2020,Lecture 3,82,属性字 关键字表9= 0, 1,0,0,0,26,void, 1,1,0,0,27,int, 1,1,0,0,28,float, 1,1,0,0,29,char, 1,0,0,0,30,if, 1,0,0,0,31,else, 1,0,0,0,32,while,1,0,0,0,33,do ;,10/8/2020,Lecture 3,83,基于属性字(类型),定义标识符表如下: typedef struct char 标识符MaxIdLength; /*标识符:identifier*/ 属性字 标识符属性字; int 条目序号; 标识符表条目; 标识符表条目 标识符表MaxIDTNum; /*标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论