编译原理 第2章:基础知识

文章目录

  • [1. 参数传递](#1. 参数传递)
    • [1.1 传地址](#1.1 传地址)
    • [1.2 得结果](#1.2 得结果)
    • [1.3 传值](#1.3 传值)
    • [1.4 传名](#1.4 传名)
  • [2. 程序设计语言概述](#2. 程序设计语言概述)
    • [2.1 高级语言的分类](#2.1 高级语言的分类)
    • [2.2 程序结构](#2.2 程序结构)
    • [2.3 数据类型与操作](#2.3 数据类型与操作)
    • [2.4 语句与控制结构](#2.4 语句与控制结构)
  • 3.程序语言的语法描述
    • [3.1 上下文无关](#3.1 上下文无关)
    • [3.2 语法树与二义性](#3.2 语法树与二义性)
    • [3.3 形式语言鸟瞰](#3.3 形式语言鸟瞰)

1. 参数传递

1.1 传地址

  1. 实在参数的地址传递给相应的形式参数。>PASCAL的变量参数方式
  2. 在过程段中每个形式参数都有一个相应的单元,称为形式单元,用来存放相应的实在参数地址。
  3. 调用一个过程时,调用段必须把实在参数的地址传递到一个为被调用段可以拿得到的地方。
  4. 如果实在参数是一个变量(包括下标变量),则直接传递它的地址;如果实在参数是常数或其它表达式(如A+B),那就先把它的值计算出来并存放在某一临时单元之中,然后传送这个临时单元的地址。
  5. 当程序控制转入被调用段之后,被调用段首先把实参地址抄进自己相应的形式单元中,过程体对形式参数的任何引用或赋值都被处理成对形式单元的间接访问
  6. 当被调用段工作完毕返回时,形式单元(它们都是指示器)所指的实在参数单元就持有所期望的值。

    参数调用后,形式参数M的值是I的地址,N的值是J的地址,这样通过M的值可以间接访问到I的值,通过N的值可以间接访问到J的值,函数调用返回后,I和J的值被交换。

1.2 得结果

  • 对于得结果,上面函数调用的参数传递过程如下图所示。图中参数调用后,形式参数M的值是I的值,N的值是J的值,但是在函数中无法访问到I和J所在的内存单元,只有在函数返回前将M和N的值分别抄送到I和J所在的内存单元中。 这种方式的函数调用,I和J的值也被交换。

1.3 传值

  1. 是一种简单的参数传递方法,也是当今高级语言中使用最多 的参数传递方法之一。把实在参数的值传递给相应的形式参数。 PASCAL的值参数
  2. 调用段把实在参数的值计算出来并存放在一个被调用段可以拿得到的地方。 被调用段开始工作时,首先把这些值抄入到形参单元中,然后就像使用局部名一样使用这些形式单元。
  3. 如果实在参数不为指示器(指针)(因此无法回存!),那么,在被调用段中无法改变实参的值。
  4. 对于传值,上面函数调用的参数传递过程如下图所示:

    参数调用后,形式参数M的值是I的值,N的值是J的值,但在函数中无法改变I和J的值,函数调用结束后,I和J的值也不会改变。

1.4 传名

传名是ALGOL 60所定义的一种特殊的形-实参数结合方式

  1. 过程调用的作用相当于把被调用段的过程体抄到调用出现的地方 ,但把其中任一出现的形式参数都换成相应的实在参数(文字替换)
  2. 它与"传地址"或"传值"的方式所产生的结果均不相同。



2. 程序设计语言概述


"程序设计教科书中的语言侧重于语言成分的意义,它常常只讲到语言的一部分,因此,不能把这种描述作为构造编译程序的基础"

程序语言由两方面进行定义:语法 语义
语法

语义

2.1 高级语言的分类

  1. 强制式语言(Imperative Language),也称过程式语言:命令驱动,面向语句 FORTRAN、C、Pascal,Ada
  2. 应用式语言(Applicative Language):注重程序所表示的功能,而不是一个语句接一个语句地执行 LISP、ML
  3. 基于规则的语言(Rule-based Language):检查一定的条件,当它满足值,则执行适当的动作 Prolog
  4. 面向对象语言(Object-Oriented Language):封装性、继承性和多态性 Smalltalk,C++,Java

2.2 程序结构

FORTRAN

PASCAL


ADA

JAVA

2.3 数据类型与操作

一个数据类型通常包括以下三种要素:

  • 用于区别这种类型数据对象的属性
  • 这种类型的数据对象可以具有的值
  • 可以作用于这种类型的数据对象的操作

初等数据类型:

  • 数据类型:整型、实型、复数、双精度、 运算:+,-,*,/等
  • 逻辑类型:布尔运算:∨,∧,┑
  • 字符类型:符号处理
  • 指针类型
  • 标识符:以字母开头的,由字母数字组成的字符串。
  • 标识符与名字两者有本质区别:
    • 标识符是语法概念
    • 名字有确切的意义和属性

      数据结构
  1. 数组
    逻辑上,数组是由同一类型数据所组成的某种n维矩形结构,沿着每一维的距离,称为下标
    • 数组可变与不可变:编译时能否确定其存储空间的大小
    • 访问:给出数组名和下标值
    • 存放方式:按行存放,按列存放
  1. 记录

  2. 字符串、表格、栈

2.4 语句与控制结构

  1. 表达式
  1. 语句

3.程序语言的语法描述


3.1 上下文无关

文法: 描述语言的语法结构的形式规则

上下文无关文法G包括四个组成部分:一组终结符号、一组非终结符号、一个开始符号以及一组产生式。

上下文无关文法的定义



3.2 语法树与二义性

用一张图表示一个句型的推导,称为语法树


定义 :如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的

G(E): E  i|E+E|E*E|(E) 是二义文法

语言的二义性 :一个语言是二义性的,如果对它不存在无二义性的文法。

例题:

3.3 形式语言鸟瞰


相关推荐
qystca2 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
网易独家音乐人Mike Zhou7 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky10 小时前
C语言:数组
c语言·数据结构
ahadee14 小时前
蓝桥杯每日真题 - 第19天
c语言·vscode·算法·蓝桥杯
Theliars14 小时前
C语言之字符串
c语言·开发语言
Reese_Cool14 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
搬砖的小码农_Sky15 小时前
C语言:结构体
c语言·数据结构
平头哥在等你17 小时前
求一个3*3矩阵对角线元素之和
c语言·算法·矩阵
Amd79417 小时前
Nuxt.js 应用中的 webpack:compile 事件钩子
webpack·自定义·编译·nuxt.js·构建·钩子·逻辑
尹蓝锐17 小时前
C语言-11-18笔记
c语言