- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章语法分析
第三章 语 法 分 析
每种程序设计语言都有描述程序语法结构的规则。例如,Pascal程序由程序块(又叫分程序)构成,程序块由语句组成,语句由表达式组成,表达式由记号组成等等。这些规则可以用上下文无关文法或BNF范式(Backus-Naur Form)描述。
编译器常用的文法分析方法有自上而下和自下而上两种。正如它们的名字所示,自上而下分析器建立分析树是从根结点到叶结点,而自下而上分析器恰好反过来。它们的共同点是从左向右地扫描输入,每次一个符号。
最有效的自上而下和自下而上的分析法都只能处理上下文无关文法的子类。这些子类足以描述程序设计语言的大多数语法结构,其中LL文法的分析器通常用手工实现,而LR文法的分析器通常利用自动工具构造。
本章致力于编译器采用的典型语法分析方法。我们首先提出有关上下文无关文法的基本概念,然后介绍适合于手工实现的预测分析技术,最后给出自动工具用的LR分析算法。由于程序员准备的代码经常会出现一些语法错误,因此我们还扩展所介绍的分析方法,使之能从常见的错误中恢复过来。
3.1 上下文无关文法
我们先看一下语法分析(简称分析)器在本书的编译器模型中位置,然后介绍上下文无关文法。如图3.1所示,分析器读取词法分析器提供的记号流,检查它是否能由源语言的文法产生,输出分析树的某种表示。另外,我们希望该分析器能以易理解的形式报告任何语法错误,并从错误中恢复过来,使后面的分析能继续进行下去。
事实上,还有一些其它任务可能在分析时完成,例如把各种记号的信息收入符号表,完成类型检查和其它的语义检查,并产生中间代码。所有这些都包罗在图3.1的“前端的其余部分”一框中,在下面三章将详细讨论它们。
3.1.1 上下文无关文法的定义
在第二章,我们用正规式来定义一些简单的语言,但是很多复杂一些的语言不能用正规式表达。例如,正规式不能用于描述配对或嵌套的结构,具体的例子有,由配对括号构成的串的集合不能用正规式描述,语句的嵌套结构也不能用正规式描述。还有,重复串也不能用正规式表示,例如,集合
{wcw | w是a和b的串}
不能用正规式描述。正规式只能表示给定结构的固定次数的重复或者没有指定次数的重复。
这一节,我们定义描述功能比正规式更强的上下文无关文法,介绍一些与分析有关的术语。
形式上说,一个上下文无关文法G是一个四元组(VT, VN, S, P),其中:
(1)VT 是一个非空有限集合,其元素称为终结符。在我们谈论程序设计语言的文法时,记号是终结符的同义词。
(2)VN 是一个非空有限集合,其元素称为非终结符,并有VT∩VN = (。在下面的例3.1中,expr和op是非终结符。非终结符定义终结符串的集合,它们用来帮助定义由文法决定的语言。非终结符还强加层次结构于语言,这种层次结构对语法分析和翻译是有用的。
(3)S是非终结符,称为开始符号,它定义的终结符串集就是文法定义的语言。
(4)P是产生式的有限集合,每个产生式的形式是A ( ((有时用::=代替箭头),其中A(VN ,(∈(VT ∪VN )*。开始符号至少出现在某个产生式的左部。产生式指出了终结符和非终结符组成串的方式。
例3.1 文法({id, +, *, (, (, )}, {expr, op}, expr, P)定义了有加、乘和一元减的算术表达式。P由下列产生式组成:
expr ( expr op expr
expr ( (expr)
expr ( ( expr
expr ( id
op ( +
op ( * (
为了表示上的简洁,在本书的剩余部分将采用下列约定来表示文法。
(1)下列符号是终结符:
(a)字母表前面的小写字母,如a,b,c;
(b)黑体串,如id或while;
(c)数字0, 1, …, 9;
(d)标点符号,如括号,逗号等;
(e)运算符号,如(,(等。
(2)下列符号是非终结符:
(a)字母表前面的大写字母,如A,B,C;
(b)字母S,并且它通常代表开始符号;
(c)小写字母的名字,如expr和stmt。
(3)字母表后面的大写字母,如X,Y和Z,代表文法符号,即非终结符或终结符。
(4)字母表后面的小写字母,主要是u, v, …, z,代表终结符号串。
(5)小写希腊字母,例如(,(和(,代表文法的符号串。
(6) 如果A ( (1, A ( (2, …, A ( (k是所有以A为左部的产生式(称它们为A产生式),则可以把它们写成A ((1 | (2 | …| (k的形式,称(1, (2, …, (k 是A的选择。
(7)有了上面的这些约定,我们可以直接用产生式集合代替四元组来描述文法。此时,第一个产生式左部的符号是文法开始符号。
例3.2 使用
原创力文档


文档评论(0)