2.5.1 推导和语法树
1. 语法树的生成
对句型的推导过程给出一种图形表示,这种表示称为语法树,也称推导树。设文法G = ( V N , V T , P , S ),对 G 的任何句型都能构造与之关联的、满足下列条件的一棵语法树。
(1 )每个结点都有一个标记,此标记是 V = V N ∪ V T ∪ { ε }中的一个符号。
(2 )树根的标记是文法的开始符号 S 。
(3 )若某一结点至少有一个分支结点,则该结点上的标记一定是非终结符。
(4 )若 A 的结点有 k 个分支结点,其分支结点的标记分别为 A 1 , A 2 ,…, A k ,则 A →A 1 A 2 … A k 一定是 G 的一条规则。
下面用一个例子来说明根据句型的推导构造语法树的过程。
例如,设有文法 G [ E ]:
E → E + T | E - T | T
T → T * F | T / F | F
F → ( E ) | i
根据推导,画出句型(T + i ) * i - F 的语法树。
首先给出句型的推导过程(最右推导):
E ⇒ E - T ⇒ E - F ⇒ T - F ⇒ T * F - F ⇒ T * i - F
⇒ F * i - F ⇒ ( E ) * i - F ⇒ ( E + T ) * i - F
⇒ ( E + F ) * i - F ⇒ ( E + i ) * i - F
⇒ ( T + i ) * i - F
推导构造语法树的过程是:
以识别符号作为根结点,从它开始对每一步直接推导向下画一分支,分支结点的标记是直接推导中被替换的非终结符的名字,按此方法逐步向下,画出每一步直接推导对应的分支直到对该语法树再无分支可画出时,构造过程结束。构造句型(T + i ) * i - F 的语法树的过程,见图 2.2 。
语法树中从左到右的末端结点构成了由该语法树所表示的那个推导推出的符号串,如上例(T + i ) * i - F 。所谓末端结点,是指没有分支向下射出的结点,常称之为树叶。如果末端结点都是由终结符组成,则这些结点所组成的符号串为句子,否则为句型。
由上例可知,语法树的构造过程是从文法的开始符号出发,构造一个推导的过程,因为文法的每一个句型(句子)都存在一个推导,所以文法的每个句型(句子)都有一棵对应的语法树。
对句型(T + i ) * i - F ,还可给出最左推导:
E ⇒ E - T ⇒ T - T ⇒ T * F - T ⇒ F * F - T
⇒ ( E ) * F - T ⇒ ( E + T ) * F - T ⇒ ( T + T ) * F - T
⇒ ( T + F ) * F - T ⇒ ( T + i ) * F - T
⇒ ( T + i ) * i - T ⇒ ( T + i ) * i - F
不难看出,根据该推导得到的语法树,仍然是图 2.2 。可见对句型( T + i ) * i - F 的两种不同推导构造的语法树完全相同,也就是说,一棵语法树表示了一个句型的种种可能的(但未必是所有的)不同推导过程,包括最左(最右)推导。为方便找到句型短语和句柄,我们需引入子树和简单子树的概念。
2. 子树
语法树的子树是由某一非末端结点连同所有分支组成的部分。例如,图 2.3 是图 2.2 的子树。
3. 简单子树
语法树的简单子树是指只有单层分支的子树。例如,图 2.4 是图 2.2 的简单子树。
子树与短语的关系十分密切,根据子树的概念,句型的短语、直接短语和句柄的直观解释如下:
• 短语 ——— 子树的末端结点形成的符号串是相对于子树根的短语。
• 直接短语 ——— 简单子树的末端结点形成的符号串是相对于简单子树根的直接短语。
• 句柄 ——— 最左简单子树的末端结点形成的符号串是句柄。
例如,对前例文法 G [ E ],用语法树求句型( T + i ) * i - F 的短语、直接短语和句柄。
首先画出该句型的语法树,如图 2.2 所示,由语法树可知:
(T + i ) * i - F 为句型的相对于 E 的短语;
(T + i ) * i 为句型的相对于 T 的短语;
(T + i )为句型的相对于 F 的短语;
T + i 为句型的相对于 E 的短语;
T 为句型的相对于 E 的短语,且为直接短语;
第一个 i 为句型的相对于 F 的短语,且为直接短语;
第二个 i 为句型的相对于 F 的短语,且为直接短语;
F 为句型的相对于 T 的短语,且为直接短语;
在 4 个直接短语中, T 为句柄。
【例 2.14 】对例 2.13 中的文法,可用语法树非常直观地求出句型 baSb 的全部短语、直接短语和句柄。
分析 首先根据句型 baSb 的推导过程画出对应的语法树,见图 2.5 。
由语法树可知:
baSb 为句型的相对于 S 的短语;
ba 为句型的相对于 A 的短语;
a 为句型的相对于 B 的短语,且为直接短语和句柄;
Sb 为句型的相对于 B 的短语,且为直接短语。