第2章PL设计概述-程序设计语言原理

合集下载

程序设计语言PL0

程序设计语言PL0

EBNF定义的PL/0语法
condition = "odd" expression | expression ("="|"#"|"<"|">"|"<="|">=") expression.
A conditional is a relational expression or an "odd" test.
A statement is an assignment statement, a procedure call, a compound statement, an if statement, a while statement, or empty. Both if and while statements have conditionals.
2.EBNF定义的PL/0语法
program = block ".".
A program is a block.
block = [ "const" ident "=" number { "," ident "=" number } ";" ] [ "var" ident { "," ident } ";" ] { "procedure" ident ";" block ";" } statement.
3. PL/0语法图
PL/0语法图
PL/0语法图
PL/0语法图
注意

程序设计的语言原理是什么

程序设计的语言原理是什么

程序设计的语言原理是什么程序设计的语言原理是一种用于编写计算机程序的规范、语法和语义规则的体系。

它定义了程序员如何使用特定的语言来描述计算机任务及操作过程。

程序设计语言的原理涉及到计算机科学和语言学等多个领域,包括编译器、解释器、语言运行环境等。

程序设计语言的原理不仅仅是一套编写程序的规则,更是一种表达和交流计算机任务的工具。

它的设计目标是使得程序员可以更加方便、高效地编写、调试和维护程序,同时使程序更具可读性和可移植性。

程序设计语言的原理主要包括以下几个方面:1. 语法规则:程序设计语言的语法规则定义了如何书写程序的语句、表达式和结构。

它规定了程序员可以使用的关键字、运算符、数据类型等,并且定义了这些元素如何组合成有效的程序。

语法规则尽量设计得简洁、易读,以方便程序员理解和书写程序。

2. 语义规则:语法规则只规定了程序的结构,而语义规则则进一步定义了程序元素的含义和行为。

语义规则通常包括类型检查、运算规则、作用域和生命周期等方面。

它保证了程序在执行过程中的正确性和一致性,避免了一些常见的错误和不确定性。

3. 数据结构和算法:程序设计语言的原理还涉及到数据结构和算法的设计。

数据结构定义了程序中存储和操作数据的方式,而算法则描述了解决问题的步骤和过程。

良好的数据结构和算法设计可以提高程序的效率和可维护性,减少资源消耗和开发成本。

4. 编译和解释:程序设计语言的原理还包括编译器和解释器的设计与实现。

编译器将程序源代码转换为机器代码,而解释器则逐行解释执行源代码。

编译器和解释器都需要根据语言规范将程序映射到机器指令,同时进行一系列的语法和语义检查,以保证程序的正确性和安全性。

5. 语言工具和库:程序设计语言的原理也与编程工具和库密切相关。

编程工具如集成开发环境(IDE)、调试器等可以提供开发、测试和调试程序的功能,而库(Library)提供了一组常用的函数和数据结构,简化了程序员的开发工作。

语言工具和库的设计需要考虑到语言的特点和需求,以提高程序员的生产效率。

程序设计概述

程序设计概述

