编译原理 -实验3-4 预测分析表方法
编译原理语法分析(3)_ 习题

来消除左递归。由此,将产生式B→Bb|d改造为 B→dB′ B′→bB′| ε
其次,应通过提取公共左因子的方法来消除G[A]中的回 溯,即将产生式A→aABl|a改造为 A→aA′ A′→ABl | ε
最后得到改造后的文法为 G[A′]:A→aA′ A′→ABl | ε B→dB′ B′→bB′| ε
S ( L) L, S S ( L)
S a
图4-5 句型(S,(a))的语法树
(2) 由图4-5可知: 短语:S、a、(a)、S,(a)、(S,(a)); 直接短语:a、S; 句柄:S; 素短语:素短语可由图4-5中相邻终结符之间的优 先关系求得,即:
#⋖ (⋖,⋖ (⋖a⋗)⋗)⋗# 因此,素短语为a。
D
D
TL
TL
int a L′
int L , c
, b L′
L, b
, c L′
a (a)
(b)
图4-6 两种文法为int a,b,c构造的分析树 (a) 文法G(D); (b) 文法G′(D)
3.9 考虑文法G[S]: S→(T) | a+S | a T→T,S | S
消除文法的左递归及提取公共左因子,然后对每 个非终结符写出不带回溯的递归子程序。
优先关系表构造方法: ① 对P→…ab…或P→…aQb…,有ab; ② 对P→…aR…而b∈FIRSTVT(R),有a⋖b; ③ 对P→…Rb…而a∈LASTVT(R),有a⋗b。 解之无①。 由②得:E→…+T,即+⋖FIRSTVT(T),有+⋖*,+⋖i;
T→…*P,即*⋖FIRSTVT(P),有*i。 由③得:E→E+…,即LASTVT(E)⋗+,有+⋗+,*⋗+, i⋗+;
编译原理笔记10 自上而下分析-预测分析程序与LL(1)文法

预测分析程序与LL(1)文法一、预测分析程序1.带预测分析的PDA:1)在PDA中加入预测分析之后,可以消除自上而下分析中出现回溯的现象,此时PDA可以改造为:2)注:a、改造后,整个分析过程都在预测分析程序控制下工作。
B、预测分析程序用了一个预测分析表,它是预测分析程序分析时的主要依据。
3)预测分析表:预测分析表是一矩阵M[A,a],其中行标A是非终结符,列标a是终结符或串结束符;矩阵元素M[A,a]是存放A的一个候选式,指出当前栈顶符号为A 且面临读入符号为a时应选的候选式;或者存放“出错标志”,指出A不该面临读入符号a。
2.预测分析程序算法描述设栈顶符号为X,读入符号为a,则1)若X=a=‘#’,则表示识别成功,退出分析程序;2)若X=a=‘#’,则表示匹配,弹出栈顶符号X,读头前进一格,让读头指向下一个符号,以读入下一个符号;若X是终结符,但X<>a,则调用error处理;3)若X属于非终结符,则查预测分析表M。
若M[X,a]中存放着关于X的产生式,则弹出X,且将相应产生式右部以自右向左的顺序压入栈,在输出带上记下产生式编号;若M[X,a]中存放着出错标记,则调用相应Error处理。
二、求串α的终结首符集和非终结符A的随符集a) 求串α的终结首符集First(α)i. 定义:假定α是文法G的一个符号串,α属于星闭包,则First(α)={a | α广义推导出a......a,a属于终结符}注:1)若α推导出空串,那么空串就属于First(α)。
2)First(α)集合是α的所有可能推导出的开头终结符或空串所组成的集合。
ii. 算法具体步骤:b) 求非终结符A的随符集Follow(A)i. 定义:假定S是文法G的开始符号,对于G的任何非终结符A,定义:ii. 算法1. 对文法开始符号S,将‘#’加入到Follow(S)中;2. 若B->αAβ是文法G的一个产生式,则将First(β)-空串加入到Folow(A)中;3. 若B->αA是文法G的一个产生式,或B->αAβ是文法G的一个产生式,且β推导出空串,则将Follow(B)加入到Follow(A)中;注:这里的文法必须消除左递归且提取了左因子后的文法。
编译原理课后答案347919530

