编译程序中词法分析阶段的主要任务是
- 把高级语言源程序变成单词字符串
- 删除多余的空格、回车、注释
- 指出源程序的错误
在文法的分类中,识别上下文相关文法的自动机是线性界限自动机LBA;识别2型文法的自动机是下推自动机PDA
在自下而上的语法分析方法中,LR分析方法中的核心问题是句柄识别问题,而在算符优先分析法中主要识别的是最左素短语。
在LL(1)分析法中,要求文法是LL(1)的,则必须解决的问题是消除左递归和避免回溯
LL(1)文法的算法执行过程
首先把’$’然后把文法开始符号推入栈; 把第一个输入符号读进b; FLAG = True; WHILE (FLAG){ 将栈顶符号上托出去并放在X中; IF X∈Vt THEN IF X=b THEN 把下一个输入符号读入b中 ELSE ERROR ELSE IF X=‘$’ THEN IF X = b THEN FLAG=FALSE ELSE ERROR ELSE IF [X,b]={X –> X1X2…XK} THEN 把XK,XK-1,...,X1一一推进栈 ELSE ERROR }
什么是编译程序?
把高级语言的源程序表示的算法翻译成等价的低级语言表示的翻译程序编译程序的逻辑结构是什么?
源程序-词法分析-语法分析-语义分析和中间代码生成-优化-目标代码的生成-目标代码
整个过程都设计到:各种信息表的管理和错误诊查处理对于文法G[E]:
E -> AB
A -> aAb|ab
B -> cBd|cd
请写出符号串aabbcd的规范规约序列- 句柄ab,规约aAbcd
- 句柄aAb,规约Acd
- 句柄cd,规约AB
- 句柄AB,规约E
文法 G[E]:
E → (F) | id+E | id
F → F,E | E
消除文法的左递归及提取公共左因子。- 消除左递归
E → (F) | id+E | id
F → EF’
F’ → ,EF’|ε - 提取公共因子
E → (F) | id+E | id 即 E→(F) | id(+E | ε)
E → (F)|idE’
E’ →+E | ε
- 消除左递归
若语言为 L(G)={ anbncm| n>0为奇数, m>0为偶数 },写出文法并指出文法的类别
S → AC
A → aaAbb|ab
C → cBc|cc2型上下文无关文法
若有文法G[S]:
S→ aAcB
A→ Ab| b
B→Be|d
给出句型 ab1b2cde 的短语、、直接短语、句柄、素短语和最左素短语
注:b1,b2分别表示左右两个b短语:b1,b1b2,d,de,ab1b2cde
直接短语:b1,d
句柄:b1
素短语:b1,d
最左素短语:b1文法的形式化定义
一个文法G是一个四元组(VT ,VN ,S, P),
其中:- VT 是一个非空有穷终结符号集合;
- VN 是一个非空有穷的非终结符号集合, 且VT∩VN =Φ
- S∈VN 开始符号。
- P是一个产生式的非空有穷集合,每个产生式的形式是A∈α,其中 A∈VN,α∈(VT∪VN)*开始符号S至少必须在某个产生式的左部出现一次
推导
令G=(VT ,VN ,S,P), 若A → γ∈P, 且α,β∈(VT∪VN)* 称αAβ直接推出αγβ,表示成αAβ⇒αγβ 同时也称 αγβ是αAβ的直接推导,或称αγβ 直接归约到αAβ
如果存在一个直接推导序列: α0⇒α1⇒α2⇒….⇒αn(n>0) 表示成 α0⇒* αn,称从α0到αn的长度为n的推导。若a0⇒*αn , 有 α0=αn或者 α0⇒+αn语言
设文法 G=(VT ,VN,S,P)。如果S ⇒*α,则称α是一个句型。
仅含终结符号的句型是一个句子。
语言 L(G)是 由文法G产生的所有句子所组成的集合:
L(G)={ α|S ⇒*α,且α∈VT*}最左素短语
设G是一个算符文法,β是句型δ关于A的短语(即有 S ⇒* αAδ且A ⇒+ β ),且β至少含有一个终结符号,并且除自身之外不再含有任何更小的带有终结符号的短语,则称β是句型αβδ关于A的素短语。所谓最左素短语是指处于句型最左边的那个素短语
给出如下文法G[E]的FirstVT和LastVT集合,并给出算法优先分析矩阵和句子-i∧i的分析过程
E → T | E*T
T → F | T∧F
F → i | -FFirstVT(E)={,^,i,-} LastVT(E)= {,^,i,-}
FirstVT(T)= {^,i,-} LastVT(T)= {^,i,-}
FirstVT(F)={i,-} LastVT(F)= {i,-}E*T LastVT(E) ⩺ * , * ⩹ FirstVT(T)
T^F LastVT(T) ⩺ ^ , ^ ⩹ FirstVT(F)
-F - ⩹ FirstVT(F)
有以下的文法G[S]:
S→AS|b
A→a- 为这个文法构造LR(0)项目的DFA(Go函数表示)。
- 构造LR(0)分析表。
- 显示分析栈和输入串aaab的LR(0)分析程序的动作
(0) S’ →S
(1) S→AS
(2) S→b
(3) A→aI0=closure({S’ →S })={ S’ → ●S , S→ ●AS , S→ ●b , A→ ●a}
I1=Go(I0,S)= { S’ →S● }
I2=Go(I0,A)= { S →A●S , S→ ●AS , S→ ●b , A→ ●a}
I3=Go(I0,b)= { S → b●}
I4=Go(I0,a)= { A → a●}
I5=Go(I2,S)= { S →AS● }
Go(I2,A) = I2
Go(I2,b) = I3
Go(I2,a) = I4给出下列语句的语义分析结果,以四元式形式给出
if (a > b && c < d || e < f) x = 3*x +1 else x = x - 1
(1) (j> , a , b , (3))
(2) (j , , ,(4))
(3) (j< , c , d , (6))
(4) (j< , e , f , (6))
(5) (j , , , (10))
(6) (* , 3 , x , T1)
(7) (+ , T1 , 1 , T2)
(8) (= , T2 , , x)
(9) (j , , , (12))
(10) (- , x , 1 , T3)
(11) (= , T3 , ,x)
(12)
编译原理小练习附带答案
猜你喜欢
转载自blog.csdn.net/Jane_96/article/details/80942973
今日推荐
周排行