第2章PL设计概述-程序设计语言原理
- 格式:ppt
- 大小:1.76 MB
- 文档页数:66
程序设计的语言原理是什么程序设计的语言原理是一种用于编写计算机程序的规范、语法和语义规则的体系。
它定义了程序员如何使用特定的语言来描述计算机任务及操作过程。
程序设计语言的原理涉及到计算机科学和语言学等多个领域,包括编译器、解释器、语言运行环境等。
程序设计语言的原理不仅仅是一套编写程序的规则,更是一种表达和交流计算机任务的工具。
它的设计目标是使得程序员可以更加方便、高效地编写、调试和维护程序,同时使程序更具可读性和可移植性。
程序设计语言的原理主要包括以下几个方面:1. 语法规则:程序设计语言的语法规则定义了如何书写程序的语句、表达式和结构。
它规定了程序员可以使用的关键字、运算符、数据类型等,并且定义了这些元素如何组合成有效的程序。
语法规则尽量设计得简洁、易读,以方便程序员理解和书写程序。
2. 语义规则:语法规则只规定了程序的结构,而语义规则则进一步定义了程序元素的含义和行为。
语义规则通常包括类型检查、运算规则、作用域和生命周期等方面。
它保证了程序在执行过程中的正确性和一致性,避免了一些常见的错误和不确定性。
3. 数据结构和算法:程序设计语言的原理还涉及到数据结构和算法的设计。
数据结构定义了程序中存储和操作数据的方式,而算法则描述了解决问题的步骤和过程。
良好的数据结构和算法设计可以提高程序的效率和可维护性,减少资源消耗和开发成本。
4. 编译和解释:程序设计语言的原理还包括编译器和解释器的设计与实现。
编译器将程序源代码转换为机器代码,而解释器则逐行解释执行源代码。
编译器和解释器都需要根据语言规范将程序映射到机器指令,同时进行一系列的语法和语义检查,以保证程序的正确性和安全性。
5. 语言工具和库:程序设计语言的原理也与编程工具和库密切相关。
编程工具如集成开发环境(IDE)、调试器等可以提供开发、测试和调试程序的功能,而库(Library)提供了一组常用的函数和数据结构,简化了程序员的开发工作。
语言工具和库的设计需要考虑到语言的特点和需求,以提高程序员的生产效率。
工程设计语言 p语言PLC常用程序设计语言,工程师必须会!在可编程控制器中有多种程序设计语言,它们是梯形图语言、布尔助记符语言、功能表图语言、功能模块图语言及结构化语句描述语言等。
梯形图语言和布尔助记符语言是基本程序设计语言,它通常由一系列指令组成,用这些指令可以完成大多数简单的控制功能,例如,代替继电器、计数器、计时器完成顺序控制和逻辑控制等,通过扩展或增强指令集,它们也能执行其它的基本操作。
功能表图语言和语句描述语言是高级的程序设计语言,它可根据需要去执行更有效的操作,例如,模拟量的控制,数据的操纵,报表的报印和其他基本程序设计语言无法完成的功能。
功能模块图语言采用功能模块图的形式,通过软连接的方式完成所要求的控制功能,它不仅在可编程序控制器中得到了广泛的应用,在集散控制系统的编程和组态时也常常被采用。
由于它具有连接方便、操作简单、易于掌握等特点,为广大工程设计和应用人员所喜爱。
根据可编程器应用范围,程序设计语言可以组合使用,常用的程序设计语言是:梯形图程序设计语言、布尔助记符程序设计语言(语句表)、功能表图程序设计语言、功能模块图程序设计语言、结构化语句描述程序设计语言、梯形图与结构化语句描述程序设计语言、布尔助记符与功能表图程序设计语言、布尔助记符与结构化语句描述程序设计语言。
1.梯形图(Ladder Diagram)程序设计语言梯形图程序设计语言是用梯形图的图形符号来描述程序的一种程序设计语言。
采用梯形图程序设计语言,程序采用梯形图的形式描述。
这种程序设计语言采用因果关系来描述事件发生的条件和结果。
每个梯级是一个因果关系。
在梯级中,描述事件发生的条件表示在左面,事件发生的结果表示在后面。
梯形图程序设计语言是最常用的一种程序设计语言。
它来源于继电器逻辑控制系统的描述。
在工业过程控制领域,电气技术人员对继电器逻辑控制技术较为熟悉,因此,由这种逻辑控制技术发展而来的梯形图受到了欢迎,并得到了广泛的应用。
编译原理答案(前三章)第 1 章引论第 1 题解释下列术语:答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
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/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 代表六个关系运算符。
二、实验原理:就像一个翻译要把汉语翻译成英语,必须对汉语和英语的单词、语法结构都很精通,才有可能翻译得准确无误。
另外,编译程序既然是为了完成这种功能的一个程序,就存在用什么语言来编写这个程序的问题。
这些问题在本节将逐步介绍。
现对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语⾔编译器的设计与实现⼀、设计任务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>:关系运算符。