编译原理-语义分析

 

1.语义分析概述

1.1 定义

     语义是指源程序及其组成部分所表述的含义,和语法不同,语法是关于程序及其组成部分的构成规则的描述,是上下文无关的;而语义是关于语法结构的含义及其使用规则的描述,是上下文有关的。语法上正确,其语义不一定正确。

     如下面的程序段,在语法结构上是正确的,但是在语义上有很多错误:

int x = 0, z;
float y(){.....}
void main(){
    z = x() + t;
    z /= x;
    x = y();
}

1.2 分类

    分为静态语义和动态语义。

静态语义是指在编译阶段能够检查的语义,比如标识符未定义,类型不匹配等。
动态语义是指在目标程序运行阶段能够检查的语义,比如除数为0,无效指针,数组下标越界等。

1.3 任务

    语义分析的任务就是对结构上正确的源程序进行上下文有关性质的审查,审查源程序是否有无语义错误,为代码生成阶段收集类型信息。

1.4 主要功能

     主要功能包括建立符号表,进行静态语义检查,发现语义错误。

1.5 地位和作用

      如下图所示:

 

2.语义描述

2.1 程序的语义

2.2 函数的语义

2.3 各种名字的声明和使用的语义

2.4 各种语句的语义

2.5 表达式的语义

 

3.符号表

3.1 概述

      在编译程序工作的过程中,需要不断收集、记录和使用源程序中的各种名字及其属性等相关信息,以便检查语义是否正确,并辅助翻译为正确的代码。一般是建立表格的方式记录信息。

3.2 功能

    1)收集符号信息

    2)进行语义的合法性检查

3.3 表

    符号表应该包含常量表、变量表、函数表等等。

4.静态语义检查

4.1 声明与定义语义检查

4.2 表达式语义检查

4.3 语句语义检查

 

 

 

 

 

 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckyliuqs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值