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

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

语法分析

根据词法单元的构成规则,对源代码文件的字符流进行了词法分析,由词法单元的模式 → 正则表达式 → 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为例


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



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


文法就是所有句子的集合


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


相关文章
|
4月前
|
存储 自然语言处理 前端开发
编译原理 - 语义分析
编译原理 - 语义分析
82 1
|
4月前
|
自然语言处理 算法 前端开发
编译原理 - 词法分析
编译原理 - 词法分析
58 0
|
自然语言处理 C语言
编译原理实验-词法分析
编译原理实验C语言实现
98 0
|
自然语言处理 前端开发 算法
编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念
编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念
703 0
|
自然语言处理
【编译原理】第二章,词法分析
【编译原理】第二章,词法分析
|
4月前
|
算法 编译器 C语言
编译原理 - 语法分析
编译原理 - 语法分析
75 0
|
4月前
|
存储 自然语言处理 编译器
【编译原理】词法分析:C/C++实现
【编译原理】词法分析:C/C++实现
125 1
|
4月前
|
自然语言处理
【编译原理】词法分析
【编译原理】词法分析
47 0
|
自然语言处理 网络安全 C语言
|
自然语言处理 Java 编译器
【编译原理】第一章,什么是编译原理?
【编译原理】第一章,什么是编译原理?