种豆资源网

当前位置:首页 > 百科 > 百科综合 / 正文

plo(计算机程式语言)

(2019-04-13 19:43:57) 百科综合

plo(计算机程式语言)

PL0语言是一种类PASCAL语言,是教学用程式设计语言,它比PASCAL语言简单,作了一些限制。PL0的程式结构比较完全,赋值语句作为基本结构,构造概念有顺序执行、条件执行和重複执行,分别由BEGIN/END、IF和WHILE语句表示。

基本介绍

  • 中文名:plo
  • 关係运算符:条件语句
  • 文法规则:<程式>::=<分程式>
  • 包含:唯一的整型
  • 语言:类PASCAL

plo简介

此外,PL0还具有子程式概念,包括过程说明和过程调用语句。在数据类型方面,PL0只包含唯一的整型,可以说明这种类型的常量和变数。运算符有+,-,*,/,=,<>,<,>,<=,>=,(,)。说明部分包括常量说明、变数说明和过程说明。

文法规则

<程式>::=<分程式>. <分程式>::=[<常量说明部分);][<变数说明部分>;]{<过程说明部分>;}<语句部分> <常量说明部分>::=const<常量定义>{,<常量定义>} <常量定义>::=<标识符>=<无符号整数> <无符号整数>::=<数字>{<数字>} <变数说明部分>::=var<标识符>{<标识符>} <标识符>::=<字母>{<字母>|<数字>} <过程说明部分>::=<过程首部><分程式>
<过程首部>::=procedure<标识符>
<语句部分>::=<语句>|<複合语句>
<複合语句>::=begin<语句>{;<语句>}end
<语句>::=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|
<读语句>|<写语句>|<複合语句>|<空语句> <赋值语句>::=<标识符>:=<表达式> <条件>::=<表达式><关係运算符><表达式>|odd<表达式> <表达式>::=[+|-]<项>|<表达式><加法运算符><项>
<项>::=<因子>|<项><乘法运算符><因子>
<因子>::=<标识符>|<常量>|(<表达式>)
<常量>::=<无符号整数>
<加法运算符>::=+|-
<乘法运算符>::=*|/
<关係运算符>::=<|>|<>|>=|<=|=
<条条件语句>::=if<条件>then<语句>
<过程调用语句>::=call<标识符>
<当型循环语句>::=while<条件>do<语句>
<读语句>::=read(<标识符>{,<标识符>})
<写语句>::=write(<表达式>{,<表达式>})
<字母>::=a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z

设计思想

编译程式的设计可以採用自顶向下和自底向上两种不同的方法。由于许多高级语言(如PASCAL,C)中的语法成分都是递归定义的,PL0也是如此,所以本实验採用递归子程式法,这是一种自顶向下的的编译方法,其基本思想是对源程式的每个(或若干个)语法成分编制一个处理子程式,从处理<程式>这个语法成分的子程式开始,在分析过程中调用一系列过程或函式,对源程式进行语法和语义分析,直到整个源程式处理完毕为止。
我们给出用PASCAL语言编写的PL0的编译程式,要求学生先读懂它,然后再用自己熟悉的高级语言改写它,能力强的同学可以按照所学知识,自行设计实现方案。

编译程式的功能

(1)语法分析 对由PL/0语言编制的程式作语法分析,确定是否属于PL/0语言,同时揭示出程式的内在结构。
(2)语法错误检查 根据PL/0语言的文法规则设定检测手段,通过查错子程式和一些查错语句,报告源程式出错位置、性质等,直至整个程式结束为止。 (3)生成目标代码 PL/0语言的目标代码是建立在一个假想的处理机上,此处理机称为PL/0处理机。 (4)执行目标代码 PL/0处理机是一种假想的处理机,其目标代码不能在实际的机器上执行,故此编译程式设定了一个子程式,它对PL/0语言的目标代码逐条解释执行,最后得出所需结果。

过程及函式

