自下而上语法分析习题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 有许多优先关系表不存在优先函数,如:
a b a b
不存在对应的优先函数f和g 假定存在f和g,则有 f(a)=g(a),f(a)>g(b), f(b)=g(a),f(b)=g(b) 导致如下矛盾: f(a) > g(b) = f(b) = g(a) = f(a) 如果优先函数存在,则不唯一(无穷多)
S ( 2)指出(((a,a),^,(a)),a)的规范归约及每一步的句柄。 T )
T
句型
(((a,a),^,(a)),a)
,
S
a
句柄 归约规则
a S a T,S (T) S S→a T→S S→a T→T , S S→(T) T→S S→^ T→T , S
((T,(a)),a) ((T,(S)),a)
• 第一个关系可从函数的构造直接获得。因 为,若a b,则既有从fa到gb的弧,又有 从gb到fa的弧。所以,fa和gb所能到达的结 是全同的。 • 至于a b和a b的情形,只须证明其一。
• 如果a b,则有从fa到gb的弧。也就是,gb能 到达的任何结fa也能到达。因此,f(a) g(b)。
输入串(a,(a,a))的算符优先过程。
栈 # #( #(a #(t #(t, #(t,( #(t,(a #(t,(t #(t,(t, #(t,(t,a #(t,(t,s #(t,(t #(t,(t) #(t,s # (t # (t ) # s success
输入字符串 (a,(a,a))# a, (a,a))# , (a,a))# , (a,a))# (a,a))# a,a))# ,a))# ,a))# a))# ))# ))# ))# )# )# )# # #
练习
1、令文法G1为: + E→E+T | T T E T→T*F | F T * F→(E) | i 证明E+T*F是它的一个句型,指出这个句型的所有 短语、直接短语和句柄。
T*F是句型E+T*F相对于T的短语
E
F
E+T*F句型E+T*F相对于E的短语
T*F是句型E+T*F相对于T的直接短语
T*F是句柄
3 检查所构造出来的函数f和g是否与原来的关系矛盾。 若没有矛盾,则f和g就是要求的优先函数,若有矛 盾,则不存在优先函数。
1 对于每个终结符a,令其对应两个符号 fa和ga,画一以所有符号和为结点的方向 图。如果a b,则从fa画一条弧至gb, 如果a b,则画一条弧从gb至fa 。
• 现在必须证明:若a b,则f(a)=g(b);若a b,则f(a)< g(b);若a b,则f(a)> g(b)。
动作 预备 进 进 归 进 进 进 归 进 进 归 归 进 归 归 进 归
优先函数
• 把每个终结符与两个自然数f()与g()相对 应,使得
若 1 2,则f(1) < g(2) 若 1 2,则f(1) = g(2) 若 1 2,则f(1) > g(2) f称为入栈优先函数,g称为比较优先函数。
第五章
自下而上语法分析方法 习题课
本章要求
1.掌握自下而上分析的基本思想,基本概念 2.掌握算符优先文法、算符优先关系的判定 3.掌握最左素短语、句柄的定义与判定 4.掌握求FirstVT集,LastVT集,学会构造算符优先 关系表,能用算符优先分析法进行表达式分析
问题的提出:
① 在构造语法树的过程中,何时归约? 当可归约串出现在栈顶时就进行归约。 ② 如何知道在栈顶符号串中已经形成可归约串?
E
E + T
T T * F F i2 F i3
i1 句型i1*i2+i3的语法树如图: 从语法树可以看出: ET | E+T i1, i2, i3, i1*i2, i1*i2+i3是句型i1*i2+i3的短语 TF | T*F 直接短语有:i1, i2 , i3 Fi | (E) 句柄是: i1
• 上述例子中句子abbcde的规范归约过程是: abbcde, aAbcde, aAcde, aAcBe,S
练习
• 使用下述文法对句型i1*i2+i3进行规范规约:
i1*i2+i3 , F*i2+i3 , T*i2+i3, T*F+i3 , T + i3 , E+i3 , E + F, E+T, E
符号栈
句柄 归约规则
a S S→a T→S
输入串:
S T , ) S a )
T S
) a T S S ^ ) ( , T S a ) , T S ( ) , T S ( ( T T S T , ) S a
(
T , S ^ (
T
,
S
T S a )
a
T,S (T) S
S→a
T→T , S S→(T)
T→S
(T)
(
T
S→(T)
) S T )
T T,S ,T
S
, T→T ,S S S→(T ( ) ^
T→S S→a T→T , S S→(T)
S
a
( T
S a
(T,a) (T,S) (T) S
T
)
a
T,S
^
T,S
,
S
a
(T)
根据这个规范规约,给出“移进—归约”的过程, ( ( ( ( a , a ) , ^ , ( a ) ) , a )# 并给出它的语法Βιβλιοθήκη Baidu的自下而上的构造过程。
• 如果优先函数存在,则可以通过以下三个步骤从优先 表构造优先函数:
1 对于每个终结符a,令其对应两个符号fa和ga,画 一以所有符号和为结点的方向图。如果a b,则 从fa画一条弧至gb,如果a b,则画一条弧从gb至 fa 。
2 对每个结点都赋予一个数,此数等于从该结点出发 所能到达的结点(包括出发点自身)。赋给fa的数作 为f(a),赋给ga的数作为g(a)。
^ ) (( )) # Sa →(T . , 1、文法是算术文法,且不含ε . . . S →(T) LASTVT(T)﹥ > > > .) 产生式。 . FIRSTVT(T) Sa→(T) ( ﹤ . . . ) , ∧﹥ .),) ﹥ .) , , ﹥ . a﹥ ) > >. .,(﹤ . 2、由优先关系矩阵可知,任何 ^ ﹤ ( . a, ( ﹤ ∧ ( , ( .> , ﹤
• 优点:便于比较,节省空间; • 缺点:原来不存在优先关系的两个终结符,由 于自然数相对应,变成可以比较的。要进行 一些特殊的判断。
• 文法G(E) (1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i 的优先函数如下表
+ * ↑ ( ) i # F 2 4 4 0 6 6 0 G 1 3 5 5 0 5 0
. ( T, <. S <. , <. . FIRSTVT(S) = <. T→ ﹤ . .a , , .∧,.>, , (. . > > ) ﹤ ﹤ ﹤
两个终结符之间的优先关系不多 T → T,S LASTVT(T) ﹥ ., 于一种。 .,, ) ﹥ .,, , ﹥ a﹥ , . ,, ∧ ﹥ . . 综上,该文法是算术优先文法。 , 对待特殊地 <. <. #,把它看作句型的开始和结束符 <. .> > .根据#S#同理可得 . . . . . #,∧ ﹥ .# , ) ﹥ # <. # . < <# = .# , .∧ , # ﹤ a﹥ #. a,#﹤ (, ﹤
a S
S
S→a
T→S
(((S,a),^,(a)),a)
(((T,a),^,(a)),a) (((T,S),^,(a)),a) (((T),^,(a)),a) ((S,^,(a)),a) ((T,^,(a)),a) ((T,S,(a)),a)
((T,(T)),a) ((T, S),a)
((T),a) T (S,a)S
(a,(a,a))的最右推导: S (T) (T,S) (T,(T)) (T,(T,S)) (T,(T,a)) (T,(S,a)) (T,(a,a)) (S,(a,a)) (a,(a,a)) (((a,a),^,(a)),a)的最右推导: S (T) (T,S) (S,S) (S,a) ((T),a) ((T,S,S),S) ((S,S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),^,S),S) (((a,a),^,a),S) (((a,a),^,a),a)
E E + T T T * F i1 F
ET | E+T
TF | T*F
F
i3
Fi | (E)
i2
2、考虑下面的表格结构文法G2: S→a | ^ | (T) T →T,S | S (1)给出(a,(a,a))和(((a,a),^,(a)),a)的最左和最右推导。 (a,(a,a))的最左推导: S (T) (T,S) (S,S) (a,S) (a,(T)) (a,(T,S)) (a,(S,S)) (a,(a,S)) (a,(a,a)) (((a,a),^,(a)),a)的最左推导: S (T) (T,S) (S,S) ((T),S) ((T,S),S) ((T,S,S),S) ((S,S,S),S) (((T,S),S,S),S) (((S,S),S,S),S) (((a,S),S,S),S) (((a,a),S,S),S) (((a,a),^,S),S) (((a,a),^,a),S) (((a,a),^,a),a)
规范归约的定义:
• 假定α是文法G的一个句子,如果序列: αn, αn-1, ……,α0 (=S)满足如下条件,则序列αn, αn-1, ……, α0是一个规范 归约: (1) αn =α 是给定的句子 (2) α0 =S 是文法的开始符号 (3) 对任何i, 0<in,αi-1是从αi经把句柄替换为相应文 法产生式的左部符号而得到的。 • 规范归约是最右推导的逆过程,规范归约又称为最左 归约。
如何进行归约?
通过不同的自底向上的分析算法来解释,不同 的算法对可归约串的定义是不同的,但分析过程 都有一个共同的特点:边移进边归约。
规范归约:使用句柄来定义可归约串。
算符优先:使用最左素短语来定义可归约串
规范归约的概念
* • 有文法G,开始符号为S, 如果有S=>xβ y,则xβ y 是文法G的句型,x,y是任意的符号串 * + • 如果有S=>xAy, 且有A=>β ,则β 是句型xβ y相对 于非终结符A的短语 * • 如果有S=>xAy, 且有A->β ,则β 是句型xβ y相对 于A->β 的直接短语 • 位于一个句型最左边的直接短语称为句柄. 注意: 每次归约的部分必须是句柄 (最右推导)。 关键的问题是如何识别句柄
例:考虑如下文法: 求句型 i1 * i2 + i3 的短语、 直接短语和句柄。
ET | E+T
TF | T*F Fi | (E)
从语法分析树来识别: • 一棵子树是由树的某个结点连同 它的所有子孙组成的。 • 子树的所有端末结点自左至右排 列成一个相对子树根的短语。 • 直接短语:只有父子两代结点形 成的短语。 • 句柄:最左子树的直接短语。
练 习
2 对下述文法,求句型 E+T * F + i的短语、直接短语、句柄
ET | E+T
TF | T*F Fi | (E) 短语有:i, T * F, E+T * F, E + T * F + i T * F E E + T E + T F
i
直接短语有: i, T * F
句柄是:T * F
• 最右推导又称规范推导,由规范推导所得到的句型称 规范句型,规范推导的逆过程是规范归约。
句型
归约规则
abbcde aAbcde aAcde aAcBe S
(2) Ab (3) A Ab (4) B d (1) S aAcBe
(1)S aAcBe (2)A b (3)A Ab (4)B d
S→^ T→T , S
^
T,S
S (
S
a
#
3、(1)计算练习2文法G2的FIRSTVT和LASTVT。 G2: S→a | ^ | (T) T →T,S | S FIRSTVT(S)={ a, ∧,( } LASTVT(S)={a, ∧,)}
FIRSTVT(T)={, , a, ∧,(}
LASTVT(T)={, , a, ∧,)}