折叠常量运算表达式, 包括算数运算、关系运算、逻辑运算,将常量表达式直接替换为结果
类型定义
- array类型下标范围一定是[int, int],且满足范围不能为空,元素类型必须存在
- record类型所有成员的类型必须存在
- 各定义类型必须存在,如函数参数类型,返回值类型等等
语句
- 赋值语句,左右两边结果类型必须符合,boolean、integer、float可相互赋值,char和string只能赋值与自身相同的类型
- if、repeat、while语句,条件结果类型必须为integer或boolean
- for语句,类型初始值和结果值类型必须同为integer或同为char
- case语句,条件结果类型必须为integer、char、boolean或string,标签值必须为必须为常量、标签类型必须为integer、char、boolean或string
- 函数调用语句,调用的名字必须是函数,参数个数必须相同,形参实参必须可以相互赋值
表达式
-
基本名字表达式,名字必须是常量或者变量,不能为函数、结构
-
array下标表达式,array名字必须是array、下标表达式结果类型必须为integer
-
record成员引用表达式,record名字必须是record,引用成员名必须出现在结构体定义中
-
算数表达式,运算数结果类型必须为boolean、float、integer,可以相互组合,特别的是取余运算必须两边都为integer
-
逻辑表达式,运算数结果类型必须为boolean或integer,可以相互组合
-
关系表达式,运算数结果类型不能为record或array,两个运算数结果类型必须同在boolean、integer、float内,或同为char,或同为string
-
函数表达式,同函数调用语句
语句
- if语句,条件表达式结果若为常量,则直接生成对应分支的代码
- repeat语句,条件表达式结果若为常量,则省去生成判断的语句,根据条件结果,只执行一次或者生成无限循环的代码
- while语句,条件表达式结果若为常量,则省去生成判断的语句,根据条件结果,一次都不执行或者生成无限循环的代码
- case语句,条件表达式结果若为常量,则判断对应的标签,直接生成该标签对应的语句
表达式
-
array下标表达式,下标结果若为常量,则直接生成对应的偏移,若最终计算的偏移为0,则省去加法求偏移操作.
若不为常量,且起始下标位0,则省去减法求起始下标位置操作
-
record表达式,若计算的成员偏移为0,则省去加法求偏移操作