第二章 高级语言及其语法描述4.令+、*和↑代表加,乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值:(1) 优先顺序(从高至低)为+,*和↑,同级优先采用左结合。
(2) 优先顺序为↑,+,*,同级优先采用右结合。
解:(1)1+1*2↑2*1↑2=2*2↑1*1↑2=4↑1↑2=4↑2=16 (2)1+1*2↑2*1↑2=1+1*2*1=2*2*1=2*2=46.令文法G6为 N →D|NDD →0|1|2|3|4|5|6|7|8|9 (1) G6 的语言L (G6)是什么?(2) 给出句子0127、34和568的最左推导和最右推导。
解:(1)L (G6)={a|a ∈∑+,∑=﹛0,1,2,3,4,5,6,7,8,9}}(2)N =>ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D => 0127 N => ND => N7=> ND7=> N27=> ND27=> N127=> D127=> 0127 N => ND => DD => 3D => 34N => ND => N4=> D4 =>34N => ND => NDD => DDD => 5DD => 56D => 568 N => ND => N8=> ND8=> N68=> D68=> 5687.写一个文法,使其语言是奇数集,且每个奇数不以0开头。
解:A →SN, S →+|-|∑, N →D|MDD →1|3|5|7|9, M →MB|1|2|3|4|5|6|7|8|9 B →0|1|2|3|4|5|6|7|8|9 8. 文法:E T E T E T TF T F T F F E i→+-→→|||*|/()| 最左推导:E E T T TF T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()最右推导:E E T E TF E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()*()*()*()*()语法树:/********************************EE FTE +T F F T +iiiEEFTE-T F F T -iiiEEFT+T F FTiii*i+i+ii-i-ii+i*i*****************/9.证明下面的文法是二义的:S → iSeS|iS|I解:因为iiiiei 有两种最左推导,所以此文法是二义的。
编译原理半期考试答案

