词法分析及词法分析程序..

合集下载

词法分析及词法分析程序

词法分析及词法分析程序
语义加工过程:
– 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

北航编译原理课件 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
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :

第三章 词法分析及词法分析程序 课后答案【khdaw_lxywyl】

第三章 词法分析及词法分析程序 课后答案【khdaw_lxywyl】

课 后 答 案 网
第三章 词法分析及词法分析程序 1 试用某种高级语言编写一个 FORTRAN 源程序的预处理子程序,其功能是: 每调用它一次, 即把源程序中的一个完整语句送入扫描缓冲区。要求删去语句中的注释行;删去续行标记字 符,把语句中的各行连接起来,并在语句的末端加上语句结束符。此外,还要求此程序具有 组织源程序列表输出的功能。 2 画出用来识别如下三个关键字的状态转移图。 STEP STRING SWITCH 3 假定有一个猎人带着一只狼、一头山羊和一棵白菜来到一条河的左岸,拟摆渡过河,而岸 边只有一条小船,其 大小仅能装载人和其余三件东西中的一件,也就是说,每一次猎人只 能将随行者中的一件带到彼岸。若猎人将狼和山羊留在同一岸上而无人照管,那么,狼就会 将羊吃掉;如果猎人把山羊和白菜留在同一岸,山羊也会把白菜吃掉。现在,请你用状态转
试找出一个长度最小的输入串,使得:
h (1) 在识别此输入串的过程中,每一状态至少经历一次;
(2) 每一状态转换至少经历一次。 9 对于下列的状态转换矩阵:[]a[]bS[]A[]SA[]A[]BB[]B[]B(i) 初态:S
k 终态:B[][][]a[]bS[]A[]BA[]B[]AB[]B[]B(ii) 初态:S
26 指出下列 LEX 正规式所匹配的字符串:
. (1) "{" [^{]*"}"
(2) ^[^a-z][A-Z][0-9]$ (3) [^0-9]|[\r\n]
w (4) \′([^′\n]|\′\′)+\′
(5) \"([^"\n]|\\["\n])*\"
a 27 写出一个 LEX 正规式,它能匹配 C 语言的所有无符号整数 (例如:OX89ab,0123,45,

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

编译原理词法分析及词法分析程序
∴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,

my第03章-词法分析

my第03章-词法分析
第三章 词法分析
如果一个种别只含有一个单词符号,那么对 于这个单词符号,种别编码就完全代表它自身 了。若一个种别含有多个单词符号,那麽,对 于它的每个单词符号,除了给出种别编码之外, 还应给出有关单词符号的属性信息。 单词符号的属性是指单词符号的特征或特性。 属性值则是反映特性或特征的值。例如,对于 某个标识符,常将存放它有关信息的符号表项 的指针作为其属性值;对于某个常数,则将存 放它的常数表项的指针作为其属性值。
假定每半个区可容120个字符,而这 两个半区又是互补的。如果搜索指示器 从单词起点出发搜索到半区的边缘但尚 未达到单词的终点,那么就调用预处理 子程序,令其把后续的120个字符装入另 半区。我们认定在另半区一定可以达到 单词的终点。这意味着得标示符和常数 的长度实际上必须加以限制,否则即使 缓冲区再大也无济于事。
第三章 词法分析

3.2 词法分析器的设计 3.2.1 输入、预处理 词法分析器工作的第一步是输入源程序文本。输入串一 般放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分 析器的工作可以直接在这个缓冲区中进行。但在许多情况 下,把输入串预处理一下,对单词符号的识别工作将是比 较方便的。 预处理工作包括对空白符、跳格符、回车符和换行符等 编辑性字符的处理,及删除注解等。 我们可以设想构造一个预处理子程序,他完成上面的工 作。每当词法分析器调用它时就处理出一串确定长度的输 入字符,并将其装入词法分析器所指定的缓冲区中(称为 扫描缓冲区)。这样分析器就可以在此缓冲区中直接进行 单词符号的识别工作。
a 0 b 2 b a a b 3 a
1
b
第三章 词法分析
替换规则
如:正规式:R=(a*b)*ba(a|b)*
第三章 词法分析
习题:画出状态转换图

第3章 词法分析

第3章 词法分析

第三章 词法分析
3.1 词法分析概述
五、词法分析程序的输出形式 输出的单词串为: 解:输出的单词串为:
2011-7-27
中南大学软件学院 陈志刚
15
第三章 词法分析
3.2 词法分析程序的设计
一、状态转换图
状态转换图是一张有限方向图。用结点代表状态, 状态之间用箭弧连接,箭弧上的标记(字符)代表 在射出结状态下可能出现的输入字符或字符类。 一个状态转换图只包含有限个状态,有一个初态, 终态用双圈表示。一个状态转换图可识别一定的字 符串。
第三章 词法分析
3.1 3.2 3.3 3.4 3.5 词法分析概述 词法分析程序的设计 正规式与有限自动机 词法分析程序的实现 词法分析器的自动生成
第三章 词法分析
3.1 词法分析概述
一、词法分析程序的任务 二、词法分析程序的功能 三、词法分析程序的安排 四、词法分析程序的实现方式 五、词法分析程序的输出形式
状态都是非终结符号 S:开始状态 E:终止状态,用双圈表示 I:标识符状态
2011-7-27
例1: : S
字母或数字
字母
I
数字
E
中南大学软件学院 陈志刚
16
第三章 词法分析
一、状态转换图
例2: :
0
0 0 1
U
0 1
V
1
Z
例3: :
2011-7-27
中南大学软件学院 陈志刚
17
第三章 词法分析
二、状态转换图的实现
2011-7-27 中南大学软件学院 陈志刚 19
第三章 词法分析
例2: :
2011-7-27
中南大学软件学院 陈志刚
PROCEDURE Pro0; BEGIN Getchar; IF char IN [‘A’..‘Z’ ] then pro1 else error; END; Procedure pro1; begin getchar; while char IN [‘A’..‘Z’, ‘o’..‘g’ ] DO begin concat; getchar; End; pro2; End; procedure pro2; begin retract; return(101,TOKEN ); end; 20

编译原理实验 词法分析&语法分析程序

编译原理实验 词法分析&语法分析程序

编译原理实验词法分析程序实验一:词法分析程序1、实验目的从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。

2、实验内容表C语言子集的单词符号及内码值单词符号种别编码助记符内码值while 1 while --if 2 if --else 3 else --switch 4 switch --case 5 case --标识符 6 id id在符号表中的位置常数7 num num在常数表中的位置+ 8 + --- 9 - --* 10 * --<= 11 relop LE< 11 relop LT== 11 relop LQ= 12 = --; 13 ; --输入源程序如下if a==1 a=a+1;else a=a+2;输出对应的单词符号形式的中间程序3、实验过程实验上机程序如下:#include "stdio.h"#include "string.h"int i,j,k;char s ,a[20],token[20];int letter(){if((s>=97)&&(s<=122))return 1;else return 0;}int Digit(){if((s>=48)&&(s<=57))return 1;else return 0;}void get(){s=a[i];i=i+1;}void retract(){i=i-1;}int lookup(){if(strcmp(token, "while")==0)return 1;else if(strcmp(token, "if")==0)return 2;else if(strcmp(token,"else")==0)return 3;else if(strcmp(token,"switch")==0)return 4;else if(strcmp(token,"case")==0)return 5;else return 0;}void main(){printf("please input you source program,end('#'):\n");i=0;do{i=i+1;scanf("%c",&a[i]);}while(a[i]!='#');i=1;memset(token,0,sizeof(char)*10);j=0;get();while(s!='#'){if(s==' '||s==10||s==13)get();else{switch(s){case'a':case'b':case'c':case'd':case'e':case'f':case'g':case'h':case'i':case'j':case'k':case'l':case'm':case'n':case'o':case'p':case'q':case'r':case's':case't':case'u':case'v':case'w':case'x':case'y':case'z':while(Digit()||letter()){token[j]=s;j=j+1;get();}retract();k=lookup();if(k==0)printf("(6,%s)\n",token); elseprintf("(%d,null)\n",k); break;case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':while(Digit()){token[j]=s;j=j+1;get();}retract();printf("(%d,%s)\n",7,token); break;case'+':printf("(+,null)\n"); break;case'-':printf("(-,null)\n"); break;case'*':printf("(*,null)\n"); break;case'<':get();if(s=='=')printf("(relop,LE)\n"); else{retract();printf("(relop,LT)\n");}break;case'=':get();if(s=='=')printf("(relop,EQ)\n"); else{retract();printf("(=,null)\n");}break;case';':printf("(;,null)\n"); break;default:printf("(%c,error)\n",s);break;}memset(token,0,sizeof(char)*10);j=0;get();}}}4、实验结果实验结果分析:if是关键字,对应种别编码为2,输出(2,null)a是标识符,对应种别编码为6,值为a,输出(6,a)==的助记符是relop,内码值为LE,输出(relop,LE)1是常数,对应种别编码为7,值为1,输出(7,1)a是标识符,对应种别编码为6,值为a,输出(6,a)=是赋值符号,直接输出,(=,null)a是标识符,对应种别编码为6,值为a,输出(6,a)+是运算符,直接输出(=,null)1是常数,对应种别编码为7,值为1,输出(7,1);是语句结束符号,直接输出(;,null)else是关键字,对应种别编码为3,输出(3,null)a是标识符,对应种别编码为6,值为a,输出(6,a)=是赋值符号,直接输出,(=,null)a是标识符,对应种别编码为6,值为a,输出(6,a)+是运算符,直接输出(=,null)2是常数,对应种别编码为7,值为2,输出(7,2);是语句结束符号,直接输出(;,null)#是输入结束标志编译原理实验语法分析程序实验二:语法分析程序1、实验目的:将单词组成各类语法单位,讨论给类语法的形成规则,判断源程序是否符合语法规则3、实验内容:给定文法:G[E]:E→E+E|E-E|E*E|E/E|(E)E→0|1|2|3|4|5|6|7|8|9首先把G[E]构造为算符优先文法,即:G’[E]:E→E+T|TT→T-F|FF→F*G|GG→G/H|HH→(E)|i得到优先关系表如下:+ - * / i ( ) # + ·><·<·<·<·<··>·> - ·>·><·<·<·<··>·> * ·>·>·><·<·<··>·> / ·>·>·>·><·<··>·>i ·>·>·>·>·>·>( <·<·<·<·<·<·=) ·>·>·>·>·>·> # <·<·<·<·<·<·=构造出优先函数+ - * / i ( ) #f 6 8 10 12 12 2 12 2g 5 7 9 11 13 13 2 2要求输入算术表达式:(1+2)*3+2*(1+2)-4/2输出其对应的语法分析结果4、实验过程:上机程序如下:#include "stdio.h"#include "string.h"char a[20],optr[10],s,op;int i,j,k,opnd[10],x1,x2,x3;int operand(char s){if((s>=48)&&(s<=57))return 1;else return 0;}int f(char s){switch(s){case'+':return 6;case'-':return 8;case'*':return 10;case'/':return 12;case'(':return 2;case')':return 12;case'#':return 2;default:printf("error");}}int g(char s){switch(s){case'+':return 5;case'-':return 7;case'*':return 9;case'/':return 11;case'(':return 13;case')':return 2;case'#':return 2;default:printf("error");}}void get(){s=a[i];i=i+1;}void main(){printf("请输入算数表达式,并以‘#’结束:\n");i=0;do{scanf("%c",&a[i]);i++;}while(a[i-1]!='#');i=0;j=0;k=0;optr[j]='#';get();while((optr[j]!='#')||(s!='#')){if(operand(s)){opnd[k]=s-48;k=k+1;get();}else if(f(optr[j])<g(s)){j=j+1;optr[j]=s;get();}else if(f(optr[j])==g(s)){if(optr[j]=='('&&s==')'){j=j-1;get();}else if(optr[j]=='('&&s=='#'){printf("error\n");break;}else if(optr[j]=='#'&&s==')'){printf("error\n");break;}}else if(f(optr[j])>g(s)){op=optr[j];j=j-1;x2=opnd[k-1];x1=opnd[k-2];k=k-2;switch(op){case'+':x3=x1+x2;break;case'-':x3=x1-x2;break;case'*':x3=x1*x2;break;case'/':x3=x1/x2;break;}opnd[k]=x3;k=k+1;printf("(%c,%d,%d,%d)\n",op,x1,x2,x3);}else{printf("error\n");break;}}if(j!=0||k!=1)printf("error\n");}5、实验结果:实验结果分析:(1+2)*3+2*(1+2)-4/2#因为‘)’优先级大于‘*’,先计算1+2=3,并输出(+,1,2,3)原式变为:3*3+2*(1+2)-4/2#因为‘*’优先级大于‘+’,先计算3*3=9,并输出(*,3,3,9)原式变为:9+2*(1+2)-4/2#因为‘)’优先级大于‘-’,先计算1+2=3,并输出(+,1,2,3)原式变为:9+2*3-4/2#因为‘*’优先级大于‘-’,先计算2*3=6,并输出(*,2,3,6)原式变为:9+6-4/2#因为‘/’优先级大于‘#’,先计算4/2=2,并输出(/,4,2,2)原式变为:9+6-2#因为‘-’优先级大于‘#’,先计算6-2=4,并输出(-,6,2,4)原式变为:9+4#因为‘+’优先级大于‘#’,计算9+4=13,并输出(+,9,4,13)原式变为13#优先级等于#,跳出while循环,运算结束!。

第二章 词法分析

第二章 词法分析

8
单词种别表示单词的种类, (1) 单词种别表示单词的种类,是语法分 析所需要的信息。 析所需要的信息。 一个语言的单词符号如何划分种类、 一个语言的单词符号如何划分种类、分为 几类、如何编码都属于技术性问题, 几类、如何编码都属于技术性问题,主要取 决于处理上的方便。 决于处理上的方便。 通常让每种单词对应一个整数码, 通常让每种单词对应一个整数码,这样可 最大限度地把各个单词区别开来。 最大限度地把各个单词区别开来。
6
(4) 运 算 符 : 如 “ +” 、 “ − ” 、 “ * ” 、 /”、 >”、 <”等 “/”、“>”、“<”等。 (5) 界符:在语言中是作为语法上的分界符 界符: 号使用的, 号使用的 , 如“ , ”、 “ ;” 、 “( ” 、 “ ) ” 等。 一个程序语言的保留字、 一个程序语言的保留字、运算符和界符 的个数是确定的, 的个数是确定的,而标识符或常数的使用则 不限定个数。 不限定个数。
24
终态一般对应一个return( 语句。 终态一般对应一个return( )语句。 return意味着从词法分析器返回到调用段 return意味着从词法分析器返回到调用段 一般指返回到语法分析器。 ,一般指返回到语法分析器。
图2–4 含有分支或回路的状态示意 (a) 含分支的状态 ;(b) 含回路的状态 含分支的状态i; 含回路的状态i
(3,’if’) (1,指向 的符号表入口) 指向i (1,指向i的符号表入口) (4,’=’) (2,’5’) (3,’then’) (1,指向 的符号表入口) 指向x (1,指向x的符号表入口) (4,’:=’) (1,指向 的符号表入口) 指向y (1,指向y的符号表入口) (5,’;’)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
若Bij为“出错”,则说明输入符号串有误,拒绝接受.扫描
器将调用出错处理程序进行处理
38
程序3-2 状态矩阵驱动程序
CurStat=0; FlagOfFS=NoneSeen; /*将终态标志置为“未经历”*/ if(CurChar==EOF) return 0; while (CurChar != EOF){
语义加工过程:
– 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)).
后继状 态 1 3
1 2 4 end 2 4 end 2
6 5 5
6
6 end
43
3.3 有限自动机
状态转换图实际上是有限自动机的图形 表示
44
3.3.1 确定的有限自动机DFA
抽象地看,状态转换图由五个部分组成:
(1)有限个状态之集,记作K; (2)有限个输入符号组成的字母表,记作; (3)从K到K的转换函数 f: KK. f(p,a)=q表示若当
的路径,此路径上各矢线的标记依次拼接起来所组成的符号串恰为 y。
33
由左线性文法构造状态转换图
设G=(VN,VT,P,S)是一左线性文法,构造相应的状态转换图 的方法是: 首先用VN中的非终结符标记M的结点,其中,开始符S 对应的结点为终态结点。引入一个新结点R(VN)标记初 态。矢线的连接规则为:
通过状态图可以确定ω是文法的句子.
②此过程是一种推导过程.
Z=>0U=>01Z=>011V=>0110Z=>01100U=
>011001
32
右线性文法与状态转换图
设G是一右线性文法,M是相应的状态转换图,则从前面的讨 论可以看出如下事实:
(1)在利用M对符号串w进行识别时,M中每次状态的转换都模拟了一 步直接推导,即识别方法(或称分析方法) 是“”的;
(3)若当前状态已无后继状态,并且此前经历过终态, 则执行曾经历的最近的终态所对应的语义动作;
(4)若当前状态已无后继状态,并且此前没有经历过终 态,则表明输入字符串有词法错误,报错,并略过余 下的部分词文,从状态0开始继续下一单词的识别。
状态矩阵是稀疏的,应该采用紧凑的数据结构
41
识别无符号数的语义操作
第三章 词法分析及词法分析程序
1
词法分析程序设计的流程
1、各类单词表示成不同的正规文法Gi 2、求正规文法Gi对应的正规表达式 3、由各个正规表达式构造对应的-NFA 4、由各个-NFA组合成一个大的-NFA 5、大的-NFA确定化、最小化得到DFA M 6、DFA M就是构造词法分析程序的流程图 7、按照DFA M编写词法分析程序
24
例:G[Z]:
状态转换图:
Z→0U∣1V
U →1Z∣1
1
U
V →0Z∣0
0
1
初态
Z
F
1
0
0
V
25
利用状态转换图识别符号串的方法
对于已给的字符串w=a1a2…an,aiVT,利用状态转换图 对w 识别的步骤如下:
(1)从初始状态S出发,自左至右逐个扫描w的各个字符 (当前为a1),此时在结点S所射出的诸矢线中,寻找标 记为a1的矢线(若不存在,则表明w有语法错误),读入 a1并沿矢线所指方向前进,过渡到下一状态(设为A1).
(2)设当前处在Ai状态,所扫描的字符为ai+1,在结点Ai所 射出的诸矢线中,寻找标记为ai+1的矢线(若不存在,则 表明w有语法错误),读入ai+1,并进入状态Ai+1;
(3)重复(2),直到w中所有字符被读完且恰好进入终态F 时,宣告整个识别结束,w可被接受.
28
例:G[Z]:
状态转换图:
Z→0U∣1V
单词
运算符
MUL GT
词文 * >
模式 * >
界符
,
,
,
串常量
STRING
“hello” ‘there’
双(单)引号中间的字符 串(不包括引号本身)
7
3.2 正规文法和状态转换图
单词的描述:正规文法定义了3型语言,常见 的单词可由正规文法定义。 单词的识别:状态转换图可用于识别3型语言, 它是设计和实现扫描器的一种有效工具,是有 限自动机的直观图示。
if(Stat=TransMat[CurStat][CurChar]!=NULL) { /*能进行状态转换*/
CurStat=Stat; advance( ); if( CurStat 是终态){
FlagOfFS=HasSeen; /*标记经历过的终态*/ 记下输入串中当前位置及该状态相关联的动作; }/*end if CurStat 是终态*/ }
42
识别无符号数的状态矩阵
当前状 态 0
1 2 3 4
5 6
扫描字符
语义处理操作或接受动作
d . ther d . E other d E other d other d + other
d other
d other
{w=0;n=0;p=0;e=1;w=w*10+d} {w=0;n=0;p=0;e=1;} error {w=w*10+d;}
30
状态转换图与文法推导
用状态转换图识别符号串w的过程,就是为w建立一个 推导S* w的过程。
在第一步(在初始状态S下,扫描到a1而过渡到下一状 态A1),由状态转换图的构造规则可知,G中必有产生 式Sa1A1;
对于识别过程的后续步骤,由状态Ai 识别ai+1后过渡到 Ai+1恰好对应了使用产生式Ai ai+1Ai+1 。
前状态为p,且输入符号为a,则进入下一个状态为q; (4)S0K,初始(开始)状态; (5)若干个终态之集: Z(K) 由上述五个要素组成的五元式 M=(K, , f,S0,Z )称为一
功能:把识别出的无符号数转换成整数(ICON)和实数 (FCON)。
无符号数的输入形式:dmdm-1…d0 . d-1…d-n E dd…d 可改写为 dmdm-1…d0 d-1…d-n 10^( dd…d -n);
用w,p,n,e分别计录尾数、指数、小数位及指数的符号。 因此数值为: N=w 10^(e(p-n))
22
状态转换图的构造原则
①G的每一个非终结符号代表一结点(状态)
A
B
②开始符号S作为初始状态 S
设一符号F不属于V作为终止状态 F
③形如A→aB的规则 a
A
B
④形如A→a的规则
a
A
F
特别:A →ε 未曾在A的射出弧中 出现A过的终结符号
F
某些情况下也可考虑直接将A作为终态 A
23
例:G[Z]: Z→0U∣1V U →1Z∣1 V →0Z∣0
凡能用正规文法描述的语言,均可由某种有限 状态算法——状态转换图进行分析。
21
由右线性文法构造状态转换图
设G=(VN,VT,P,S)是一右线性文法,并设|VN|=k, 则所要构造的状态转换图共有k+1个状态(结 点)。用VN中的每个符号分别标记其中的k个 结点,且令G的开始符S为初态结点;余下 的一个结点作为终态结点,用F(VN)标记。
U →1Z∣1
1
U
V →0Z∣0
0
1
初态
Z
F
1
0
0
V
ω1=011001 ω2=111001
29
状态转换图识别的语言
显然,若从初态出发,分别沿一切可能的路径到达终态结 点,并将路径中矢线上所标记的字符依次连接起来,便得 到状态转换图所能识别的全部符号串,这些符号串组成 的集合构成了该状态转换图识别的语言。
36
3.2.2 状态转换图的实现-状态矩阵法
状态转换图可方便地用于识别单词.但是,如何让计算机 利用状态转换图来进行词法分析呢?
一个简单实用的方法就是将图以矩阵的形式保存在内存 中.这就是所谓的状态矩阵法.
状态矩阵 以图中各个状态S1,S2,…,Sn为行,以各个输入符 号a1,a2, …,am为列,组成一个nm矩阵B,其元素 Bij=B[Si,aj]指明扫描器此时应完成的语义动作和要转换 到的下一状态Sk .其含义是,在Si状态下,扫描到aj符时,按 序偶(Si,aj)查矩阵B,扫描器根据Bij的指示,先执行相应的 语义动作,再转换到下个状态Sk.
(2)因右线性文法只有形如AaB、A a的产生式,所以推导的每一
步所得句型只含一个非终结符,且必出现在句型的最右端,所以 推导是规范推导,每步所得的句型也必为规范句型;
(3)对于M所识别的任一符号串x,必存在G中的一个推导S * x (即有 xL(G);反之,对于L(G)中任一句子y,必存在一条从初态S到终态F
{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,且标
相关文档
最新文档