编译原理(五)语法分析

语法分析

一、语言与文法

  1. 程序设计语言与自然语言有一个重要的区别,程序设计语言需要把语言的三个基本要素设计出来:语法、语义、语用;但是在自然语言叙述的时候只需要通话双方可以相互理解即可。
    (程序设计语言必须清晰)
  2. 那么为什么要定义文法呢?为什么没有直接讨论语法?
    语法的形式化表达方式——文法,在程序设计中需要将语言使用形式化的方式来表达,用程序解决问题的时候需要使用比较规范的形式描述出来才容易实现。(目的就是清楚的描述问题)
    也就是说文法是语法的一种载体,通过文法的规则来描述实际上的语法
    通俗说法就是把类似主谓宾定状补的规则转化为程序可以直接表示的内容。
    在这里插入图片描述
    文法相当于在词法分析器中的DFA和NFA,可以通过构造出一个语法分析器来检查输入的字符串是否满足相应的语法规则。

二、文法的表示形式

2.1 巴克斯范式BNF(实际上不使用)

在这里插入图片描述
定义了一个赋值语句的形式,变量 赋值号 表达式,这种形式还可以继续定义,这里只是几条规则,定义一个文法应该是规则的集合

2.2上下文无关文法(实际使用方法)

在这里插入图片描述
实际采用的文法规则,和上面的BNF是等价的
在这里插入图片描述


终极符和非终极符
  1. 终极符和非终极符的理解
非终极符:可以进行继续推导产生非终极符或终极符或二者的组合的串,可以理解为尚能继续分解成更小元素的串
终极符:最小的不可再分的串

⚠️开始的元素必须来自非终极符集合

  1. 终极符和非终极符的出现位置
    VT终极符集合,只能出现在规则的右部(不能继续推导)
    VN非终极符集合,在语法规则中出现在规则的左部,也可以出现在右部

在这里插入图片描述
例子:

如果把N看成是开始符,则有:
N->ND(N->ND)
 ->N0(D->0)
 ->D0(N->D)
 ->80(D->8终止)
 这样利用上面P中的规则对N进行处理的到的最终全部状态都是终极符中的串即终止运行

基本概念

在这里插入图片描述
直接推导就是直接一个表达式就可以解决的问题。
+:一步或者多步/ *:零步或多步
在这里插入图片描述

  • 从开始符开始推导出来的所有串都是该文法的句型,一个串里面可以有非终极符也可以有终极符。
  • 句子一定是从开始符推导出来的,但是如果是句子其中就只能含有终极符,不能再继续推导。

⚠️从词法分析中生成的token都是终极符,非终极符是文法再生成的,语言即符合文法规则的句子集合

三、基本概念与高级语言语法

  1. 每一种高级程序设计语言都有自己的语法
  2. 符合高级语言文法的程序就是该语法的句子
  3. 所有程序组成的集合就构成了语言

所谓的句子就是用户写的程序,即每个人写的程序,如果符合文法的话就应该是文法的一个句子。
在这里插入图片描述
每一个<>中的内容都可以就行向下定义,一直定义到终极符的级别。


3.1验证程序是不是语法的句子

在这里插入图片描述
使用右部替换左部称为推导,使用左部替换右部称为归约。
⚠️剪枝的方法是经常使用的!

为了进行自底向上的语法分析给出的定义,必须找出规则的右部,然后使用规则的左部去替换,但是一个串中出现了一个规则的右部不一定可以直接使用左部来进行替换

为了使用自底向上的方法引出的相关概念:

在这里插入图片描述
相关概念理解:

  1. 短语的概念建立在句型之上(同一个字符串,如果句型变了,之前是短语可能后来就不是了)在一个句型里面,我们要找出一个串β,它是由前面的某一个非终极符推导出来的串,则这个串就可以叫做当前句型的短语(就是由某一个非终极符推导出来的)。
  2. 简单短语直接推导一次得到,短语>=1次。
  3. 句柄属于特殊的简单短语,在句型中短语可能有多个,最左边的这个就称作是句柄(⚠️句柄是简单短语)。

句柄存在的背景:一个句型中可能有大量的简单短语,我们程序处理一个串不会到中间去截取,我们都是从左到右的扫描,我们从左往右扫找到第一个简单短语就进行归约,然后再找,所以说这种情形通常是为了处理的方便,从最左边找,找第一个

  1. 找句柄的相关问题
    a/ 找句柄归约实际上是最右推导的逆过程。在一个句型中,任何一个简单短语都可以规约成非终极符,找到β就可以把它归约成非终极符。
    b/给出了这个分析,实际上自底向上的语法分析方法就是一个找句柄的方法,不同的语法分析方法就是找句柄的方法不同,你给出一个新的找句柄的方法就是给了一个新的语法分析方法。
二义性
E->E+T|E*T|T
如果这样写在计算E+E*T的时候先计算乘法和加法都是可以的,出现歧义
涉及到运算的优先级和结合度的问题
如果按照下面的方法写文法规则的话,暗含了先计算乘法,因为乘法的T是需要先解出再带入到上面的E->E+T|T中的。

在这里插入图片描述

分析步骤:
1. 首先从开始符E开始
2. 利用所给的所有规则,先熟悉所给的可能是文法的句型的串,看用现有的规则如何从外向内,或者从内向外构造可以尽可能的构造出当前想要判断是否是文法的句型的串

从开始符出发进行推导的过程:
在这里插入图片描述
在这里插入图片描述

3.2 基本概念

  1. 程序设计语言的语法中有递归是必然的,因为如果没有递归的话,句子的集合是一个有限的集合,而实际上一个语言的程序是无穷多的,主要是靠递归的形式控制的,但是递归程序一定有一个递归出口。
  2. 给出右递归是因为有的时候需要把一些左递归消除,但是不可能把递归彻底消除(不同于递归和循环的转换,而是使用两种递归的结合是把原来的式子变成不是左递归的形式)
    在这里插入图片描述

相关解释:

  1. 带有“直接”字样的都是使用一步推导可以得到的
  2. 递归就是推导出来句子还含有左部的内容
    在这里插入图片描述

相关解释:

  1. 注意对于句型和句子的区分,句子必须是终止符
  2. 关于推导,在自底向上的方法中,按照句柄的方式处理是比较好的,都是归约的过程,推导的时候也有同样的问题,一个句型中可能有很多的非终止符,那么下一步推导的过程中就有一个选择的问题,选择哪一个终止符进行下一步推导,先推导谁后推导谁。
  3. 最右推导也叫规范推导,最右推导也是找句柄的语法分析方法的逆过程。在这里插入图片描述
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值