一、填空题(每空1分,共20分) 1.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,中间代码生成,代码优化等几个基本阶段,同时还会伴有__表格处理___和 ___出错处理__。
2.若源程序是用高级语言编写的,___目标程序__是机器语言程序或汇编程序,则其翻译程序称为 ___编译程序__ 。
3.编译方式与解释方式的根本区别在于__是否生成目标代码___。
4.对编译程序而言,输入数据是___源程序__, 输出结果是__目标程序___。
5.若两个正规式e1和e2所表示的正规集相同,则e1和e2等价,写作e1=e2。
6.一个句型中的最左简单短语称为该句型的___句柄__。
7.词法分析基于__正则___文法进行,即识别的单词是该类文法的句子。
二、是非题(请在括号内,正确的划√,错误的划×)(每个1分,共10分)1.计算机高级语言翻译成低级语言只有解释一种方式。
(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。
(×)3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。
(√ )4.正则文法其产生式为 A->a , A->Bb, A,B ∈V N , a 、 b ∈V T 。
(×)5.每个文法都能改写为 LL(1) 文法。
(√)(2班做)6.有穷自动机接受的语言是正规语言。
(√)(1班做)7.对任何一个NFA M都存在一个DFA M’,使得L(M’)=L(M).( √ )8.设r和s分别是正规式,则有L(r|s)=L(r)L(s)。
(×)9.确定的自动机以及不确定的自动机都能正确地识别正规集。
(√)10.词法分析作为单独的一遍来处理较好。
(× )11.有穷自动机接受的语言是正规语言。
(√)三、选择题(每小题2分,共20分)1.文法G 产生的_____的全体是该文法描述的语言。
智慧树答案编译原理知到课后答案章节测试2022年

第一章1.编译器(Compiler)能捕捉的错误都是静态错误(Static errors)。
答案:对2.编译器只能识别动态(Dynamic)语义,但不能识别静态(Static)语义。
答案:错3.对源程序进行编译正确处理顺序为()答案:词法分析、语法分析、语义分析、代码生成4.编译器的各个阶段的产物分别是()、中间代码和目标代码。
答案:记号序列、语法树、注释树5.()执行翻译代码的功能,且立即执行源程序,而不产生中间代码。
答案:解释程序6.将编译程序分成若干个“遍”是为了____。
答案:利用有限的机器内存并提高机器的执行效率7.词法分析器用于识别_____。
答案:单词8.在编译器的功能模块中,扫描器的功能是()。
答案:词法分析9.编译器进行的是()答案:静态语义分析10.编译器中词法分析的输入和输出分别是()答案:字符串、记号串第二章1.确定的自动机以及不确定的自动机都能正确地识别正规集。
答案:对2.正则文法、 DFA和正则表达式均可以用于描述高级程序设计语言的词法。
答案:对3.在有穷自动机中,两个状态是等价的条件是()。
答案:A和B4.扫描器所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单位即()答案:单词5.设∑为{a,b},则a,ba,{},Ø都是∑上的正规式。
答案:对6.以下( )不是DFA的组成部分。
答案:初始状态集合7.在有穷自动机中,有穷自动机的状态s和t不等价,则称这两个状态是可区别的。
答案:对8.“由大写字母组成的、以Z开头并且不以Z结尾的字符串”的正则表达式是()答案:Z [a-Z]*[A-Y]9.下面( )是词法分析的理论基础。
答案:有穷自动机第三章1.高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。
答案:自顶向下2.下面哪种分析方法是自顶向下分析()。
答案:LL(1)3.推导是一个替换序列,每一步都是对()进行替换,形成一个从单独的结构名开始,结束于一串记号符号的过程。
《编译原理》考试试题及答案(汇总)

《编译原理》考试试题及答案(汇总)一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分)1.编译程序是对高级语言程序的解释执行。
(× )2.一个有限状态自动机中,有且仅有一个唯一的终态。
(×)3.一个算符优先文法可能不存在算符优先函数与之对应. (√ )4.语法分析时必须先消除文法中的左递归。
(×)5.LR分析法在自左至右扫描输入串时就能发现错误,但不能准确地指出出错地点。
(√)6.逆波兰表示法表示表达式时无须使用括号。
(√ )7.静态数组的存储空间可以在编译时确定. (×)8.进行代码优化时应着重考虑循环的代码优化,这对提高目标代码的效率将起更大作用。
(×) 9.两个正规集相等的必要条件是他们对应的正规式等价. (×)10.一个语义子程序描述了一个文法所对应的翻译工作。
(×)二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.词法分析器的输出结果是_____.A.()单词的种别编码B.( )单词在符号表中的位置C.( ) 单词的种别编码和自身值D.() 单词自身值2.正规式M 1 和M 2 等价是指_____。
A.( )M1和M2的状态数相等B.()M1和M2的有向边条数相等C.()M1和M2所识别的语言集相等D.()M1和M2状态数和有向边条数相等3.文法G:S→xSx|y所识别的语言是_____.A.( )xyx B.( ) (xyx)* C.()xnyxn(n≥0)D.()x*yx*4.如果文法G是无二义的,则它的任何句子α_____.A.( )最左推导和最右推导对应的语法树必定相同B.( ) 最左推导和最右推导对应的语法树可能不同C.()最左推导和最右推导必定相同D.()可能存在两个不同的最左推导,但它们对应的语法树相同5.构造编译程序应掌握______。
编译原理半期考试答案