• (6)LISP(List Processor)语言。 • 是一种人机交互式的符号处理语言,是在人工智能领域广泛应用的一 种程序设计语言。 • (7)dBASE 语言。 • 是由dBASE 数据库管理系统提供的用于数据处理的结构化程序设计语 言,类似的还有FoxBASE,INFORMIX 等。这类语言提供的命令(语句) 功能很强,这样就无需描述运算的详细过程。例如排序,若用一般的 高级语言编程需若干条语句,在这里只要一条命令即可完成。因此人 们又称这类语言为 4GL(第四代语言)。特别适合非专业技术人员 使用。 • (8)C++。 • 是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检 查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设 计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多 种程序设计风格。 • (9)Java • 是由Sun Microsystems公司于1995年5月推出的Java程序设计语言 (以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏 览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、 Internet计算。
• 从计算机程序的用途角度再来看计算机程 序的另外一个描述: 程序=数据结构+算法 总的来说,计算机程序的用途可以概括为 是对信息的处理。数据是信息的载体,数 据结构是指数据在计算机中的表示,算法 是指解决某个问题的方法,通常是一种用 来加工处理对应数据的方法,一般表示为 一组指示计算机每一步动作的有序指令。
• 程序所描述的过程往往是一个有顺序的过程。 • 打仗时(不管是实战还是演习),进攻一个阵地,那么整 个攻占阵地的程序一般可以描述如下: • ①设计进攻方案,确定时间安排。 • ②火力准备(炮火会先对要进攻的阵地一阵狂轰乱炸,称 作火力准备,持续时间通常较长,根据具体情况而视,少 则几分钟半个小时,多则一两个小时)。 • ③步兵开始地面推进。 • ④攻占整个阵地。

工程设计语言 p语言

工程设计语言 p语言

工程设计语言 p语言PLC常用程序设计语言,工程师必须会!在可编程控制器中有多种程序设计语言,它们是梯形图语言、布尔助记符语言、功能表图语言、功能模块图语言及结构化语句描述语言等。

梯形图语言和布尔助记符语言是基本程序设计语言,它通常由一系列指令组成,用这些指令可以完成大多数简单的控制功能,例如,代替继电器、计数器、计时器完成顺序控制和逻辑控制等,通过扩展或增强指令集,它们也能执行其它的基本操作。

功能表图语言和语句描述语言是高级的程序设计语言,它可根据需要去执行更有效的操作,例如,模拟量的控制,数据的操纵,报表的报印和其他基本程序设计语言无法完成的功能。

功能模块图语言采用功能模块图的形式,通过软连接的方式完成所要求的控制功能,它不仅在可编程序控制器中得到了广泛的应用,在集散控制系统的编程和组态时也常常被采用。

由于它具有连接方便、操作简单、易于掌握等特点,为广大工程设计和应用人员所喜爱。

根据可编程器应用范围,程序设计语言可以组合使用,常用的程序设计语言是:梯形图程序设计语言、布尔助记符程序设计语言(语句表)、功能表图程序设计语言、功能模块图程序设计语言、结构化语句描述程序设计语言、梯形图与结构化语句描述程序设计语言、布尔助记符与功能表图程序设计语言、布尔助记符与结构化语句描述程序设计语言。

1.梯形图(Ladder Diagram)程序设计语言梯形图程序设计语言是用梯形图的图形符号来描述程序的一种程序设计语言。

采用梯形图程序设计语言,程序采用梯形图的形式描述。

这种程序设计语言采用因果关系来描述事件发生的条件和结果。

每个梯级是一个因果关系。

在梯级中,描述事件发生的条件表示在左面,事件发生的结果表示在后面。

梯形图程序设计语言是最常用的一种程序设计语言。

它来源于继电器逻辑控制系统的描述。

在工业过程控制领域,电气技术人员对继电器逻辑控制技术较为熟悉,因此,由这种逻辑控制技术发展而来的梯形图受到了欢迎,并得到了广泛的应用。

编译原理答案(前三章)

编译原理答案(前三章)

编译原理答案(前三章)第 1 章引论第 1 题解释下列术语:答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

第2章 简介PL0

第2章 简介PL0

数据类型
整型
说明类型
(1)常量说明(全局) (2)变量说明; (3)过程说明。
• 标识符(字母开始的字母数字串)的有效长度 是10 • 数字最多为14位 • 过程无参,可嵌套(最多三层)定义,可递归 调用 • 变量的作用域同PASCAL • 13个保留字:if, then, while, do, read, write, call, begin, end, const, var, procedure, odd
±°¥ Ê µ Ç µ ´ Ç ²Î Ô Ì ò á ÷ ø Ê ñ ª ´ ³ Ð ½ Ê ² '.'£ ¿ Y ´ Ì ò Ð Ô ³ Ð Ö Ç ñ Ð í ó ¿ Ê ²Ó ´ Î £ N ôà â Í ù Ì µ Ó ½ Ê ¸ ³ INTERPRET â Ê ´ ½ Í Ö Ð Ä ±³ Ð ¿ ê Ì ò Y
"semicolon","period","becomes","beginsym","endsym","ifsym",
"thensym","whilesym","writesym","readsym","dosym","callsym", "constsym","varsym","procsym"};
因子 factor
语法图
程序
分程序
分程序
const
.
ident ,
=
number
; var ident

; ;

pl0语言简介

pl0语言简介

