编译原理:语法树,短语,直接短语,句柄
1.已知文法:
S->a|^|(T)
T->T,S|S
分析句型(T,(^,a)),求全部的短语、直接短语和句柄。
解析:根据题意,语法树如下图:
全部短语:(T,(^,a)) T,(^,a) (^,a) ^,a ^ a
直接短语:^ a
句柄:^
2.构造上下文无关文法,描述语言:
{anbn|n>=0}
{ambn|m>=n>=0}
if语句
{(ab)n|n>=0}
{ambn|m,n>=1}
if语句
解析:
(1)G[S]:S -> aSb | ab | ε
(2)G[S]:S -> aSb | a | ε
(3)if语句 -> if<条件>then<语句> | if<条件>then<语句>else<语句>
(4)G[S]:S -> aSb | aaSbb | ... | (ab)n | ε
由S产生任意多个相同数量的a和b
(5)G[S]:S -> aS|Sb | a | ε
由S产生任意多个a和任意多个b,a和b的个数都大于1个
3.如果if语句的方法:
stmt->if expr then stmt
| if expr then stmt else stmt
| other
其中other代表语言中其他语句。
a)证明该文法是具有二义性的。
b)构造一个等价的无二义性文法,使得else与前面最近的没有匹配的then匹配。
c)基于该文法构造一个语法制导翻译模式,将条件语句翻译改成堆栈机代码。
句子if E1 then if E2 then S1 else S2是否有两棵不同的语法树?说明了什么?
a)二义性证明
根据文法:我们发现 if E1 then if E2 then S1 else S2 有2棵语法树(2个推导方法)如下所示:
b)等价无二义性文法构造,使else说最近未匹配的then相匹配