1.前置概念

1.1语法和语义的区别

1.2语义分析的必要性

1.3程序设计语言语义的分类

1.4语义分析的主要任务

1.5语义分析的实现

方法一:不作为独立的一遍

方法二:作为独立的一遍

构建的另一种语法树

2.语义分析处理后的结果

我们考虑一下前面我们处理完了以后得到的都是token序列,是一个没有语法错误的token序列,token按照我们前面的介绍是分成了3大类,一类是常量、标识符、特殊符。这里我们处理的重点是标识符。经过我们的语义分析之后应该是这样的结构,原来的token变成了new token序列。

这个newtoken序列和前面的token相比,常量、特殊符都没有发生变化,只有标识符部分发生了变化,第一部分他是一个标识符、第二部分他是指向一个符号表,这个部分我们后面再来具体的介绍。符号表中所有的会保存所有的标识符的信息,类似于我们词法分析中介绍的名字表,但是跟那个还是有些不同,因为每个标识符的语义信息都存在这里,同时符号表会和一个类型信息表相连,类型信息表有什么呢?有数组信息表、记录信息表等等,不同的语言可能会有一些区别,但是主要的信息都是相同的。另外还有一种信息表记录的是过程和函数的信息,这样的话,在我们经过语义分析之后,我们检查了程序中的一些语义错误,同时得到了现在的这样的一种结构,把原来的token结构变成了newtoken,这是经过语义分析之后我们得到的一种新的形式。

3.token中的标识符

出现形式

种类

属性

4.类型的语义表示

4.1作用:

  • 类型的语义检查

  • 分配空间的大小

4.2分类:

标准类型的语义表示:

子界类型的语义表示:

子界类型 一般是1..100(常量)都是定义在有序类型中,从1到100,这个宿主类型就是整形,如果是a..z宿主类型就是字符类型。这里强调的是子界类型都是定义在有序类型上面的。

枚举类型的语义表示:

例子:

数组类型的语义表示:

例子:

记录类型的语义表示:

记录类型在c里叫做结构类型。第一个是大小,第二个是种类,每一个记录类型都有一些域,不同的记录类型域也不一样,拉出一个链表,表示一个类型、名字、偏移、指向下一个域

例子:结构体类型

例子:联合体类型

指针类型的语义表示:

例子:

4.3标识符的语义表示

常量标识符

例子:

类型标识符

例子:

变量标识符

例子:

过程/函数标识符

例子:

5.抽象地址

5.1地址分配原则

5.2抽象地址的结构

层数的定义:

5.3过程活动记录(AR)

例子:

6.符号表

6.1概述

6.2符号表的总体组织

方式一:多表结构

方式二:单表结构

方式三:折中结构

6.3符号表表项的排列

线性组织

排序组织

散列组织

6.4符号表的查表技术

  • 顺序查表法

  • 折半查表法(二分法)

  • 散列查表法(哈希表)

6.5符号表的局部化处理

局部化单位

错误检查:

标识符的作用域

6.6符号表的组织

全局符号表组织:全局式线性组织的符号表的局部化处理思想

删除方法一:真删除法

例子(删完的情况):

删除方法二:驻留法

例子(删完的情况):

局部符号表组织

例子:

6.7符号表的管理