文章目录
- 一、语法的双重含意
- 二、语法分析器的位置和作用
- 三、语法错误的处理原则
-
- 1.源程序中可能出现的错误
- 2.语法错误处理的目标
- 3.语法错误的基本恢复策略
【编译原理博客列表】》》》》》》
一、语法的双重含意
- 语法规则:上下文无关文法(子集-LL文法或LR文法)
- 语法分析:下推自动机(LL或LR分析器),自上而下和自下而上分析
二、语法分析器的位置和作用
语法分析器在编译器中的位置:
语法分析器的两个重要作用:
- 根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树)
- 检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理
三、语法错误的处理原则
1.源程序中可能出现的错误
两类错误:语法(包括词法)错误和语义错误
- 词法错误:非法字符或拼写错关键字、标识符
@
intege
20times
- 语法错误:指语法结构出错
少分号:x:=a+b y:=x;
begin/end不配对:begin
左值右值:3=a - 静态语义错误:
类型不一致:a,b:integer;
x:array[1..10] of integer;
x:=a+b;
参数不匹配 - 动态语义错误(逻辑错误):
死循环:while (t) { ...};
变量为零时作除数:a:=a/b;
2.语法错误处理的目标
对语法错误的处理,一般希望达到以下基本目标:
- 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;
- 迅速从每个错误中恢复过来(以便分析继续进行);
- 不应使对语法正确源程序的分析速度降低太多。
3.语法错误的基本恢复策略
- 紧急方式恢复:
抛弃若干输入,直到遇到同步记号。 - 短语级恢复:
采用串替换的方式对剩余输入进行局部纠正(抛弃+插入)。 - 出错产生式:
用出错产生式捕捉错误(预测错误)。预置型的短语级恢复方式。 - 全局纠正:
对错误输入序列x,找相近序列y,使得x变换成y所需的修改、插入、删除次数最少。
例3.1 下述两条是有语法错误的语句,其中第一条赋值句结束时忘记加分号,采用紧急恢复方式和短语级恢复方式的可能结果分别如下所示。
x := a + b
y := c + d;
- 紧急方式: x := a + b + d;
(丢弃b后若干记号,直到遇到+) - 短语级恢复:x := a + b; y := c + d;
(加入分号,使之成为一个赋值句)