编译原理 -实验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}。
《编译原理教程》课后习题答案第三章语法分析
第三章 语法分析 来消除左递归。由此,将产生式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→(T) | aS′ S′→+S | ε T→ST′ T′→,ST′| ε 改造后的文法已经是LL(1)文法,不带回溯的递归子程序如下: void match (token t)
{ if ( lookahead==t) lookahead=nexttoken; else error ( ); }
第三章 语法分析 void S ( ) {
第三章 语法分析 3.3 已知文法G[S]为S→aSb|Sb|b,试证明文法
G[S]为二义文法。 【 解 答】 由 文 法G[S] :S→aSb|Sb|b ,对 句 子
aabbbb可对应如图3-1所示的两棵语法树。
第三章 语法分析
S aSb aSb
Sb b
S Sb aSb aSb b
图3-1 句子aabbbb对应的两棵不同语法树
第三章 语法分析
求得:
FIRST(A)={a}
FIRST(A′)={a, ε }
FIRST(B)={d}
FIRST(B′)={b, ε }
对文法开始符号A,有FOLLOW(A)={#}。
由 A′→ABl 得 FIRST(B)\{ ε }FOLLOW(A) , 即 FOLLOW(A)={#,d};
第三章 语法分析 【解答】 (1) 消除左递归后,文法G[D′]如下:
D→TL T→int|long|short L→idL
《编译原理》考试试题及答案
《编译原理》考试试题及答案(附录)一、判断题:1.一个上下文无关文法的开始符,可以是终结符或非终结符。
( X )2.一个句型的直接短语是唯一的。
( X )3.已经证明文法的二义性是可判定的。
( X )4.每个基本块可用一个DAG表示。
(√)5.每个过程的活动记录的体积在编译时可静态确定。
(√)6.2型文法一定是3型文法。
( x )7.一个句型一定句子。
( X )8.算符优先分析法每次都是对句柄进行归约。
(应是最左素短语) ( X )9.采用三元式实现三地址代码时,不利于对中间代码进行优化。
(√)10.编译过程中,语法分析器的任务是分析单词是怎样构成的。
( x )11.一个优先表一定存在相应的优先函数。
( x )12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
( )13.递归下降分析法是一种自下而上分析法。
( )14.并不是每个文法都能改写成LL(1)文法。
( )15.每个基本块只有一个入口和一个出口。
( )16.一个LL(1)文法一定是无二义的。
( )17.逆波兰法表示的表达试亦称前缀式。
( )18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。
( )19.正规文法产生的语言都可以用上下文无关文法来描述。
( )20.一个优先表一定存在相应的优先函数。
( )21.3型文法一定是2型文法。
( )22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。
( )二、填空题:1.( 最右推导 )称为规范推导。
2.编译过程可分为(词法分析),(语法分析),(语义分析和中间代码生成),(代码优化)和(目标代码生成)五个阶段。
3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是()。
4.从功能上说,程序语言的语句大体可分为()语句和()语句两大类。
5.语法分析器的输入是(),其输出是()。
6.扫描器的任务是从()中识别出一个个()。
编译原理_LL(1)文法源代码(实验三)
一、实验目的及要求1.把握LL(1)分析法的大体原理;2.把握LL(1)分析表的构造方式;3.用LL(1)分析法分析高级语言表达式。
4、了解LL(1)分析器的工作进程。
文法:无二义性的算术表达式的文法(1)把词法分析作为语法分析的子程序实现(5分)(2)独立的语法分析程序(4分)(3)对表达式文法排除左递归、构造LL(1)分析表(4)LL(1)分析表能够直接输入(4分),也能够用程序实现(5分)(5)给一个表达式,给出分析进程(分析栈、输入串、所用规那么)(4分)(6)生成一个棵语法树(5分)用二叉树的形式表示出来二、实验内容及原理一、实验原理(1)、LL(1)文法的概念LL(1)分析法属于确信的自顶向下分析方式。
LL(1)的含义是:第一个L说明自顶向下分析是从左向右扫描输入串,第2个L说明分析进程中将利用最左推导,1说明只需向右看一个符号即可决定如何推导,即选择哪个产生式(规那么)进行推导。
LL(1)文法的判别需要依次计算FIRST集、FOLLOW集和SELLECT集,然后判定是不是为LL(1)文法,最后再进行句子分析。
需要预测分析器对所给句型进行识别。
即在LL(1)分析法中,每当在符号栈的栈顶显现非终极符时,要预测用哪个产生式的右部去替换该非终极符;当显现终结符时,判定其与剩余输入串的第一个字符是不是匹配,若是匹配,那么继续分析,不然报错。
LL(1)分析方式要求文法知足如下条件:关于任一非终极符A的两个不同产生式A→α,A→β,都要知足下面条件:SELECT(A→α)∩SELECT(A→β)=∅(2)、预测分析表构造LL(1)分析表的作用是对当前非终极符和输入符号确信应该选择用哪个产生式进行推导。
它的行对应文法的非终极符,列对应终极符,表中的值有两种:一是产生式的右部的字符串,一是null。
假设用M表示LL(1)分析表,那么M可表示如下:M: VN×VT→P∪{Error}M(A, t) = A→α,当t∈select(A→α) ,不然M(A, t) = Error其中P表示所有产生式的集合。
编译原理预测分析程序的实现
实验二预测分析表一、实验目的预测分析表的实现二、实验内容设有文法G:E→TE’E’→+TE’|εT→FT’T’→*FT’|εF→(E)|i;根据文法编写预测表分析总控程序,分析句子是否为该文法的句型。
当输入字符串:+i时,分析字符串是否为文法的句型三、实验步骤(详细的实验步骤)(1)文法E→TE’E’→+TE’|εT→FT’T’→*FT’|εF→(E)|i;(2)FIRST集FIRST(E)={(,i};FIRST(E’)={+, ε};FIRST(T)={(,i};FIRST(T’)={ *, ε};FIRST(F)={(,i};(3)FALLOW集FOLLOW(E)={),#};FOLLOW(E’)={),#};FOLLOW(T)={+,),#};FOLLOW(T’)={+,),#};FOLLOW(F)={*,+,),#};(4)预测分析表(5)分析过程步骤符号栈输入串应用句型0#E i1*i2+i3#1#E’T i1*i2+i3#E->TE’2#E’T’F i1*i2+i3#E->TE’3#E’T’i i1*i2+i3#F->i4# E’T’i1*i2+i3#5# E’T’F**i2+i3#T’->*FT’6# E’T’F*i2+i3#7# E’T’i i2+i3#F->i8# E’T’i2+i3#9#E’+i3#T’->ε10# E’T++i3#E’->+TE’11#E’T+i3#12# E’T’F i3#T->FT’13# E’T’i i3#F->i14# E’T’i3#15# E’#T’->ε16# #E’->ε(6)程序伪代码BEGIN首先把‘#’然后把文法开始符号推进STACK栈;把第一个输入符号读进a;FLAG:=TRUE;WHILE FLAG DOBEGIN把STACK栈顶符号托出去并放在X中;IF X属于VT THENIF X=a THEN 把下一输入符号读进a;ELSE ERROR;ELSE IF X=’#’ THENIF X=a THEN FLAG:=FALSE ELSE ERROR;ELSE IF M[A,a]={X->X1X2…Xk} THEN把Xk,X(k-1),…,X1一一推进栈ELSE ERROR;END OF WHILESTOPEND(7)运行结果截图注:为了将E和E’区分开,所以就有e来表示E’,因为在处理中E’会被当成两个字符来处理,所以就简化的表示了。
编译原理及实践教程(黄贤英 王柯柯 编著) 习题答案
第2章参考答案:1,2,3:解答:略!4. 解答:A:① B:③ C:① D:②5. 解答:用E表示<表达式>,T表示<项>,F表示<因子>,上述文法可以写为:E → T | E+TT → F | T*FF → (E) | i最左推导:E=>E+T=>E+T+T=>T+T+T=>F+T+T=>i+T+T=>i+F+T=>i+i+T=>i+i+F=>i+i+iE=>E+T=>T+T=>F+T=>i+T=>i+T*F=>i+F*F=>i+i*F=>i+i*i 最右推导:E=>E+T=>E+F=>E+i=>E+T+i=>E+F+i=>E+i+i=>T+i+i=>F+i+i=>i+i+iE=>E+T=>E+T*F=>E+T*i=>E+F*i=>E+i*i=>T+i*i=>F+i*i =>i+i*ii+i+i和i+i*i的语法树如下图所示。
i+i+i、i+i*i的语法树6. 解答:(1) 终结符号为:{or,and,not,(,),true,false}非终结符号为:{bexpr,bterm,bfactor}开始符号为:bexpr(2) 句子not(true or false)的语法树为:7. 解答:(1) 把a n b n c i分成a n b n和c i两部分,分别由两个非终结符号生成,因此,生成此文法的产生式为:S → ABA → aAb|abB → cB|ε(2) 令S为开始符号,产生的w中a的个数恰好比b多一个,令E为一个非终结符号,产生含相同个数的a和b的所有串,则产生式如下:S → aE|Ea|bSS|SbS|SSbE → aEbE|bEaE|ε(3) 设文法开始符号为S,产生的w中满足|a|≤|b|≤2|a|。
编译原理课程设计-LL(1)语法分析器的构造
LL(1)语法分析器的构造摘要语法分析的主要任务是接收词法分析程序识别出来的单词符由某种号串,判断它们是否语言的文法产生,即判断被识别的符号串是否为某语法部分。
一般语法分析常用自顶向下方法中的LL分析法,采用种方法时,语法分程序将按自左向右的顺序扫描输入的的符号串,并在此过程中产生一个句子的最左推导,即LL是指自左向右扫描,自左向右分析和匹配输入串。
经过分析,我们使用VC++作为前端开发工具,在分析语法成分时比较方便直观,更便于操作。
运行程序的同时不断修正改进程序,直至的到最优源程序。
关键字语法分析文法自顶向下分析 LL(1)分析最左推导AbstractGrammatical analysis of the main tasks was to receive lexical analysis procedure to identify the words from a website, string, and judge whether they have a grammar of the language, that is, judging by the series of symbols to identify whether a grammar part. General syntax analysis commonly used top-down methods of LL analysis, using methods, Grammar hours will be from the procedures of the order left-to-right scanning input string of symbols, and in the process produced one of the most left the sentence is derived, LL is scanned from left to right, From left to right analysis and matching input strings. After analysis, we use VC + + as a front-end development tool for the analysis of syntax ingredients more convenient visual, more easy to operate. Operational procedures at the same time constantly improving procedures, until the source of optimal .Key WordsGrammatical analysis grammar Top-down analysis LL (1) AnalysisMost left Derivation目录摘要 (1)引言 (3)第一章设计目的 (4)第二章设计的内容和要求 (5)2.1 设计内容 (5)2.2 设计要求 (5)2.3 设计实现的功能 (5)第三章设计任务的组织和分工 (6)3.1 小组的任务分工 (6)3.2 本人主要工作 (6)第四章系统设计 (9)4.1 总体设计 (9)4.2 详细设计 (9)第五章运行与测试结果 (22)5.1 一组测试数据 (22)5.2 界面实现情况 (23)第六章结论 (27)课程设计心得 (28)参考文献 (29)致谢 (30)附录(核心代码清单) (31)引言编译器的构造工具是根据用户输入的语言的文法,编译器的构造工具可以生成程序来处理以用户输入的文法书写的文本。
编译原理作业参考答案
T,
「,ST,
2.利用P76表的LL(1)分析表写出表达式(i + i)*i的预测分析过程。
步骤
符号栈
输入串
所用的产生式
0
#E
(i+i) *i#
1
#E' T
(i+i) *i#
E TE‘
编译程序:把输入的源程序翻译成等价的目标程序(汇编语言或机器语 言),
然后再执行目标程序(先编译后执行),执行翻译工作的程序称为编译程序。
解释程序:以该语言写的源程序作为输入,但不产生目标程序。按源 程序中语句动态顺序逐句的边解释边执行的过程,完成翻译工作的程序称 为解释程序。
2、什么叫“遍”
指对源程序或源程序的中间形式(如单词,中间代码)从头到尾扫描一 次,并作相应的加工处理,称为一遍。
优化:对中间代码进行优化处理。
目标代码生成:把中间代码翻译成目标语言程序。
4、编译程序与解释程序的区别
编译程序生成目标程序后,再执行目标程序;然而解释程序不生成目标 程序,边解释边执行。
5、有人认为编译程序的五个组成部分缺一不可,这种看法正确吗
编译程序的5个阶段中,词法分析,语法分析,语51分析和代码生成生 成是必须完成的。而中间代码生成和代码优化并不是必不可少的。优化的 目的是为了提高目标程序的质量,没有这一部分工作,仍然能够得到目标 代码。
(G)
={
(0 1
29)+)
或L
(G)
={
为数字串}
(2)
最左推导
:N
ND
DD
3D 34
N
ND
NDD
DDD 5DD 56D
568
最右推导
编译原理第四章答案
“编译技术”第四章作业4-1 已知文法G[C]:C→iEtS|iEtSeSE→ a|bS→ a+b|a*b(1)提取左公共因子;(2)计算修改后文法的每个非终结符的FIRST集和FOLLOW集;(3)给出递归下降分析程序。
(3)递归下降分析程序void match(token t){if(lookahead=='t')lookahead = nexttoken;else error;}void C(){if(lookahead=='i'){match('i');E();if(lookahead=='t'){match('t');S();Cprime();}else error;}else error;}void Cprime(){if(lookahead=='e'){match('e');S();}}void E(){if(lookahead=='a')match('a');else if(lookahead=='b')match('b');else error;}void S(){if(lookahead=='a'){match('a');Sprime();}}void Sprime(){if (lookahead=='+'){match('+');if(lookahed=='b'){match('b');}else error();}else if(lookahead=='*'){match('*');if(lookahead=='b'){match('b');}else error();}}4-2 已知文法G[Z]:Z→Az|bA→ Za|a(1)删除左递归;(2)计算修改后文法的每个非终结符的FIRST集和FOLLOW集;(3)给出递归下降分析程序。
预测分析实验报告
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char A[20];/*分析栈*/
char 'i','+','*','(',')','#'};/*终结符*/
char v2[20]={'E','G','T','S','F'};/*非终结符*/
g1.origin='G';
g1.array[0]='^';
g1.length=1;
s.origin='S';
strcpy(s.array,"*FS");
s.length=3;
s1.origin='S';
s1.array[0]='^';
s1.length=1;
f.origin='F';
strcpy(f.array,"(E)");
for(j=0;j<b;j++)/*输出对齐符*/
printf(" ");
for(j=b;j<=l;j++)
printf("%c",B[j]);
printf("\t\t\t");
}/*print1*/
int main()
{
int m,n,k=0,flag=0,finish=0;
编译原理第4章作业答案
第四章习题4.2.1:考虑上下文无关文法:S-〉SS+|SS*|a 以及串aa+a* (1)给出这个串的一个最左推导 S-> S S *-> S S + S * -> a S + S * -> a a + S * -aa +a(3)给出这个串的一棵语法分析树习题4.3.1:下面是一个只包含符号a 和b 的正则表达式的文法。
它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆:rexpr T rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b1)对这个文法提取公因子2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归4)得到的文法适用于自顶向下的语法分析吗? 解1)提取左公因子之后的文法变为rexpr —rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法rexpr->rtermrexpr'rexpr'->+rtermrexpr'l e rterm->rfactorrterm'rterm'->factorrterm'|erfactor->rprimayrfactor'fact or'-〉*rfactor'|erprimary->a|b4) 该文法无左递归,适合于自顶向下的语法分析习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。
可能要先对文法进行提取左公因子或消除左递归 (3)S-〉S(S)S|*(5)S->(L)|aL->L,S|S 解 (3)①消除该文法的左递归后得到文法S-〉S'S'-〉(S)SS'|*②计算FIRST 和FOLLOW 集合FIRST(S)={(,*}FOLLOW(S)={),$} FIRST(S')={(,*}FOLLOW(S')={),$}③构建预测分析表①消除该文法的左递归得到文法S-〉(L)|a L->SL' L'-〉,SL'|£②计算FIRST 与FOLLOW 集合FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST(L)={(,a}FOLLOW(L)={)} FIRST(L')={,,£}FOLLOW(L')={)}习题4.4.4计算练习4.2.2的文法的FIRST 和FOLLOW 集合3)S T S(S)S|5) S T (L)|a,L T L,S|S 解:3)FIRST(S)={£,(}FOLLOW(S)={(,),$} 5) FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST (L )={(,a}FOLLOW (L )={),,}习题4.6.2为练习4.2.1中的增广文法构造SLR 项集,计算这些项集的GOTO 函数,给出这个文法的语法分析表。
- 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");