一、填空题(每空1分,共20分) 1.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,中间代码生成,代码优化等几个基本阶段,同时还会伴有__表格处理___和 ___出错处理__。
2.若源程序是用高级语言编写的,___目标程序__是机器语言程序或汇编程序,则其翻译程序称为 ___编译程序__ 。
3.编译方式与解释方式的根本区别在于__是否生成目标代码___。
4.对编译程序而言,输入数据是___源程序__, 输出结果是__目标程序___。
5.若两个正规式e1和e2所表示的正规集相同,则e1和e2等价,写作e1=e2。
6.一个句型中的最左简单短语称为该句型的___句柄__。
7.词法分析基于__正则___文法进行,即识别的单词是该类文法的句子。
二、是非题(请在括号内,正确的划√,错误的划×)(每个1分,共10分)1.计算机高级语言翻译成低级语言只有解释一种方式。
(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。
(×)3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。
(√ )4.正则文法其产生式为 A->a , A->Bb, A,B ∈V N , a 、 b ∈V T 。
(×)5.每个文法都能改写为 LL(1) 文法。
(√)(2班做)6.有穷自动机接受的语言是正规语言。
(√)(1班做)7.对任何一个NFA M都存在一个DFA M’,使得L(M’)=L(M).( √ )8.设r和s分别是正规式,则有L(r|s)=L(r)L(s)。
(×)9.确定的自动机以及不确定的自动机都能正确地识别正规集。
(√)10.词法分析作为单独的一遍来处理较好。
(× )11.有穷自动机接受的语言是正规语言。
(√)三、选择题(每小题2分,共20分)1.文法G 产生的_____的全体是该文法描述的语言。
编译原理(3)语法_4(自顶向下语法分析:LL(1)分析法)

课本例题3.8 第二步:计算非终结符的FOLLOW集合
G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i ③由E→TE' 知FOLLOW(E) ⊂ FOLLOW(E' ), 即FOLLOW(E' ) = {),#}; 由E→TE ' 且E ' → ε知FOLLOW(E)FOLLOW(T),即 FOLLOW(T) = {+,),#};
特别是当Y1~Yk均含有ε产生式时,应把ε也加到FIRST(X)中。
课本例题3.8 第一步:计算非终结符的FIRST集合 例3.8 试构造表达式文法G[E]的LL(1)分析表,其中: G[E]: E→TE' E'→ + TE' | ε T→FT' T'→*FT' | ε F→(E) | i
[解答] 首先构造FIRST集,步骤如下: ① FIRST(E') = {+, ε}; FIRST(T') = {*, ε}; FIRST(F) = {(, i}; ② T→F… 和E→T…知:FIRST(F) ⊂ FIRST(T) ⊂ FIRST(E) 即有FIRST(F) = FIRST(T) = FIRST(E) = {(,i}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sign++;
}
}
}
void main()
{
char str1[20],str2[20];
int i=0;
printf("请输入所要分析的文件名:");
scanf("%s",str1);
FILE *fp;
if((fp=fopen(str1,"r"))==NULL)
{
printf("没有这个文件!\n");
实验3-4预测分析表方法
班级:__学号:__姓名:_ _得分:_ _
一、实验目的
理解预测分析表方法的实现原理。
二、实验内容:
编写一通用的预测法分析程序,要求有一定的错误处理能力,出错后能够使程序继续运行下去,直到分析过程结束。可通过不同的文法(通过数据表现)进行测试。
二、实验内容提示
1.算法数据构造:
{
If(errornum==1)………………
Else if(errornum==2)……………
Else………………..
//或者可用choose case语句处理
}
4.增加了错误处理的预测分析程序预测分析程序的算法:
将“#”和文法开始符依次压入栈中;
把第一个输入符号读入a;
do{
把栈顶符号弹出并放入x中;
exit(0);
}
else
{
char x=s->data[s->top];
s->top--;
return x;
}
}
DataType Top_SeqStack(SeqStack *s) //取栈顶元素
{
if(s->top==-1)
return 0;
else
return s->data [s->top ];
{
int i=0;
while(VN[i][0]!=s&&i<length_vn)
{
i++;
}
if(i==length_vn)
return -1;
return i;
}
void Error(int errornum,char x)
{
if(errornum==1)
{
printf("第一种错误,弹出栈顶元素\n");
while(i<10&&s!='\n')
{
if(VN[i][0]==s)
return 1;
else
i++;
}
return 0;
}
int VTT(char s) //终结符匹配
{
int i=0;
while((VT[i][0]!=s))
i++;
return i;
}
int VNN(char s) //非终结符匹配
构造预测分析表:int analyze_table[10][10]={ } //数组元素值存放产生式的编号,-1、-2表示出错
(2)预测分析表的构造方法2
可使用三维数组
Char analyze_table[10][10][10]={ }
或
Char *analyze_table[10][10]={ }
printf("匹配终结符%c\n",str2[sign]);
Pop_SeqStack(s);
sign++;
}
else
{
BufVN(x);
num1=VTT(str2[sign]);
if(x∈VT)
{
if(x==a)将下一输入符号读入a;
elseerror(3);
}
else
if(M[x,a]=“x→y1y2…yk”)
{
按逆序依次把yk、yk−1、…、y1压入栈中;
输出“x→y1y2…yk”;
}
elseif afollow(x)error(1);else error(2);
//在前述的数据定义中查表为-1表示afollow(x)
Pop_SeqStack(s);
}
else if(errornum==2)
printf("第二种错误,跳过%c\n",x);
else
{
if(x='#')
{
printf("第三种错误,弹出栈顶元素\n");
Pop_SeqStack(s);
}
else
{
printf("第三种错误,指针下移弹出栈顶元素\n");
printf("栈满,不能入栈!");//return 0;
else
{
s->top++;
s->data[s->top]=x;
//return 1;
}
}
char Pop_SeqStack(SeqStack *s)//出栈
{
if(s->top==-1)
{
printf("栈空,不可出栈!");// return 0;
3,-1,-2,3,-1,-1,0,0,0,0,0,
-2,5, 4,-2,5, 5,0,0,0,0,0,
7,-1,-1,6,-1,-1,0,0,0,0,0};
//预测分析表,-2表示出错不属于终结符的follow集合,-1表示该行终结符的follow集合,用于错误处理,正数表示产生式在数组Fa中的编号,右部五列0表示多余的列。
Char Pa[15][10]={"E->TM","M->+TM","M->TM","M->空","T->FN","N->空","N->*FN","F->/FN","F->%FN","F->(E)","F->id","F->num"};
int analysis_table[10][11]={{-1,-1,-1,-1,-1,1,-2,1,1,-1,0},
printf("栈顶元素\t\t当前单词记号\t\t动作\n");
printf("=============================================================\n");
do
{
x=Top_SeqStack(s);
if(x=='#')
goto loop;
else
//产生式表:0:E->TE' 1:E'->+TE' 2:E'->空
// 3:T->FT' 4:T'->*FT' 5:T'->空6:F->(E) 7:F->id
intanalysis_table[10][11]={0,-2,-2,0,-1,-1,0,0,0,0,0,
-2,1,-2,-2,2,2,0,0,0,0,0,
}
int BufVT(char s) //接收终结符并保存在VT[]数组中
{
int i=0;
while(i<15&&s!='\n')
{
if(VT[i][0]==s)
return 1;
else
i++;
}
return 0;
}
int BufVN(char s) //接收非终结符并保存在VN[]数组中
{
int i=0;
构造终结符数组:char Vt[10][5]={“id”,”+”……};
构造非终结符数组:char Vn[10]={};
构造follow集数组:char *follow[10][10]={ } (可将follow集与预测分析表合并存放)
数据构造示例(使用的预测分析表构造方法1):
/*data1.h简单算术表达式数据*/
typedef struct //定义栈
{
DataType data[MAXSIZE];
int top;
}SeqStack;
SeqStack *s;
int sign=0;
int num1,num2,num3;
char VN[10][5]={"E","M","T","N","F"};//非终结符表
int length_vn=5;//非终结符个数
}while(x!=“#”)
三.实验要求
给定算术表达式文法,编写程序。
测试数据:
1.算术表达式文法
E→TE’
E’→ +TE’|- TE’|ε
T→FT’
T’→*FT’|/ FT’|%FT’|ε
F→(E) |id|num
给定一符合该文法的句子,如id+id*id$,或输入二元式序列(词法分析的结果,预测分析程序只用到二元式中的第一个元的值):(id,0)(+,-)(id,1)(*,-)(id,2),运行预测分析程序,给出分析过程和每一步的分析结果。
{
//SeqStack *s;
s=new SeqStack;
if(!s)
{
printf("空间不足\n");