当前课程知识点:Compilers Techniques > 3 Syntax Analysis > 3.4 Top-Down Parsing > 3.4.2 LL(1) Grammers
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学大家好
今天我们继续来学习语法分析
这节课我们来学习
语法分析中的LL1文法
LL1文法是在first集和follow集定义的基础上
加了两个条件
我们来看一下这两个条件
假设有两个产生式
A可以产生α或者β
对于LL1文法
它的要求有两点
first(α)和first(β)相交等于空
或者如果在β可以推导为空串的情况下
我们要求first(α)和follow(A)相交等于空
满足了这两点
我们可以知道
在进行自上而下推导的时候
可以顺利的决定
每一步是把A推导为α
还是把A推导为β
当然我们其实也可以观察到
LL1文法自然的 它包含一些明显的性质
比如说不包含公共左因子
它不是二义性的
肯定也不含有左递归
比如说
对于我们之前看到的这个例子
我们来判断一下
它到底是不是LL1文法
对于E产生式TE'
T产生式FT'
对于这两条产生式来说
它其实不涉及到LL1中
这两个条件的判定
所以我们重点需要判定的是
E'产生+TE'或者空串
T'产生 *FT'或者空串
对于F产生(E)或者id
很明显的
我们可以在任何一个情况知道
是将F推导为带左括号的产生式
还是将它推导为id
所以我们只需要判断这两个产生式
我们根据之前求出的
First集和follow集
可以看到
对于产生式 E产生+TE'
或者空串来说
由于E'可以推导为空串
所以我们其实需要判定
first(+TE')和follow(E')
相交是不是为空
那么first(+TE') 它的集合等于+
而follow(E')
我们之前求得的结果
等于右括号 ) 和$
所以它们俩相交是为空的
对于T'产生*FT'或者空串来说
我们仍然需要去判定
First(*FT')和follow(T')相交是不是为空
根据之前的结果
First(*FT')等于 *号
follow(T')
等于加+ ) $
所以它们相交为空
根据这两个产生式
我们可以判断出来
这个文法是LL1文法
接下来我们可以看到
如果我们再求出一个文法的
First集和follow集之后
假设它满足我们的要求
是LL1文法
那么我们就可以来进行
自上而下的预测分析
我们通过构造非递归的预测分析表
可以来进行构造语法树
分析一个串
是不是属于文法
我们看在进行自上而下分析的时候
其实是有两种分析方法
一种是递归下降的预测分析方法
一种是非递归的预测分析方法
稍后我们会学习
非递归的预测分析方法
我们需要去构造
非递归的预测分析表
然后再来进行非递归的预测分析
关于LL1文法的部分
我们就学习到
这一小节结束
谢谢大家
-1.1 Overview of Compilers Techniques
--Chapter 1 Overview of Compilers Techniques
--Overview of Compilers Techniques
-2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
--2.1 Lexical Tokens, Strings and Language
-2.2 Regular form
--2.2 Regular form
-2.3 Finite automata
--2.3 Finite automata
-2.4 DFA construction, Subset construction, Simpleset DFA
--2.4 DFA construction, Subset construction, Simpleset DFA
-2.5 Lex
--2.5 Lex
-3.1 Context-free Grammars
--3.1.1 The Role of the Parser
--3.1.2 The Formal Definition of a Context-free Grammar
-3.2 Writing a Grammar
--3.2.1 Elimination of Left Recursion
--3.2 Top-Down Parsing
-3.3 Languages and Grammars
--3.3 Language and Grammars
-3.4 Top-Down Parsing
--3.4.3 Recursive Descent Analysis
--3.4.4 Nonrecursive Descent Analysis
-3.5 Bottom-up Parsing
--Bottom-up Parsing
-3.6 LR Parsing
--3.6.6 Characteristics of LR Parsing
--3.6.7 Non Ambiguous and Not LR Context-Free Grammars
-4.1 Syntax-Directed Definitions
--4.1.2 Attribute Dependency Graphs and Ordering the Evaluation of Attributes
--Syntax-Directed Definitions
-4.2 Bottom-Up Calculation of S Attribute
--4.2.1 Bottom-Up Calculation of S-Attributed
-4.3 L-Attributed Definitions
--4.3.1 L-Attributed Definitions
--4.3.3 Design of Predictive Translator
--L-Attributed Definitions
-4.4 Bottom-Up Parsing of L-Attributed Translation
--4.4.1 Bottom-Up Parsing of L-Attributed Translation
--4.4.2 Simulate the Parsing of Inherited Properties
--Bottom-Up Parsing of L-Attributed Translation
-5.1 Overview
--Overview
-5.2 Global Stack Storage
-5.3 Calling Sequences
-5.4 Non Local Names
--5.4 Non Local Names and dynamic scope
--Non Local Name
-6.1 Overview of Intermediate Code Generation
--6.1 Overview of Intermediate Code Generation
-6.2 Declaration Statements
-7.1 Issues in the Design of Code Generator
--7.1 Issues in the Design of Code Generator
-7.2 Target Machine
--Target Machine
-7.3 Basic Blocks and Flow Graphs
--7.3 Basic Blocks and Flow Graphs
-7.4 A Simple Code Generator
-8.1 Demonstration of Compiler Framework based on Python
--8.1 Demonstration of Compiler Framework based on Python
-8.2 Basic
--8.2.4 SA
-8.3 SimpleJava