/PascalCompiler

PascalCompiler

Primary LanguageC++

PascalCompiler

常量折叠

​ 折叠常量运算表达式, 包括算数运算、关系运算、逻辑运算,将常量表达式直接替换为结果

类型检查

类型定义

  • 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,则省去加法求偏移操作