在PL/0语言的编译文本中,除了常量和变数说明外,共有18个相互嵌套或并列的过程(或函式)。现对这些过程和函式作扼要说明。
(1)error(n):其功能是报告PL/0源程式的出错信息。n为错误类型号,共可查出36种错误。
(2)getsym:词法分析子程式。其功能为读单词。
getch:读字元子程式。它嵌套于读单词子程式中。
(3)gen(x,y,z),伪代码生成子程式。其功能是根据不同的x、y、z生成不同的伪代码。x表示指令码,y表示层差,z表示位移量或数。
(4)test(sl,s2,n):查错子程式。其功能是检测源程式中的语法错误。s1为可允许的下一个符号的集合。如当前符号不在此集合内,立即得到了一个错误。s2为另加的停止符号集,这些符号的出现虽然无疑是错的,但是它们绝不应被忽略而跳过。n表示错误的类型号。
(5)block(1ev,tx,fsys):分程式处理模组。其功能为对分程式进行处理。lev表示层差,tx表示标识符表的下标,fsys是符号集,表示可能出现的符号。
分程式处理模组是整个编译程式的核心,它包含以下的过程和函式。
①enter(k):其功能是造符号表table。k表示符号的类型,其取值範围是(constant, variable,proceable),即此子程式对常量、变数和过程造符号表table,以备检查标识符是否说明过。
②position(id):其功能是查符号表,它是一个函式。 id是所检查的标识符,若查到则给出标识符id在标识符表中的位置,否则给0。
③constdeclaration:常量造表子程式。其功能是为常量造一张常量表,内填常量名、常量值。它通过调用子程式enter(k)完成,此时k=constant。
④vardeclaration:变数造表子程式。其功能是为变数造一张变数表,内填变数名、所处层号。它也是通过调用子程式enter(k)来完成的,此时k=variable。
⑤listcode,列印(伪)代码子程式。其功能是输出生成的目标代码。
⑥statement(fsys):语句处理子程式。其功能是处理语句,它是递归调用的核心部分。其递归调用顺序如下:
expression(fsys):处理算术表达式子程式;
term(fsys):处理项子程式;
condition(fsys):处理因子子程式。
(6)interpret,执行目标代码子程式。其功能是对编译过程中生成的目标代码(伪代码)逐条解释执行。
base(l):提供计算静态链信息子程式。它为过程调用提供调用所需的基地址。
整个PL/0编译程式通过主程式调用分程式处理模组block,再通过block递归调用上述的子程式,达到对PL/0语言的程式进行编译的目的。

编译步骤

程式中用数组word存贮PL/0语言的所有保留字。保留字有begin、call、const、do、end、if、odd、procedure、read、then、var、while、write;
用数组swym存贮保留字所对应的符号表symbol中的符号;
用数组ssym存贮关係运算符及特殊符号+、-、*、/、(、)、=、,、<、>及;所对应的符号表symbol中的符号;
用数组mnemonic存贮目标代码的指令码部分。
其具体步骤如下:
①在主程式中给出编译程式所需的初始值。置字元字数cc、行长ll、代码分配下标cx、错误个数err等为0。调getsym读单词;
②调block模组,进入分程式处理;
③判断所读单词是否为常量说明符号constsym,是则转4),否则转5)。
④读单词并作常量说明处理;查所读单词是否为“,”,是则重複本步;否则判断此单词是否为“;”,是则读单词,否则给出出错信息。进行下一步;
⑤所读单词是否为变数说明符号variable,是则读单词并作变数说明处理,再读单词并判断是否为“,”,是则重複本步;否则判断此单词是否为“;”,是则读单词,否则给出出错信息。进行下一步;
⑥cxl:=cx,并生成jmp 0,0指令,判断所读单词是否为过程说明符号proceduresym,是则读单词转7),否则转11);
⑦判断所读单词是否为标识符,是则转8),否则给出出错信息再进行下一步;
⑧标识符填表,再读单词。判断所读单词是否为“;”,是则读单词,否则给出出错信息。进行下一步;
⑨递归调用分程式处理子程式block;
⑩最近所读单词是否为“;”,是则继续读一单词,否则给出出错信息。转6);
⑾code[cxl].a:=cx,生成分配局部变数指令,语句处理,生成opr 0,0指令;
⑿返回主程式,err是否为0,是则调子程式interpret,转13),否则给出出错信息,结束编译;
⒀解释执行生成的目标代码,列出结果

编程注意事项

PL/0语言可以看成PASCAL语言的子集,它的编译程式是一个编译解释执行系统。PL/0的目标程式为假想栈式计算机的彙编语言,与具体计算机无关。
PL/0的编译程式和目标程式的解释执行程式都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现 。其编译过程採用一趟扫描方式,以语法分析程式为核心,词法分析和代码生成程式都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程式,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程式。
用表格管理程式建立变数、常量和过程表示符的说明与引用之间的信息联繫。
当源程式编译正确时,PL/0编译程式自动调用解释执行程式,对目标代码进行解释执行,并按用户程式的要求输入数据和输出运行结果。

标 签

搜索
随机推荐

Powered By 种豆资源网||