2.5.1 推导和语法树
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 的短语,且为直接短语。
2.5.1 推导和语法树相关推荐
- 最左推导和最右推导,语法树,二义性文法
※最左推导和最右推导 (每一步替换最左边的非终结符/每一步替换最右边的非终结符),最右推导称为规范推导.最右推导对应于最左规约(规范规约) 例: 文法: S--->AB A--->a|t ...
- 编译原理——第二章-最左推导、最右推导以及语法树
**** 题目 令文法为E->T|E+T|E-T T->F|T*F|T/F F->(E)|i (1)给出i+i*i的最左推导和最右推导 (2)给出i+i*i的语法树 解题过程 最左推 ...
- js 数组 实现 完全树_JavaScript的工作原理:解析、抽象语法树(AST)+ 提升编译速度5个技巧
摘要: JS的"编译原理". 原文:JavaScript的工作原理:解析.抽象语法树(AST)+ 提升编译速度5个技巧 作者:前端小智 Fundebug经授权转载,版权归原作者所有 ...
- JavaScript 是如何工作的:解析、抽象语法树(AST)+ 提升编译速度5个技巧
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 14 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- 超级详细AST抽象语法树Javascript
AST 抽象语法树 Program 程序(开始) interface Program <: Node {type: "Program";body: [ Statement ] ...
- 从零写一个编译器(九):语义分析之构造抽象语法树(AST)
项目的完整代码在 C2j-Compiler 前言 在上一篇完成了符号表的构建,下一步就是输出抽象语法树(Abstract Syntax Tree,AST) 抽象语法树(abstract syntax ...
- 详解AST抽象语法树
浅谈 AST 先来看一下把一个简单的函数转换成AST之后的样子. // 简单函数 function square(n) {return n * n; }// 转换后的AST {type: " ...
- 编译原理(二)文法和语言、符号和符号串、文法的类型、语法树
要点: 符号和符号串的相关概念 文法和语言的形式定义 文法的类型 上下文无关文法及其语法树 上下文无关文法的句型分析 有关文法实用中的一些说明 目的: 掌握文法和语言的相关概念,为以后的词法分析.语法 ...
- 编译原理:语法树,短语,直接短语,句柄
1.已知文法: S->a|^|(T) T->T,S|S 分析句型(T,(^,a)),求全部的短语.直接短语和句柄. 解析:根据题意,语法树如下图: 全部短语:(T,(^,a)) T,(^, ...
最新文章
- ThinkPHP读取数据库数据到模板文件
- 你真的会用Android的Dialog吗?由一个Exception想到的
- html5毕业作品开场白,毕业典礼主持人开场白
- torch_geometric 笔记:global_mean_pool
- random java怎么用_java中Random使用步骤是怎样的?具体怎么做?
- Python知道cos值求角度_Python——画一棵漂亮的樱花树
- ant 构建_有用的Ant构建标签
- java语言中的 继承_Java语言有关继承的总结
- ASP.NET MVC的最佳日志记录库
- “小米都造车了,为什么华为不造?”华为轮值董事长亲自回应
- 华为手机从浏览器安装第三方软件签名不一致如何强制安装
- 某运动APP登录协议分析
- 如何利用炒股中的L2行情数据功能对比,以及用途数据分析。(附代码)
- 【R语言数据科学】(十二):有趣的概率学(上)
- ViewPager Indicator 自定义标题和指示器样式
- python里怎么使用snip_MacOS下好用的截图软件snip
- jQuery Promise 的用法
- python3中生成图片验证码和短信验证码的程序
- SPICE鼠标报点率降低问题分析
- redis实战读后感(五)-构建支持程序