当前课程知识点:Compilers Techniques > 3 Syntax Analysis > 3.4 Top-Down Parsing > 3.4.3 Recursive Descent Analysis
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学大家好
这节课
我们继续来学习语法分析部分
这节课我们主要来学习
自上而下分析方法中的递归下降分析方法
根据这个文法
我们可以将对应的文法改写为对应的程序
所有产生式的左部作为一个函数出现
产生式的右部作为程序的内容来出现
比如说对于第1个产生式
S可以产生BA
我们可以写出S对应的函数
S这个函数中
首先我们进行B的匹配
然后我们来匹配A
而B和A都是非终结符
每一个非终结符对应一个函数
所以S中包含两个函数
首先是B这个函数
然后是A这个函数
对于A可以产生BS或d
我们需要根据A的 first集合来进行决策
A这个函数中
首先我们需要去用if语句来进行判定
如果我们看到的是First(B)
也就是a b c这三个符号
那么 我们需要将A展开为BS
也就是 我们在看见a b c之后 将A展开为BS
对应的 也就是 B的函数和S的函数
如果接下来我们看到的是d
那么我们应该将A展开为d
所以if语句的else部分 我们需要去匹配d
针对B对应的产生式
我们仍然可以直接
将产生式写为对应的程序
首先我们用if语句进行判定
如果我们看到的是a 那么需要去匹配a
接下来 我们需要匹配的是A这个函数
否则 如果我们看到的是B 那应该将B推导为BS
所以我们匹配b 然后匹配S这个函数
否则的话 我们需要去匹配c这个符号
根据这个文法
我们其实观察到
每一次来写递归下降的分析程序
只需要根据本法的内容把它改写出来
我们再来看一个一般的递归下降程序
也就是在进行递归下降分析的时候
我们为每一个非终结符 写一个分析过程
这些过程可能是递归的
所以我们将它称为递归下降的分析程序
比如说有这样的一个文法
type可以产生simple 或者 ↑ id 或者array [simple] of type
simple可以产生整数 或者字符型的 或者是数字类型的
我们可以有一个辅助的过程,是match这个过程
如果我们看到了一个终结符t
那么 我们就可以去读取下一个符号
否则的话 出错
我们可以看到 对type来说
我们可以根据它的文法
直接将它的程序写出来
type这个函数
我们首先用if语句去看一下看到的是不是整数
如果 看到的是整数 或者是符号 或者是数字
我们就匹配simple类型
否则 如果我们看到一个向上的箭头 ↑
那么我们匹配向上的箭头 ↑
然后匹配id
否则如果我们看到的是数组array的话
我们就匹配数组
然后匹配左括号 然后匹配simple 再匹配右括号
然后我们再匹配of
然后我们再匹配type的类型
否则的话 就是一个出错的结果
我们看对于simple这个函数来说
同样根据它的文法来写出对应的程序
如果我们看到的是整型 我们就匹配整型
否则如果看到的是字符类型 匹配字符
如果看到的是数字类型
我们去匹配数字 匹配小数点 然后再匹配数字
如果看到的是其它类型
我们就会去进行报错
递归下降的分析程序
我们就学习到这 这一小节结束
谢谢大家
-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