4
#define #define #define #define #define #define #define #define #define #define #define
becomes beginsym endsym ifsym thensym whilesym dosym callsym constsym varsym procsym
0x80000 0x100000 0x200000 0x400000 0x800000 0x1000000 0x2000000 0x4000000 0x8000000 0x10000000 0x20000000
enum object { constant, variable, proc }; enum fct { lit, opr, lod, sto, cal, Int, jmp, jpc }; typedef struct{ enum fct f; // function code long l; // level long a; // displacement address } instruction; /* lit 0, a : load constant a opr 0, a : execute operation a lod l, a : load variable l, a sto l, a : store variable l, a cal l, a : call procedure a at level l Int 0, a : increment t-register by a jmp 0, a : jump to a jpc 0, a : jump conditional to a */ char ch; unsigned long sym; char id[al+1]; long num; long cc; long ll; long kk, err; long cx; char line[81]; // // // // // // last character read last symbol read last identifier read last number read character count line l包括标准输入和输出)操作有较大区别。 (9)两种语言的注释形式不同。 (10)由于 int 是 C 语言的关键字,因此中间语言指令的操作码 int 被改成 Int。 (11)改写版本中增加了制表符作为单词的分隔符,因为现在大家已经习惯用制表符。 带来的问题是编译器报错的箭头所指位置可能不准确。 Niklaus Wirth 设计的编译器中有一些不影响大局的小问题 (也许是 Niklaus Wirth 有意为 之) ,我们也没有修改。例如: (1)没有检查一个分程序中的名字是否重复声明,导致出现重复声明的名字时,默认 的是最后出现的那一个。 (2)按附录 1.1 节的文法,常量定义和变量声明用逗号分隔,但实际情况是用分号分 隔也被认可。 (3)无符号整数超过一定位数时,以报告编号为 30 而不是 31 的错误更为准确。 下面是编译器两个文件 pl0.h 和 pl0.c 的代码。 (1)文件 pl0.h #include <stdio.h> #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define norw txmax nmax al amax levmax cxmax nul ident number plus minus times slash oddsym eql neq lss leq gtr geq lparen rparen comma semicolon period 11 100 14 10 2047 3 2000 0x1 0x2 0x4 0x8 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800 0x1000 0x2000 0x4000 0x8000 0x10000 0x20000 0x40000 // // // // // // // no. of reserved words length of identifier table max. no. of digits in numbers length of identifiers maximum address maximum depth of block nesting size of code array

2-3-习题(含解答)

2-3-习题(含解答)

2-3 习题(含解答)目录第1章编译原理概述 (1)第2章PL/O编译程序的实现 (4)第3章文法和语言 (4)第4章词法分析 (13)第5章自顶向下语法分析方法 (28)第6章自底向上优先分析 (39)第7章LR分析 (42)第8章语法制导翻译和中间代码生成 (60)第9章符号表 (67)第10章目标程序运行时的存储组织 (70)第11章代码优化 (73)第12章代码生成 (76)综合练习一 (79)综合练习二 (84)综合练习三 (90)综合练习四 (95)综合练习五 (101)综合练习六 (107)第1章编译原理概述一、选择题1.一个编译程序中,不仅包含词法分析,语法分析,中间代码生成,代码优化,目标代码生成等五个部分,还应包括 (1) 。

其中, (2) 和代码优化部分不是每个编译程序都必需的。

词法分析器用于识别 (3) ,语法分析器则可以发现源程序中的 (4) 。

(1) A.模拟执行器 B.解释器 C.表格处理和出错处理 D.符号执行器(2) A.语法分析 B.中间代码生成 C.词法分析 D.目标代码生成(3) A.字符串 B.语句 C.单词 D.标识符(4) A.语义错误 B.语法和语义错误 C.错误并校正 D.语法错误2.程序语言的语言处理程序是一种 (1) 。

(2) 是两类程序语言处理程序,他们的主要区别在于 (3) 。

(1) A.系统软件 B.应用软件 C.实时系统 D.分布式系统(2) A.高级语言程序和低级语言程序 B.解释程序和编译程序C.编译程序和操作系统D.系统程序和应用程序(3) A.单用户与多用户的差别 B.对用户程序的查错能力C.机器执行效率D.是否生成目标代码3.汇编程序是将翻译成,编译程序是将翻译成。

A.汇编语言程序B.机器语言程序C.高级语言程序D. A 或者BE. A 或者CF. B或者C4.下面关于解释程序的描述正确的是。

(1) 解释程序的特点是处理程序时不产生目标代码(2) 解释程序适用于COBOL 和 FORTRAN 语言(3) 解释程序是为打开编译程序技术的僵局而开发的A. (1)(2)B. (1)C. (1)(2)(3)D.(2)(3)5.高级语言的语言处理程序分为解释程序和编译程序两种。

PL语言

PL语言

f
f l 功能码
l
a
层次差 (标识符引用层减
LIT LOD STO CAL INT JMP JPC
0 l l l 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
a a a a a a a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); while b#0 do begin call p; write(2*c); read(b); end end.
( 0) ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24)
jmp jmp int lod lit opr sto opr int opr sto lod lit opr jpc cal lit lod opr opr opr opr sto jmp opr
0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 2 3 3 10 2 4 0 5 16 3 3 0 9 24 2 2 4 4 14 15 16 3 11 0
同PASCAL 作用域规则(内层可引用包围它的外层定义的标识符), 上下文约束, 过程可嵌套定义,可递归调用 子集 数据类型,只有整型 数据结构 ,只有简变和常数 数字最多为14位 标识符的有效长度是10 语句种类 过程最多可嵌套三层

