当前课程知识点:Compilers Techniques > 3 Syntax Analysis > 3.1 Context-free Grammars > 3.1.1 The Role of the Parser
返回《Compilers Techniques》慕课在线视频课程列表
返回《Compilers Techniques》慕课在线视频列表
各位同学大家好
欢迎大家来学习语法分析这一课
在这节课当中
我们主要来学习
语法分析器相关的内容
源程序
经过词法分析器分析之后
变成了一个一个的记号
那么这些词法分析器获取到的记号
会输送给语法分析器
语法分析器
用这些记号来构造分析树
那么在这一章
我们就重点来学习
语法分析器
是如何利用这些记号
来构建分析树的
我们在这一章
首先来学习上下无关文法
然后,我们利用上下无关文法
去构造语法分析树
那么包括自上而下分析
和自下而上分析两种分析方法
在这一章重点
我们是围绕语法分析器的
自动生成展开的
我们先来看一下
语法分析所做的工作
它将词法记号流
变成语法短语
也就是变成了一棵分析树
我们来对比一下
在中文当中
优秀的大工学子
它是形容词名词
这样的名词短语结构
那么在程序当中
我们写的 initial + rate * 60
我们把它进行词法分析之后
会得到 id + id * num
然后我们再看中文当中
形容词名词
我们会把它进一步解析
它是在句子当中
来作为宾语的
这个宾语是定语宾语这样的形式
定语是利用形容词来做定语
“优秀的”是做定语
那么名词是“大工学子”
这是一个名词的短语
回到我们的程序当中
其实它也是类似的
id+id*num
这是一个表达式
这个表达式是由两个表达式相加所组成的
第一个表达式
是一个标志符
我们识别出来
它是一个id
是 initial 组成的
第二个表达式
是另外两个表达式相乘得到的
也就是rate这个标志符乘以数字num 60
来组成第二个表达式
最终变成了一个大的表达式
那么表达式就是一个非终结符
也就是非叶子节点
而标志符数字 + * 这些都是终结符
我们再来看一下
语法分析的任务
字符组成了字符串
那么字符串
它会形成对应的词法记号
如何把字符串识别为对应的词法记号
我们在上一章当中
用到了词法分析器当中的
正规式去识别它
那么到了语法分析这一步
我们需要把记号
变成对应的表达式
表达式去组成语句一块
然后这个语句去组成程序块
程序块最终会组成整个程序
那么这一部分的解析
是用语法分析器来进行解析的
我们用到的是上下文无关文法
然后我们会把
记号、表达式、语句、程序块、程序
给它们组合起来
把它变成语法分析树
从而我们去判断一下
在语法上
是不是符合要求
那么语法分析
它的目标就是
我们把线性的词法记号流
组成一个有结构的语法树
那么实质就是将没有结构的数据
转换成有结构的数据
我们依据的就是上下无关文法
使用上下文无关文法
去描述我们程序当中的语法规则
所以在这一讲当中
我们首先来学习
上下文无关文法的定义
然后我们会学习推导的含义
会学习分析树是什么
还会说一下
分析树当中的二义性是怎么来的
如何去解决二义性
这一讲就介绍到这
谢谢大家
-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