编译原理
  • 编译原理
  • 一些简答题
  • 绪论
    • 编译器简介
    • 程序设计语言
    • 静态与动态
    • 参数传递机制
  • 词法分析
    • 词法单元、模式、词素
    • 串和语言
    • 正则表达式
    • 状态转换图
    • 不确定有穷自动机NFA
    • 确定有穷自动机DFA
    • 算法:正则表达式转NFA
    • 自动机到词法分析器
  • 语法分析
    • 语法分析器
    • 上下文无关文法
    • 二义性和左递归
    • 递归下降语法分析
    • 算法:求解FIRST集和FOLLOW集
    • 算法:LL(1)
    • 自底向上语法分析
    • 移入-归约语法分析
    • 算法:LR(0)
    • 算法:SLR(1)
    • 算法:LR(1)
    • 算法:LALR
    • LR分析器和LALR分析器
  • 语法制导
    • 语法制导定义(SDD)
    • 综合属性和继承属性
    • 语法树上的SDD求值
    • 依赖图
    • L属性的SDD
    • 类型
    • SDD的应用
  • 中间代码生成
    • 三地址代码
    • SSA(静态单赋值)
    • 类型和声明
    • 表达式的翻译
    • 类型检查
    • 控制流
    • 回填
  • 运行时刻环境
    • 存储组织
    • 栈式分配
    • 栈中非局部数据的访问
    • 堆管理
    • 垃圾回收
  • 代码生成
    • 代码生成器的设计
    • 目标语言
    • 目标代码中的地址
    • 基本块和流图
    • 基本块的优化
Powered by GitBook
On this page
  • 语句文法
  • 类型结构
  1. 语法制导

类型

PreviousL属性的SDDNextSDD的应用

Last updated 4 months ago

不同语言对类型有着不同的定义。非严谨的概括是:类型约等于数据+操作。

数据是一个类型所包含的所有取值集合,操作是一个类型支持的所有操作集合。类型检查是计算各个表达式的类型,检查各个运算是否是相关类型所支持的合法操作。

语句文法

语句:

S→DS∣AS∣εA→id=ES \rightarrow D S|A S| \varepsilon \\ A \rightarrow \mathbf{i d}=E S→DS∣AS∣εA→id=E

变量声明:

D→TLT→int∣floatL→L,id∣idD \rightarrow T L \\T \rightarrow int \mid float \\ L \rightarrow L , id | idD→TLT→int∣floatL→L,id∣id

属性文法没有副作用,但是增加了描述的复杂度。比如语法分析时,如果没有副作用,标识符表就必须作为属性传递。可以把标识符表作为全局变量,然后通过函数来添加新的标识符。如果我们允许属性文法有受控的副作用,这样就不会对属性求值产生约束,既可以按照任何拓扑顺序求值,不会影响最终结果。比如我们可以在变量声明SDD中有受控副作用:

类型结构

类型的含义:

  • 类型包括两个部分:T->BC,基本类型是B,分量是C

  • 分量形如[2][3],表示二维数组

  • 数组构造算符array(n,t)

总结:

  • 通过带副作用的SDD分析变量类型

  • 通过L属性的SDD分析数组类型

基本类型的变量声明