高级程序语言的设计及实现-程序设计语言原理

高级程序语言的设计及实现-程序设计语言原理

程序设计语言原理
教材: 程序设计语言原理 麦中凡 参考书:
• • •
北航出版社

《程序语言原理(第五版)》,Robert W.Sebesta, 机械工业出版社。 《程序设计语言:原理与实践(第二版)》, Kenneth C. Louden,电子工业出版社。 《程序设计语言:设计与实现(第四版)》, Terrence W. Pratt,Marvin V. Zelkowitz,电子工业出 版社。 《程序设计语言:概念和结构(第二版)》,Ravi Sethi,机械工业出版社
第12页
新趋势:脚本语言
近年脚本语言在计算机应用盛行起来,重要实例: • 用于开发Web 服务端的PHP、ASP、JSP 等 • 用于Web 客户端网页嵌入应用的JavaScript 等 • 用于更广泛的应用开发的Perl、Python、Ruby 等 • 其他各种专门用途的脚本语言,如描述图形界面的Tcl/tk 与通用程序设计语言相比,通用脚本语言有如下特点: • 丰富的基础数据结构,灵活的使用方式,支持快速的应用开 发 • 基于解释器的执行,或者解释和编译的结合,可以立即看到 开发的效果 • 通常都没有标准化,随着应用的发展变化和很快地扩充 • 一些语言形成了很好的社团,开发了大量有用的库 脚本语言将如何发展?其发展趋势怎样?
14
2 第15页

• 定义:可以编制软件的,机器可识别,可执 行的表示法(或符号)系统
第16页
0.2 为什么研究PL
•人机交互界面永存 过去—现在—未来 •软硬件技术窗口 •发展新语言 •提高软件人员素质 •通向理论的形式方法 •通用语言标准化与规范化
第17页
0.3 语言规范与处理器
• PL语言不是软件

pl0

pl0

第一部分 PL/0语言及其编译器1. PL/0语言介绍PL/0程序设计语言是一个较简单的语言,它以赋值语句为基础,构造概念有顺序、条件和重复(循环)三种。

PL/0有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。

PL/0中唯一的数据类型是整型,可以用来说明该类型的常量和变量。

当然PL/0也具有通常的算术运算和关系运算。

具体的PL/0语法图如下。

1.1PL/0语言的语法图 程序程序体语句序列条件表达式因子2. PL/0语言编译器本书所提供的PL/0语言编译器的基本工作流程如图1-1所示:源程序执行结果图1-1 PL/0编译器基本工作流程2.1 词法分析PL/0的语言的词法分析器将要完成以下工作: (1) 跳过分隔符(如空格,回车,制表符);(2) 识别诸如begin,end,if,while 等保留字; (3) 识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym 赋值为SYM_IDENTIFIER。

(4) 识别数字序列,当前值赋给全局量NUM,sym 则置为SYM_NUMBER; (5) 识别:=,<=,>=之类的特殊符号,全局量sym 则分别被赋值为SYM_BECOMES,SYM_LEQ,SYM_GTR 等。

