1,语法分析的若干问题
1.1 语法分析器的作用
编译器前端的重要组成部分:
(1) 根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树)。
(2) 检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理。
语法分析器:
1、通用的语法分析方法
Cocke-Younger-Kasami算法和Earley算法
2、自上而下
对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树;或者说为输入串寻找一个最左推导。
3、自下而上
自上而下的一般方法: 消除左递归 提取左因子 递归下降分析 预测分析器

1.2 语法错误的处理原则
1.2.1.源程序中可能出现的错误
语法错误
词法错误:非法字符或关键字、标识符拼写错误等
语法错误:语法结构出错,如少分号、{/}不配对等
语义错误
静态语义错误涉及的是编译时可检查出来的错误,如类型不一致、参数不匹配等;
动态语义错误一般是指程序运行时的逻辑错误,如无穷递归、变量为零时作除数等。
大多数错误的诊断和恢复集中在语法分析阶段,一个原因是大多数错误是语法错误,另一个原因是语法分析方法的准确性,它们能以非常有效的方法诊断语法错误。在编译的时候,想要准确地诊断语义或逻辑错误有时是很困难的。
1.2.2.语法错误处理的目标
① 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;
② 迅速地从每个错误中恢复过来,以便分析继续进行;
③ 对语法正确源程序的分析速度不应降低太多。
1.2.3.语法错误的基本恢复策略
希望编译器的语法分析方式不是遇到一个语法错误就停止,就需要采取某种恢复策略,使得分析在遇到错误时还能够继续进行。
紧急方式恢复:这是最简单的方法,适用于大多数分析方法。
短语级恢复:建立在产生式(CFG)的基础上,以短语为基本分析单元,同时也便于进行语法制导翻译,恢复得比紧急方式要精确,因此被认为是一种较为理想的恢复方式。
出错产生式
全局纠正
例题:
下述两条是有语法错误的语句,其中第一条赋值句结束时忘记加分号:x = a + b y = c + d;
紧急方式: x = a + b + d; -- 丢弃b之后的若干记号,直到遇到同步记号+
短语级恢复:x = a + b; -- 加入分号,使之成为一个赋值句
2,上下文无关文法(CFG)
2.1 CFG的定义与表示
2.1.1 定义
定义3.1 上下文无关文法是一个四元组G =(N,T,P,S):
① N是非终结符的有限集合(Nonterminals);
② T是终结符的有限集合(Terminals),且N∩T=Φ;
③P是产生式的有限集合(Productions),每个产生式形如: A→α,其中A∈N,被称为产生式的左部,α∈(N∪T)*,被称为产生式的右部,若α=ε,则称A→ε为空产生式(也可以记为A →);
④ S是非终结符,被称为文法的开始符号(Start symbol)。
2.2.2 例题:
定义简单算术表达式的上下文无关文法G3.1=(N,T,P,S)如下所示。
N={E} T={+,*,(,),–,id} S=E
P:
E → E + E (1)
E → E * E (2)
E → (E) (3)
E → –E (4)
E → id (5)
2.2.3 表示
1.由产生式集表示CFG
文法可以由其产生式集P代替,而不写四元组。CFG的产生式表示也被称为巴克斯范式(BNF),值得注意的是,规范的BNF中,“→”用“::=”表示。