第三章语法分析每种程序设计语言都有描述程序语法结构的规则
例如,Pascal程序由程序块(又叫分程序)构成,程序块由语句组成,语句由表达式组成,表达式由记号组成等等
这些规则可以用上下文无关文法或BNF范式(Backus-NaurForm)描述
编译器常用的文法分析方法有自上而下和自下而上两种
正如它们的名字所示,自上而下分析器建立分析树是从根结点到叶结点,而自下而上分析器恰好反过来
它们的共同点是从左向右地扫描输入,每次一个符号
最有效的自上而下和自下而上的分析法都只能处理上下文无关文法的子类
这些子类足以描述程序设计语言的大多数语法结构,其中LL文法的分析器通常用手工实现,而LR文法的分析器通常利用自动工具构造
本章致力于编译器采用的典型语法分析方法
我们首先提出有关上下文无关文法的基本概念,然后介绍适合于手工实现的预测分析技术,最后给出自动工具用的LR分析算法
由于程序员准备的代码经常会出现一些语法错误,因此我们还扩展所介绍的分析方法,使之能从常见的错误中恢复过来
1上下文无关文法我们先看一下语法分析(简称分析)器在本书的编译器模型中位置,然后介绍上下文无关文法
1所示,分析器读取词法分析器提供的记号流,检查它是否能由源语言的文法产生,输出分析树的某种表示
另外,我们希望该分析器能以易理解的形式报告任何语法错误,并从错误中恢复过来,使后面的分析能继续进行下去
事实上,还有一些其它任务可能在分析时完成,例如把各种记号的信息收入符号表,完成类型检查和其它的语义检查,并产生中间代码
所有这些都包罗在图3
1的“前端的其余部分”一框中,在下面三章将详细讨论它们
1上下文无关文法的定义在第二章,我们用正规式来定义一些简单的语言,但是很多复杂一些的语言不能用正规式表达
例如,正规式不能用于描述配对或嵌套的结构,具体的例子有,由配对括号构成的串的集合不能用正规式