符号就是字符对吗? 答案是错误的,比如 if while for else等关键字。
关于编译原理 语法树 句柄 简单短语 短语 的区分,通过两个例子来理解概念以及方法:
例子1——语法树
S -> a|b|(T)
T -> TdS|S
Vt={a,b,d,(,)}.Vn={S,T},S是开始符
句型(Sd(T)db)是S的一个推导,其中___是句柄;____是最左素短语;____是该句型的直接短语,_____是短语。
素短语的概念:它是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语的短语。而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNb…NcNdN(N是非终结符,a,b,c,d是终结符)
实例:句型T+T*F+id,求出其语法树,可知,T*F是最左素短语,id也是素短语,但不是最左的。解析:
题目中的句型可用下面的语法树表示:
S
/ |
(
T
)
/
|
T
d
S
/|
|
T
d S
b
|
/|
S
( T
)
设T是有根树,a是T中的一个顶点,由a以及a的所有后裔(后代)导出的子图称为有向树T的子树,a是子树的根。 [1] 具体来说,子树就是树的其中一个节点以及其下面的所有的节点所构成的树。
一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语,当子树中不包含其他更小的子树时(只含父子两代),该子数叶结点所组成的字符串就是该句型的直接(简单)短语。
因此本题的直接短语的为
S 、(T)、b,短语有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db)。
d不是直接短语,因为d所在的树还有子树所以它不是
!
素语是一个短语,它至少含有一个终结符,而且除它自身以外不再含有更少的素短语,对于句型(Sd(T)db)的素短语是(T)、b.
每个句型对应一棵语法树
每棵语法树的叶子结点从左到右排列构成一个句型
每棵语法树的子树的叶子结点从左到右排列构成一个短语
每棵语法树的简单子树(只有父子两层结点)的叶子结点从左到右排列构成一个简单(直接)短语
每棵语法树的最左简单子树(只有父子两层结点)的叶子结点从左到右排列构成句柄
素短语是至少包含一个终结符的短语,但它不能包含其它素短语
最左推导:在每个推导过程中,总是首先考虑对当前最左边的非终结符号进行推导
最右推导:在每个推导过程中,总是首先考虑对当前最右边的非终结符号进行推导
例子2——直接推导
已知文法G[S] S::=aB|bA A::=a|aS|bAA B::=aBB|bS|b 句型aabbAb的句柄是 A.a B.ab C.b D.bA
解析:
句型aabbAb的句柄是D: bA; S->aB->aaBB->aabSB->aabbAB->aabbAb 按照最左推导,其中的S->bA这步是最后的直接推导(即它推出的bA不再被继续往下推导),虽然B->b也是这样的,但不是最左的。
总结:
画语法树:
一个节点的所有子叶子节点从左到右相连即是该句型的短语当子树中不包含其他更小的子树时,该子数叶结点所组成的字符串就是该句型的直接(简单)短语——重点看该子叶子节点的兄弟节点。最左简单短语为句柄
按最左推导,最后的直接推导出的结果是简单短语,最左简单短语为句柄
句柄 简单短语 短语 素短语 都是取自句型的一部分