【编译原理系列】变量与过程翻译 | 您所在的位置:网站首页 › 计算过程怎么说 › 【编译原理系列】变量与过程翻译 |
声明语句的翻译
声明语句的作用是为可执行语句提供信息,以便于其执行;对声明语句的处理,主要是将所需要的信息正确地填写进合理组织的符号表中 变量的声明 类型定义:为编译器提供存储空间大小的信息(预定义&自定义)变量声明:为变量分配存储空间组合数据的类型定义和变量声明: 定义与声明在一起,定义与声明分离决定变量存储空间的是变量的数据类型 定义确定存储空间,声明分配存储空间简单数据类型的存储空间是已经确定的,如integer可以占4个字节,real可以占8个字节,char可以占1个字节等组合数据类型变量的存储空间,需要编译器根据程序员提供的信息计算而定定义就好像typedef struct node{};,声明就好像struct node Node;,使用就好像Node.val=1; 语法制导翻译 全程量offset:记录当前符号存储的偏移量,初值设为0属性.type和.width:变量的类型和所占据的存储空间过程enter(name, type, offset):为type类型的变量name建立符号表条目,并为其分配存储空间(位置)offset 产生式: 语义规则: (1)D→D;D (2)D→id:T {enter(id.name, T.type, offset); offset:=offset+T.width;} (3)T→int {T.type:=integer; T.width:=4;} (4)T→real {T.type:=real; T.width:=8;} (5)T→array [num] of T1 {T.type:=array(num.val, T1.type); T.width:=num.val*T1.width;} (6)T→^T1 {T.type:=pointer(T1.type); T.width:=4;} 左值与右值形式上 出现在赋值号左边和右边的变量分别称为左值和右值;实质上, 左值必须具有存储空间,右值可以仅是一个值,而没有存储空间;(变量【简单变量、组合变量】是左值,左值是地址,右值是值)形象地讲,左值是容器,右值是内容 过程的定义与声明过程(procedure): 过程头/规格说明(做什么)+过程体(怎么做);(有返回值的也称为函数,被操作系统调用的过程称为主程序)过程的三种形式: 过程定义、过程声明和过程调用。 过程定义:过程头+过程体;过程声明:过程头先声明后引用的原则,若在引用前已定义,则声明可省略,因为定义已包括了声明 参数的传递1、形参与实参 定义时的参数称为形参(parameter或formal parameter),形式参数引用时的参数称为实参(argument或actual parameter),实在参数2、常见的参数传递形式:(不同的语言提供不同的形式) 值调用(call by value) 过程内部对参数的修改,不影响作为实参的变量原来的值任何可以作为右值的对象均可作为实参过程定义时形参被当作局部名看待,并在过程内部为形参分配存储单元调用过程前,首先计算实参并将值(实参的右值)放入形参的存储单元过程内部对形参单元中的数据直接访问引用调用(call by reference) 过程内部对形参的修改,等价于直接对实参的修改 实参必须是左值 定义时形参被当作局部名看待,并在过程内部为形参分配存储单元 调用过程前,将作为实参的变量的地址(左值)放进形参的存储单元 过程内把形参单元中的数据当作地址,间接访问 存在副作用 int a=2; void add_one(int &x){ a=x+1; x=x+1; } void main () { cout |
CopyRight 2018-2019 实验室设备网 版权所有 |