程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言
高级程序设计语言
一、语言概述
1.1 语法 v.s. 语义
- 程序本质上是一定字符集上的字符串
- 语法:一组规则,用它可以形成和产生一个合式(well-formed)的程序
- 定义了程序的形式结构
- 定义语法单位的意义属于语义问题
- 语义:一组规则,定义一个程序的意义
- 例如 “关于函数调用时参数传递方法的描述” 属于语义定义
1.2 作用域
- 同一个标识符在不同过程中代表不同的名字
- 作用域:一个名字能被使用的区域范围
- 规则:“最近嵌套原则”
1.3 标识符 v.s. 名字
标识符是语法概念,名字是语义概念。
「标识符」
- 以字母开头的,由字母数字组成的字符串
「名字」
- 含义:标识程序中的对象
- 意义和属性:
- 值:单元中的内容
- 属性:类型和作用域
- 说明方式
- 说明语句明确规定
- int score
- 隐含说明
- FORTRAN 以 I,J,K,...,N 为首的名字代表整型,否则为实型
- 动态确定
- 走到哪里,是什么,算什么
- 说明语句明确规定
- 名字的绑定
- 名字的绑定是指将标识符与所代表的程序数据或代码进行关联
- 静态绑定:发生在编译过程中,如变量声明、类型定义、函数定义
- 动态绑定:发生在运行过程中,如多态、虚函数
「二者区别」
- 标识符是语法概念
- 名字有确切的意义和属性
1.4 左值与右值
赋值语句:A := B
- 名字的左值:该名字代表的存储单元的地址
- 名字的右值:该名字代表的存储单元的内容
「简单判断」
- 出现在赋值号左边的值必须具有左值,出现在赋值号右边的值则必须具有右值。
二、语法描述
2.1 基本概念
- **字母表:**一个有穷字符集,记为
- **字符:**字母表中每个元素
- 字 / 字符串:
上的字(也叫字符串)是指由中的字符所构成的一个有穷序列
- **空字:**不包含任何字符的序列,记做
- 空字是字符串,不是字符
- 字的全体:
表示上的所有字的全体,包含空字
- 子集连接(积):
- 的子集 U 和 V 的连接(积)定义为
- n次积
- V自身的n次积记为
- 是 V 的闭包:
- 是 V 的正规闭包:
- 「区别」
- 中始终有空字,但如果V中原来没有空字,则中不会有空字
- V自身的n次积记为
2.2 上下文无关文法
「上下文无关文法 G 的定义 - 四元组」
- 终结符(Terminal)集合,非空
- 非终结符(Noterminal)集合,非空,且
- 文法的开始符号,
- S是特殊非终结符,表示所定义的语言最终感兴趣的语法单位,如英语描述中的“句子”,程序语言描述的“程序”
- 产生式集合(有限),每个产生式形式如下
- 表示 “P定义为”
- 开始符
至少必须在某个产生式的左部出现一次
2.3 推导
2.3.1 基本概念
- :直接推出,只能对一个非终结符推导一次
- :被定义为
「*推出 & +推出」
「概念辨析 - 句型 | 句子 | 语言」
「句型、句子推导练习」
- 文法 => 句子
- 句子 => 文法
- 此类题目稍微难一些,需要用递归思想来解决,优先考虑最简结构
2.3.2 语法树
「最左/右推导」
「语法树」
2.3.3 二义性
「二义性举例」
「文法 / 语言二义性」
- 文法二义性:文法存在某个句子对应两颗不同语法树
- 文法二义性问题是不可判定问题,不存在一个算法,能在有限步骤中,确切地判定一个文法是否二义
- 但仍然存在很多充分条件可以判定一个文法是非二义的
- 例如一个文法如果属于 LR 文法,则一定不是二义文法
- 语言二义性:存在一个能推导出该语言的无二义文法
2.4 形式语言
2.4.1 概述
- 乔姆斯基在1956年建立形式语言体系,将文法分为四种类型:0、1、2、3型
- 四种类型唯一区别在于产生式
- 0型(短语文法,图灵机)
- 1型(上下文有关文法,线性界限自动机)
- 2型(上下文无关文法,非确定下推自动机)
- 3型(正规文法,有限自动机)
- 正规式、正规集
2.4.2 文法对比
- 四种类型文法描述能力比较
- 上下文无关文法 v.s. 正规文法
- 上下文无关文法 v.s. 上下文有关文法
- 上下文无关文法的局限 - 权衡思想
程序设计语言编译原理_编译原理学习笔记(二):高级程序设计语言相关推荐
- 编译原理学习笔记2——高级程序设计语言概述
编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...
- python语言单行注释符_云计算开发学习笔记:Python3注释
大家在学习各种编程语言的时候都会在代码里面添加一些注释,这个也是为了方便日后对代码的查找和修改,各种编程语言的注释方式略有不同,Python3语言也一样有自己的注释方式,下面我们来了解一下都有哪几种. ...
- 《COM原理与应用》学习笔记二——COM对象和COM接口的实现
COM对象是给用户提供服务的封装的实体.这个应该和C++中类的对象理解起来是相似的.但是有时候也把COM对象当作提供服务的那个类.COM对象也对数据进行了封装,然后也提供了接口.不过和类还是有一些不一 ...
- css中怎么加入立体模型,CSS学习笔记二:css 画立体图形
继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...
- 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言
嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...
- 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解
目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...
- 《区块链原理与技术》学习笔记(六) — 区块链安全
<区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...
- 【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】
⌛️ 文章目录 一.Shell 概述 二.Shell 脚本的定义与执行 2.1 Shell 脚本的定义 2.2 Shell 脚本的执行 三.Shell 变量 3.1 用户自定义变量 3.2 环境变量 ...
- 《Go语言圣经》学习笔记 第一章 Go语言入门
Go语言圣经学习笔记 第一章 Go语言入门 目录 Hello, World 命令行参数 查找重复的行 GIF动画 获取URL 并发获取多个URL Web服务 本章要点 注:学习<Go语言圣经&g ...
- C语言学习笔记-P1 初识C语言(1)
C语言学习笔记-P1 初识C语言(1) P1 初识C语言(1) 一.什么是C语言 1.定义 2.发展 二.第一个C语言程序 Hello World 三.数据类型 四.变量,常量 未完待续!!! P1 ...
最新文章
- 辨异 —— 冠词(定冠词、不定冠词、零冠词)
- t检验自由度的意义_T检验、F检验和统计学意义
- 前端基础-jQuery的优点以及用法
- hdu4750Count The Pairs(最小生成树找瓶颈边)
- MAUI 移植 Xamarin.Forms 自定义渲染器
- 如何从Java EE无状态应用程序连接到MongoDB
- 减少 JavaScript 代码量的原生技术
- 代理ip池的ip是重复利用的吗_爬虫被封怎么办?用Node.js构建一个私人IP代理池...
- 来自 100 年前不可思议的绘画预言
- 最优投资组合--马科维茨投资组合理论
- 1336A - Linova and Kingdom
- Linux命令行与shell脚本(17)--正则表达式
- 艾司博讯:拼多多网店账号出现异常该怎么解决?
- 数字宫殿方法记忆设计模式
- MySQL前缀索引和索引选择性
- 浅谈:基于物联网的固定资产管理技术
- 多目标进化算法基础知识整理
- M1 Dock智能硬件环境搭建(MaixPy安装及使用)
- 优秀网页设计:使用纹理的20个华丽示例
- Loadrunner如何使用谷歌浏览器录制脚本
热门文章
- BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)
- linux 文件io实例代码,linux 文件IO(示例代码)
- c语言程序设计例题椭圆,2016年西安邮电大学理学院高级语言程序设计之C语言程序设计复试笔试仿真模拟题...
- 【Android】SDDL刷机
- IE浏览器与非IE浏览器JS日期兼容性问题处理
- c语言中有bool型变量吗?
- 通往奥格瑞玛的道路(洛谷 1462)
- 新版ADT出现appcompat_v7的问题
- HTML系列(七):多媒体
- 实验1 Windows汇编语言开发环境