相关过程(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:(1) 识别且跳过行结束符;(2) 将输入源文件复写到输出文件;(3) 产生一份程序列表,输出相应行号或指令计数器的值。

2.2 语法分析我们采用递归下降的方法来设计PL/0编译器。

以下我们给出该语言的FIRST 和FOLLOW 集合。

非终结符(S) FIRST(S)FOLLOW(S)程序体 const var procedure ident callif begin while. ;语句 ident call begin if while . ; end条件 odd + - ( ident numberthen do表达式+ - ( ident number . ; ) R end then do 项 ident number ( . ; ) R + - end then do 因子 ident number (. ; ) R + - * / end then do注:表中R 代表六个关系运算符。

人工智能技术导论(第2章)-逻辑程序设计语言prolog

人工智能技术导论(第2章)-逻辑程序设计语言prolog

其中谓词名是以小写英文字母打头的字母、 数字、 下 划线等组成的字符串, 项表是以逗号隔开的项序列。 PROLOG中的项包括由常量或变量表示的简单对象以及函数、 结构和表等, 即事实的形式是一个原子谓词公式。
第 2 章 逻辑程序设计语言 例如: student(john). like(mary,music). 就是PROLOG中的两个合法事实。 功能 一般表示对象的性质或关系。 例如上面的两个事实就分别表示“约翰是学生”和 “玛丽喜欢音乐”。
实际是一种应用相当广泛的智能程序设计语言。 同过程性语言相比, 一个PROLOG程序, 其问题就相当于 主程序, 其规则就相当于子程序, 而其事实就相当于数据。
第 2 章 逻辑程序设计语言 2.1.3 PROLOG程序的运行机理 1. 自由变量与约束变量 PROLOG中称无值的变量为自由变量, 有值的变量为约束 变量。一个变量取了某值就说该变量约束于某值, 或者说该变 量被某值所约束, 或者说该变量被某值实例化了。 在程序运行 期间, 一个自由变量可以被实例化而成为约束变量, 反之, 一个 约束变量也可被解除其值而成为自由变量。
[[1, 2], [3, 4, 5], [6, 7]]
都是合法的表。 后一个例子说明, 表也可以嵌套。
第 2 章 逻辑程序设计语言 表的说明方法是在其组成元素的说明符后加一个星号*。 如: domains lists=string* predicates
第 2 章 逻辑程序设计语言
当然, 一个程序不一定要包括上述所有段, 但一个程序 至少要有一个predicates段、clauses段和goal段。 如若省略 goal段, 则可在程序运行时临时给出, 但这仅当在开发环境中
运行程序时方可给出。若要生成一个独立的可执行文件, 则

PL0 编译程序讲解ppt课件

PL0 编译程序讲解ppt课件

{ 读入n } read(n);
{ 递规计算 fact = m! } procedure factorial; begin
if m > 0 then
sum := 0; while n > 0 do
begin m := n; fact := 1;
begin
call factorial;
fact := fact * m;
PL/0编译程序 语法、语义分
析的核心
N 出错
Y 打印错误
可结编束辑课件PPT
20
3.2 PL/0编译程序词法分析的实现
词法分析函数getsym()所识别的单词: 保留字或关键字:如:BEGIN、 END、 IF、 THEN等 运算符: 如:+、-、*、/、:=、#、>=、<=等 标识符: 用户定义的变量名、常数名、过程名 常数: 如:10、25、100等整数 界符: 如:‘,’、‘.’ 、‘;’ 、‘(’ 、
假设A、C同层, 且A中嵌套B
③ 静态链SL—记录定义该过程的直接外层过程数据区的基地址,
以便访问外层数据
可编辑课件PPT
11
运行时数据栈S的变化
T
T
B 的局部变量
var m1,m2,m3;
RA DL
Procedure A; B
SL
var a1;

B
procedure B; var b1,b2; procedure C; …
过程可嵌套定义,内层可引用包围它的外层定义的标识符,可递归调用 数据类型,只有整型 数据结构 ,只有简变和常数 标识符的有效长度是10
语句种类:
begin/end、if、while、赋值、read/write、call、const、var、procedure

PL0

PL0

二、实验原理:就像一个翻译要把汉语翻译成英语,必须对汉语和英语的单词、语法结构都很精通,才有可能翻译得准确无误。

另外,编译程序既然是为了完成这种功能的一个程序,就存在用什么语言来编写这个程序的问题。

这些问题在本节将逐步介绍。

现对PL/0语言编译程序的功能用“T”型图表示,并用图形概括描述PL/0编译程序的结构框架。

用语法图描述语法规则的优点是直观、易读。

在图1.1的语法图中用椭圆和圆圈中的英文字表示终结符,用长方形内的中文字表示非终结符。

所谓终结符,是构成语言文法的单词,是语法成分的最小单位,而每个非终结符也是一个语法成分。

但非终结符可由其它文法符号定义,终结符不能由其它文法符号定义。

例如,程序是由非终结符'分程序'和终结符"."组成的串定义的。

由于对某些非终结符可以递归定义,如图1.1(b)、2.1 (c)、2.1 (e)中:分程序、表达式和语句。

第一个非终结符 '程序'为文法的开始符号。

语句序列分程序1.1(d) 表达式因子如:{*}表示*重复任意次,{*}3表示*重复3-8次。

8[ ] :方括号表示其内的成分为任选项。

( ) :表示圆括号内的成分优先。

例:用EBNF描述<整数>文法的定义:<整数>∷=[+|-]<数字>{<数字>}<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法<整数>∷=[+|-]<非零数字>{<数字>}|0<非零数字>∷=1|2|3|4|5|6|7|8|9<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉 {,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈关系运算符〉∷=#|=|<|<=|>|>=〈条件语句〉∷=IF〈条件〉THEN〈语句〉〈过程调用语句〉∷=CALL〈标识符〉〈当型循环语句〉∷=WHILE〈条件〉DO〈语句〉〈读语句〉∷=READ'('〈标识符〉{,〈标识符〉}')'〈写语句〉∷=WRITE'('〈表达式〉{,〈表达式〉}')'〈字母〉∷=a|b|…|X|Y|Z〈数字〉∷=0|1|2|…|8|9EBNF表示的符号说明。

PL0语言编译器的设计与实现

PL0语言编译器的设计与实现

PL0语⾔编译器的设计与实现⼀、设计任务1.1程序实现要求PL/0语⾔可以看成PASCAL语⾔的⼦集,它的编译程序是⼀个编译解释执⾏系统。

PL/0的⽬标程序为假想栈式计算机的汇编语⾔,与具体计算机⽆关。

PL/0的编译程序和⽬标程序的解释执⾏程序都是⽤JAVA语⾔书写的,因此PL/0语⾔可在配备JDK的任何机器上实现。

其编译过程采⽤⼀趟扫描⽅式,以语法分析程序为核⼼,词法分析和代码⽣成程序都作为⼀个独⽴的过程,当语法分析需要读单词时就调⽤词法分析程序,⽽当语法分析正确需要⽣成相应的⽬标代码时,则调⽤代码⽣成程序。

⽤表格管理程序建⽴变量、常量和过程标⽰符的说明与引⽤之间的信息联系。

⽤出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性质。

当源程序编译正确时,PL/0编译程序⾃动调⽤解释执⾏程序,对⽬标代码进⾏解释执⾏,并按⽤户程序的要求输⼊数据和输出运⾏结果。

1.2 PL/0语⾔的BNF描述(扩充的巴克斯范式表⽰法)<prog> → program <id>;<block><block> → [<condecl>][<vardecl>][<proc>]<body><condecl> → const <const>{,<const>};<const> → <id>:=<integer><vardecl> → var <id>{,<id>};<proc> → procedure <id>([<id>{,<id>}]);<block>{;<proc>}<body> → begin <statement>{;<statement>}end<statement> → <id> := <exp>|if <lexp> then <statement>[else <statement>]|while <lexp> do <statement>|call <id>([<exp>{,<exp>}])|<body>|read (<id>{,<id>})|write (<exp>{,<exp>})<lexp> → <exp> <lop> <exp>|odd <exp><exp> → [+|-]<term>{<aop><term>}<term> → <factor>{<mop><factor>}<factor>→<id>|<integer>|(<exp>)<lop> → =|<>|<|<=|>|>=<aop> → +|-<mop> → *|/<id> → l{l|d} (注:l表⽰字母)<integer> → d{d}注释:<prog>:程序;<block>:块、程序体;<condecl>:常量说明;<const>:常量;<vardecl>:变量说明;<proc>:分程序; <body>:复合语句;<statement>:语句;<exp>:表达式;<lexp>:条件;<term>:项; <factor>:因⼦;<aop>:加法运算符;<mop>:乘法运算符; <lop>:关系运算符。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第18页
词法和词法分析
• 构成程序的基本词法元素包括标识符、运算符、字面量、注释等。 复杂的词(标识符、各种字面量)需要明确定义的构词法,即词法 • 处理源程序的第一步是词法分析: – 编译器处理表示源程序的字符序列,根据词法规则做词法分析,将 源程序切分为符合词法的段,识别出源程序的有意义单词(token) – 词法分析得到一个(表达被分析的源程序的)单词流,流中各单词 标明了词法类别(是“标识符”,“整数”,“加号”,“左括 号”,等等) – 词法分析中抛弃所有无保留价值的分隔符(如空白符)和噪声词 例:对 int main (void) { return 0; } 做词法分析得到的单词序列是: "int" "main" "(" "void" ")" "{" "return" "0" ";" "}" 共10个单词 类别:标识符,左/右圆括号,左/右花括号,整数,分号
第8页
语言设计:目标演化
• 语言设计中需要考虑的另外一些重要问题: – 正常处理的异常/错误处理的良好集成(在产品软件的程序里, 处理错误和各种特殊情况的代码占很大的比例,可能达70%)
– 对于程序的易修改可维护性的支持
– 对于并发程序设计的支持,用什么样的机制支持并发程序设计。 这方面的问题将长期成为语言研究和设计的热点问题
•简单 Simplicity
•高效 Efficiency •灵活性 Flexibility •可扩充性 Extensible •可重用性 Reusable
第10页
•可读性好 Readability •程序质量 Quality •安全性 •并发
2.3 设计准则
• 频度准则:越常用越简单 • 结构一致:程序结构和计算的逻辑结构一致,可读、方便 • 局部性 Locality:
第3页
从内存代表x的地址中取出
值放在运算器中。
加1,将结果放入x地址中。
2.1 表示与抽象
儿子10岁 女儿8岁 母亲35岁 几年后儿 女岁数之 和大于等 于母亲?
u=m-s-d
每人每年增1岁每增 一年比较一次,满足
read(m,s,d); u=m-s-d; print(u) read(m,s,d); u=0; while(m+u>s+d+2u) u++; print(u);
第19页
词法分析
• 词法分析通常采用最长可能原则,确定可能成为单词的最长字符串。 例:staticint是一个标识符,而不是关键字static 和int x+++y (C语言)的分析结果是:x,++,+,y;而不是x,+,++,y x+++++y 是x, ++, ++, +, y(语法错,++ 的运算对象非左值) 早期的Fortran 中存在复杂的词法问题。例如: DO 10 I = 1.5 意思类似于C 语言的DO10I = 1.5 而DO 10 I = 1,5是枚举循环头部, 类似于C 的for (I = 1; I < 5; ++I) ... 后来的语言都避免了这类问题,保证单词很容易识别(能局部识别) 人们已经开发了许多帮助构造词法分析器的自动工具,如lex/flex等
第7页
语言设计:目标演化
2. 提供支持复杂程序所需的高级组织的机制,支持大型程序开发模块机 制(信息隔离和屏蔽),支持分别编译的机制,支持程序的物理组织 3. 支持软件重用,包括软件中的部分的重用,支持通用的基本程序库。 Pascal 失败之处之一就是忽略了库的开发。C/Fortran 都做得很好。Ada 、C++ 和Java 的设计都特别考虑了对库的支持。许多新语言定义了功能 非常丰富的标准程序库。 − 支持库开发:库是最基本的重用方式。是否支持库开发,决定了 语言能否大范围使用。支持用户和第三方供应商开发各种扩充的和专 用的库 − 支持某些层次或者方式的软件部件概念 问题:库开发或者部件是否需要本语言之外的功能? OO 概念可能在上面许多方面起作用,因此成为复杂软件开发的重要方法
– 只有全局变量 Basic
– 不鼓励全局变量 Pascal, C – 无全局变量函数式 Java • 词法内聚 Lexical Coherence : 变量在使用处就近声明(Pascal 声明和语句严格分开) ((lambda (x y) (let ((x 3.5) (y (+ a 2))) (+ (* x y) ((+ (* x y) (- x y))) (- x y))) 3.5 (+ a 2))
• 在字符序列观点向上一层,是把一个程序看着一些词法元素的 序列
– 由程序的字符序列得到词法元素序列的过程就是词法分析
第17页
词法元素
• 标识符:文字形式的词法对象,用于表示 – 语言里的关键字 – 程序对象的名字 • 关键字:语言规定了特殊意义的标识符,如 C 中的 if,while,for • 保留字:语言中规定了特殊意义,而且不允许程序员用于其他用途的标识 符。C 语言的关键字都是保留字,Fortran 没有保留字 • 运算符:有预定义意义的特殊字符或特殊字符序列(可能有标识符) – 运算符的语义就是语言定义的运算(操作),如 Java 的 new – 常规语言用运算符表示各种算术、逻辑运算 • 分隔符:用于分隔程序里的不同词法元素的特殊符号或标识符 – 空格,换行和制表符等,通常作为语法元素的分隔符
λx.λy.((x*y)+(x-y) 3.5 (a+2)
第11页

•语法一致性
GO TO (L1, L2, …, Ln), I GO TO N, (L1, L2, …, Ln) I={1..n}
ASSIGN Li TO N •安全性Security
N={L1...Ln}
语言—编译系统自动找出安全漏洞,不能弥补也要支持 安全性→强类型,即每个计算操作运算之前类型必须确定
文法 产生符合语法的语言(句子集合)规则,如:
• • • • • • G=(S,N,T,P) S∈N,T∩N=Φ* T是终结符号串的有限集。N是非终结符号串的有限集。 T∩N = Φ,即它们是不相交的。S是起始符号串, S∈N。 P是产生式,一般形式是: α→β α,β∈(T∪N)* “→”表示左端可推导出右端, 如α→β, α→Υ, α→δ则可写为:α→β|Υ|δ 如果产生式将语言的非终结符中的每一个标记都推得为终 结符号, 则这一组产生式集即为该语言的全部文法。
– 深层问题
例:C程序里的if 之后是不是左括号,括号是否配对
– 上下文关系 例:变量使用前是否有定义,使用是否符合类型的要求 例:使用变量的值之前,变量是否已经初始化
语言的语法定义通常只描述1(程序形式中的上下文无关部分) 编译程序通常检查条件1和2,有人称2 为“静态语义”
第22页
2.4.1.1 文法
第5页
语言设计:目标演化
• Fortran 设计中最主要的考虑是易用性(与机器和汇编语言比较) 和高效实现,特别关注程序能翻译成高效执行的代码,因为这样 才可能被接受(今天Fortran 仍高效)。 • 随着计算机变得越来越快,越来越便宜,效率问题虽然还是很重 要,但重要性已大大下降。易用性方面的考虑仍非常明显: – 提高程序设计工作的效率 – 帮助人们提高程序(软件)的质量,可靠性 – 设法支持某些高级的软件设计技术 • 语言最主要作用是用于描述所需要的计算过程。为此需要:
C 留给程序员 过程参数不检查 一般不安全
第12页

•正交性和正规性(Orthogonality & Regularity)
正交: 每个语言特征都是独立的, 增减不影响其它
正规: 每一约定或规则无一例外 不正规:数组不能作返回值, 不能赋值 函数不能做参数 不正交→不正规
第13页

•数据隐藏 (Data hiddening) 封装,以名字封装内部数据设计者可见使用者不可见 局部性不一定封装,如: Do 10 I=1, 10, 2
• 同一程序的高级语言表示、经翻译后的 汇编码表示、机器码表示就是该程序在 不同抽象层次上的表示。
第2页
2.1 表示与抽象
• 程序在不同抽象层次表示的关系 • 例:x = x + 1在机器码上就有两种方法。
从内存代表x的地址中取出 值放在运算器中。 加1,将结果放于某临时单元。 将临时单元内容做类型检查 (必要时转换)并放入x中。
第9页
2.2 PL设计目标
定义一组能表示某种范型的特征集,每个特征有严格定 义并可在机器上高效实现,程序员可灵活运用这些特征表 达它所希望的任何计算。 •模型有力 Model Power •语义清晰 Semantic Clarity •移植性好 Portability •方便 Convenience
m s d u
指令集
条件即所求。
客观世界
问题抽象
模型世界
数学模型 模拟模型
程序世界
以程序世界术语 表示描述模型
机器世界
以机器的术语 实现程序
图2-1 计算机解题的四个世界

第4页
2.2 PL设计目标
定义一组能表示某种范型的特征集,每 个特征有严格定义并可在机器上高效实现, 程序员可灵活运用这些特征表达它所希望的 任何计算。
– Java采用Unicode字符集,ASCII之外的字符可用于注释、标识符、字符 和 字符串字面量 – C未规定字符集,要求基本字符集包含大小写字母、数字和29个特殊字 符,其他字符可用在注释、字符和字符串常量里,效果由具体实现解释
相关文档
最新文档