【编译原理】第三章语法分析

简介: 【编译原理】第三章语法分析

语法分析

根据词法单元的构成规则,对源代码文件的字符流进行了词法分析,由词法单元的模式 → 正则表达式 → DFA → 词法


语法分析就是根据一个个单词,让它们组成逻辑关系,语言规约是上下文无关语法


要进行语法分析,输入的是词素流,类似于这样,这是之前词法分析得到的结果



如何进行语法分析?


先引入一个概念,文法


文法

算术表达式文法


我们都知道算术表达式是什么,就是一个式子,式子和式子之间也能构成新的式子。算术运算表达式文法的构成因此有:

① E →num

② E →id

③ E →F

④ E →( E )

⑤ E →E / E

⑥ E →E * E

⑦ E →E - E

⑧ E →E + E

E代表算术表达式,num和id就不用多说了,代表数字和变量




语句的文法


上面引入了算术表达式文法,程序有很多的语句构成,一条语句的文法包含什么语句?


① S →T id ( L ) { Q } 函数实现语句

② S →T L; 变量定义语句

③ S →L = E; 赋值语句

④ S →while ( B ) Q while语句

⑤ S →return E 函数返回语句

⑥ S →return; 函数返回语句


程序的文法

最核心的部分,说明的一个程序的文法构成,下面讲解的


① P →Q 程序有语句序列构成

② Q →Q S 语句序列可以由语句序列和单个语句构成

③ Q →S 一个语句序列也可以只有由单个语句

④ Q →{ Q } 语句序列可以由{}括起来

⑤ S →T id ( L ) { Q }

⑥ S →T L;

⑦ S →L = E;

⑧ S →while ( B ) Q

⑨ S →return E;


P代表程序,Q代表语句序列,S代表单个语句,T代表预定义符,B代表逻辑表达式,E代表算术表达式,还有V,L,F…


语法分析树

语法分析的目标是验证词素流是否符合语法规则


语法分析树,很好的表现了语法的构成逻辑以及之后处理的过程


已知语言的文法,给定一个词素串,判定它是否符合文法,符合的话,得出语法分析树


语法分析的方式有自顶向下的语法分析:最左推导,最右推导,还有自底向上的语法分析


下面是词法分析和语法分析的区别,加深理解

上下文无关文法

对词法分析后的源程序:输入串(符号串);验证输入串符合文法吗?


不符号的话,就说明源程序有语法错误;输入串:id + id


符合的话,推导出输入串的语法分析树


语法分析分类两种方式:


自顶向下的语法分析:最左推导,最右推导

自底向上的语法分析

算术表达式的上下文无关文法举例(带优先级)


开始符号:树根非终结符号:E, T,F

终结符号:+,*,(,),id

产生式:从左到右:推导,分析;

从右到左:规约,归纳;


基于文法的推导

从根往下,任用产生式,进行细化的过程,直至树的叶结点不含非终结符号,仅含终结符号


自顶向下的语法分析,最右推导,以id +id *id为例


推导是从输入串的最右端(即末尾)开始逐一来匹配:不切实际



自顶向下的语法分析,最左推导,以id +id *id为例


推导是从输入串的最左端(即起始)开始逐一来匹配:切合实际



推导后:树中的叶结点,从左至右,组成的符号串,叫句型;如果句型中不含非终结符号,自然只含终结符号,那么就叫句子


文法就是所有句子的集合


最后是文法和正则表达式比较,用正则表达式表达的,用文法都能表达,但是括号配对的语法,正则表达式无法表达;但是文法语法树中出现了很多非终结符,效率比正则表达式低


相关文章
|
Linux 数据安全/隐私保护 虚拟化
iOS 打包 IPA 教程
iOS 打包 IPA 教程
|
存储 Kubernetes Cloud Native
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度(一)
云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
1067 0
|
自然语言处理 前端开发 JavaScript
最好用的 8 款 React Datepicker 时间日期选择器测评推荐
React 时间日期选择器(date-timepicker)组件,与表单、富文本、表格、拖拽等组件一样,是大家用 React 搭建项目时使用最频繁的组件之一。React DateTimePicker 除了基础选择日期时间外,还有非常多样的功能配合不同场景使用,比如 12/24小时,禁止选择某些日期,高亮某些日期,夜间模式,多语言,酒店订单的特别场景等。本文记录了我自己使用多年最好用的 8 款 React DateTimePicker 组件,每一款都经过我实际测试,推荐给大家。
2326 0
最好用的 8 款 React Datepicker 时间日期选择器测评推荐
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
1596 1
|
编译器 C++
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
1324 0
Visual Studio 2022中创建的C++项目无法使用万能头<bits/stdc++.h>解决方案
|
运维 Kubernetes API
ElasticSearch容器化从0到1实践(一)
通过kubernetes集群聚合多个Elasticsearch集群碎片资源,提高运维效率。
|
Rust JavaScript 前端开发
我们都是调包侠
这篇内容讨论了从应用层到硬件层的编程工作,指出每个层次的程序员都是“调包侠”,即通过调用不同层次的接口来完成任务。应用层开发者使用高级语言控制设备,无需深入硬件细节。低级编程语言用于高性能需求,仍依赖操作系统。系统编程涉及硬件接口,需要了解硬件特性。硬件层面则涉及逻辑门电路设计与制造,需要考虑多种因素如性能、功耗和兼容性。文章强调各层次间的相互依赖,并提倡明确软件的局限性,选择细分方向,避免盲目跟风学习。
382 5
|
自然语言处理 安全 前端开发
Zenario CMS 9.2 文件上传(CVE-2022-23043)
Zenario CMS 9.2 文件上传(CVE-2022-23043)
|
机器学习/深度学习 监控 算法
开源计算机视觉库OpenCV详解
开源计算机视觉库OpenCV详解
|
开发者 iOS开发
no identity found Command CodeSign failed with a nonzero exit code
no identity found Command CodeSign failed with a nonzero exit code
855 0

热门文章

最新文章