编译原理自顶向下语法分析
整理了一些知识点,比较零散,多以例题为主
自顶向下分析方法:
语法分析从顶部(树根、文法的开始符号)到底部(叶子、语言的终结符号)为输入的符号串建立分析树。
主旨:从文法的开始符号S出发,反复使用各种产生式,寻找”匹配”于输入符号串的推导(从S(根)出发,向下逐步建立语法树,最终:为输入串寻找一个最左推导)
自上而下分析面临的主要问题
1) 如何选择候选式:如果对文法不做任何限制,对候选式的选择成为无根据的,只好一一试探所有候选式,直至成功或失败。不断地回溯,大大影响速度。
2)左递归文法将使自上而下分析陷入无限循环.
因此,我们需要:
1)对文法加以一定的限制,使每次对候选式的选择是唯一的,从而进行确定的自上而下分析。
2)将左递归变为右递归(或迭代)
消除直接左递归方法:
A->Aα|β, α,β ∈ (VN∪VT)*, A ∈ VN, β不以A开头
则:A -> βA′
A ′->αA ′|ε
[例] 文法 E->E+T | T
T->T*F | F
F->(E) | a
消除左递归,得
E->TE’
E’->+TE’ | ε
T->FT’
T’->*FT’ |ε
F->(E) | a
消除间接左递归:
[例] G[S]: S ->Qc | c
Q ->Rb | b
R ->Sa | a
因 S ->Qc->Rbc->Sabc, 是左递归文法
代入法: S->(Rb | b)c | c
S->Rbc | bc | c
S->(Sa | a)bc | bc | c
所以 S->Sabc | abc | bc | c
消除左递归,得
S->abcS’ | bcS’ | cS’
S’->abcS’ | ε
LL(1)文法定义:
一个文法G是LL(1)文法,当且仅当对文法中形如 A->α1 | α2 | …| αn都满足LL(1)条件,即
(1) First(αi) ∩First(αj)=Φ, i≠j;
且如果αi ->* ε,则
(2) First(αj) ∩Follow(A)=Φ, i≠j
[例]: 给定文法 S→0S|1S|ε是否为 LL(1) 文法?
解:构造LL(1)分析表:
0 1 #
S S->0S S->1S S->ε
因为表中无多重定义, 所以该文法是 LL(1) 文法。
[例]左递归文法是LL(1)文法吗?
解: 因为左递归文法意味着有隐含的左公共因子,所以左递归文法不是LL(1)文法。
例如: A->Aa|b
因为:First(Aa}={b}, First(b)={b},
所以:First(Aa} -> First(b)= {b}
FOLLOW集的计算:
(1) 设S为G中开始符号,则#∈FOLLOW(S)
(2) 若A ->αBβ是一产生式,则把FIRST(β)的非空元素加入到FOLLOW(B)中。
如果β ->* ε,即有: A ->αB
则把FOLLOW(A)也加入到FOLLOW(B)中
(3) 反复使用(2),直到每个VN的FOLLOW集不再增大为止。
SELECT集的计算:
当α不能推出ε时: select( A→α) =First(α)
当α ->* ε时: select( A→α) =Follow(A) ∪ (First(α) –{ε})
[例] 判断G是否是LL(1)文法,如果是,构造LL(1)分析表G[S]
1. S ->AB|bC
2. A ->ε|b
3. B ->ε|aD
4. C ->AD|b
5. D ->aS|c
求First集、 Follow集:
FIRST FOLLOW
S b,a,ε # FOLLOW(S)={#} ∪ FOLLOW(D)
A b,ε #,a,c FOLLOW(A)=(FIRST(B)-{ε})∪ FOLLOW(S)∪ FIRST(D)
B a,ε # FOLLOW(B)=FOLLOW(S)
C b,a,c # FOLLOW(C)=FOLLOW(S)
D a,c # FOLLOW(D)=FOLLOW(B)∪FOLLOW(C)
select(S ->AB)={b,a,#}
select(S ->bC)={b}
select(A -> ε)=Follow(A)={#, a, c}
select(B -> ε) =Follow(B) ={#}
select(C ->AD)=First(AD)={b,a,c}
select(C ->b)={b}
故LL(1)表为:
编译原理自顶向下语法分析相关推荐
- 编译原理2-Bison语法分析
ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...
- 编译原理之语法分析(预测分析法)
编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...
- 编译原理之语法分析(自底向上)(包含源码)
编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...
- 编译原理 自顶向下分析
从顶部的根节点到底部的叶节点分析方法叫做自顶向下分析.我们知道顶部的根节点可以表示成一个文法的开始符号S,所以说,自顶向下分析可以看成是从文法的开始符号S推导出词串w的过程. 例如,我们以输入id + ...
- 编译原理——自上而下语法分析
自上而下分析面临的问题 回溯 (当候选有多个的时候,匹配失败会造成回溯) 文法左递归问题 那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中 LL1文法消除左递归 消除直 ...
- 编译原理词/语法分析
效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...
- 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf
// SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...
- 【编译原理】Python语法分析LL(1)、LR(1)
目录 一.实验目的 二.实验任务 三.实验原理 1 LL(1)文法 2 LR文法 四.实验过程 1 LL(1)文法 2 LR文法 五.实验结果 1 LL(1)文法 2 LR(0)文法 3 ...
- 读书笔记(II) 编译原理及实践
编译原理及实践 作者:Kenneth C.Louden 机械工业出版社 出版年:2000-3-1 综合评分:7.0 _________________________ 果然如网上流传的那样,翻译的真是 ...
- [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现
题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...
最新文章
- OKR不但是目标管理工具,也是沟通工具
- 人脸分割 人脸解析 源码推荐
- 【Python小脚本】实现王者农药自动刷金币啦~啦啦啦走跟我一起组队~
- C++ Opengl绘制3D源码
- 《c语言从入门到精通》看书笔记——第3章 数据类型
- python基础入门(3)之字符串
- jsp页面div上下滑动_H5单页面手势滑屏切换原理
- GaussDB数据dump实现完全同步
- flink其他可选api
- 机器学习基础(六十一)—— 范数及范数的微分
- 粉碎文件软件测试大乐,软件测试基础(面试)(27页)-原创力文档
- python 绘制堆积柱状图
- 如何查看谷歌卫星地图每级分辨率的两种方法
- 微信企业号开发接口文档
- vue 中动态添加组件方式
- Rust游戏数据查询、Rust服务器清档时间表
- 什么是云渲染?【云渲染和传统渲染农场的区别】
- Win10查看电脑上次的开机时间
- 服务器应用程序不可用的问题
- 刘韧:煮知识 论英雄
热门文章
- python统计字符个数然后变成字典_Python之String字符串练习一(统计字符串中单词出现个数并生成字典、打印下一秒钟时间、简单购物车功能)...
- html5 拾色器原理,HTML_html5 学习简单的拾色器 ,下面是源码 需要浏览器支持htm - phpStudy...
- 数据库:简述对数据库的认识
- ubuntu中火狐浏览器安装flash插件
- Bug Algorithms
- 鼠标macOS下定义快捷键(各品牌通用)
- 如何查看MacBook Pro硬盘序列号
- ubuntu16安装liteide
- 2022电大国家开放大学网上形考任务-工程数学(本)非免费(非答案)
- 数学-线性代数:线性代数