当前位置: 代码迷 >> 综合 >> 编译原理(三)语法分析:1.语法分析的若干问题
  详细解决方案

编译原理(三)语法分析:1.语法分析的若干问题

热度:51   发布时间:2024-01-12 16:15:40.0

文章目录

  • 一、语法的双重含意
  • 二、语法分析器的位置和作用
  • 三、语法错误的处理原则
    • 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;
    (加入分号,使之成为一个赋值句)