编译原理:素短语、短语、直接短语、句柄的基本概念
素短语的概念:它是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语的短语。而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNb…NcNdN(N是非终结符,a,b,c,d是终结符)
实例:句型T+T*F+id,求出其语法树,可知,T*F是最左素短语,id也是素短语,但不是最左的。
短语和直接短语的概念:一个句型的语法树中任一子树叶结点所组成的符号串都是该句型的短语,当子树中不包含其他更小的子树时,该子数叶结点所组成的字符串就是该句型的直接(简单)短语。
句柄的概念**:**一个句型的最左直接短语汇称为该句型的句柄
例子1:
E->T|E+T
T->F|T\F*
F-> (E) | i
给出句型T\F+i的最右推导。*
1.首先通过最右推导(也叫规范推导):
E=>E+T=>E+F=>E+i=>T+i=>T\F+i*
2.画出语法树
E
/ | \
E + T
| |
T F
/ | \ |
T * F i
因此本题的直接短语的为 T*F、i,短语有T*F+i, T*F, i。句柄是T*F.
+号不是直接短语,因为+所在的树中那个E,T结点还推出来一颗子树,所以它不是。
例子2
S -> a|b|(T)
T -> TdS|S
题目中的句型可用下面的语法树表示:
S
/ | \
( T )
/ | \
Td S
/ | \|
T d Sb
|/ | \
S ( T )
因此本题的直接短语的为S 、(T)、b,短语有S、(T)、b、Sd(T)、Sd(T)db 、(Sd(T)db)。
d不是直接短语,因为d所在的树中那个T结点还推出来一颗子树,所以它不是。
素语是一个短语,它至少含有一个终结符,而且除它自身以外不再含有更少的素短语,对于句型(Sd(T)db)的素短语是(T)、b.
除了画语法树,还可以通过直接推导的结果,不过个人觉得很容易出错,我们还是画语法树吧。
收集了一些总结,方便查询。
每个句型对应一棵语法树
每棵语法树的叶子结点从左到右排列构成一个句型
每棵语法树的子树的叶子结点从左到右排列构成一个短语
每棵语法树的简单子树(只有父子两层结点)的叶子结点从左到右排列构成一个简单(直接)短语
每棵语法树的最左简单子树(只有父子两层结点)的叶子结点从左到右排列构成句柄
素短语是至少包含一个终结符的短语,但它不能包含其它素短语
最左推导:在每个推导过程中,总是首先考虑对当前最左边的非终结符号进行推导
最右推导:在每个推导过程中,总是首先考虑对当前最右边的非终结符号进行推导
嗯,今天的复习总结到这。
还没有评论,来说两句吧...