语法分析器1--上下文无关文法

概述:在词法分析器生成已归类单词的流之后,语法分析器的任务是判断单词流表示的输入程序在程序设计语言中是否是一个有效的句子。从语法分析器的视角来看,输入的程序是一个单词流,其中各个单词都标注了语法范畴(词类)。

上下文无关文法(CFG)

理解:上下文无关文法G是一组规则,描述了语句是如何形成的。可以从G导出的语句集称问G定义的语言,记作L(G)。

        举例:SN语法:

        第一个规则(产生式),读作“SheepNoise可以推导出单词baa后接更多SheepNoise”。这SheepNoise是一个语法变量,表示可以从该语法推导出的符号串的集合。我们将此类语法变量称为非终结符(nonterminal symbol)。该语法定义的语言中,每个单词都是一个终结符。

        第二个规则读作“SheepNoise还可以推导出符号串baa”。

为在SN中推导一个语句,我们从包含一个符号SheepNoise的符号串开始。我们可以用规则1或规则
2重写SheepNoise。如果用规则2重写SheepNoise,符号串变为baa,就没有进一步重写的机会了。这个重写过程表明,baa是L(SN)中的一个有效语句。另一种选择是用规则1重写初始符号串,得出一个包含两个符号的符号串baa SheepNoise。这个符号串仍然有一个非终结符,用规则2重写该符号串将得到符号串baa baa,这是L(SN)中的一个语句。我们可以用表格形式表示这些推导。

上下文无关语法G是一个四元组(T,NT,S,P),各元素解释如下。

T:终结符或语言L(G)中单词的集合。

NT:是G的产生式中出现的非终结符的集合。

S:是一个非终结符,被指定为语法的目标符号或起始符号。

P:G中产生式或重写规则的集合。

最左/最右推导

最右推导:在每个步骤都重写最右侧的非终结符

最左推导:在每个步骤都重写最左侧的非终结符

两种推导的语法分析树是相同的。

二义性

        如果在某个语法中,一个语句存在多个最右(或最左)推导,则该语法称为二义性语法。一个二义性语法可以生成多个推导以及多个语法分析树。由于转换过程的后续阶段会将语义关联到语法分析树的细部形状,存在多个语法分析树意味着同一程序有多种可能的语义,对程序设计语言来说,这是一个不良性质。如果编译器无法肯定一个语句的语义,就无法将其转换为一个确定的代码序列。

        举例:if-then-else语法

从这个语法片段可以看出来,else是可选的。

上面的代码片段 有两种不同的最右推导,else可以为第一个或第二个规则。

为了消除二义性,必须修改该语法,引入一个新规则,来确定哪个if控制特定的else。将其重写:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值