plo
(计算机编程语言)
语音
编辑
锁定
讨论
上传视频
本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
PL0语言是一种类PASCAL语言,是教学用程序设计语言,它比PASCAL语言简单,作了一些限制。PL0的程序结构比较完全,赋值语句作为基本结构,构造概念有顺序执行、条件执行和重复执行,分别由BEGIN/END、IF和WHILE语句表示。
中文名
plo
关系运算符
条件语句文法规则
::=
包 含
唯一的整型
语 言
类PASCAL
ploplo简介
编辑
语音
此外,PL0还具有子程序概念,包括过程说明和过程调用语句。在数据类型方面,PL0只包含唯一的整型,可以说明这种类型的常量和变量。运算符有+,-,*,/,=,<>,,<=,>=,(,)。说明部分包括常量说明、变量说明和过程说明。
plo文法规则
编辑
语音
::=. ::=[;]{;} ::=const{,} ::== ::={} ::=var{} ::={|} ::=
::=procedure
::=|
::=begin{;}end
::=||||
||| ::=:= ::=|odd ::=[+|-]|
::=|
::=||()
::=
::=+|-
::=*|/
::=|<>|>=|<=|=
::=ifthen
::=call
::=whiledo
::=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
plo设计思想
编辑
语音
编译程序的设计可以采用自顶向下和自底向上两种不同的方法。由于许多高级语言(如PASCAL,C)中的语法成分都是递归定义的,PL0也是如此,所以本实验采用递归子程序法,这是一种自顶向下的的编译方法,其基本思想是对源程序的每个(或若干个)语法成分编制一个处理子程序,从处理这个语法成分的子程序开始,在分析过程中调用一系列过程或函数,对源程序进行语法和语义分析,直到整个源程序处理完毕为止。
我们给出用PASCAL语言编写的PL0的编译程序,要求学生先读懂它,然后再用自己熟悉的高级语言改写它,能力强的同学可以按照所学知识,自行设计实现方案。
plo编译程序的功能
编辑
语音
(1)语法分析 对由PL/0语言编制的程序作语法分析,确定是否属于PL/0语言,同时揭示出程序的内在结构。
(2)语法错误检查 根据PL/0语言的文法规则设置检测手段,通过查错子程序和一些查错语句,报告源程序出错位置、性质等,直至整个程序结束为止。 (3)生成目标代码 PL/0语言的目标代码是建立在一个假想的处理机上,此处理机称为PL/0处理机。 (4)执行目标代码 PL/0处理机是一种假想的处理机,其目标代码不能在实际的机器上执行,故此编译程序设置了一个子程序,它对PL/0语言的目标代码逐条解释执行,最后得出所需结果。
plo过程及函数
编辑
语音
在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语言的程序进行编译的目的。
plo编译步骤
编辑
语音
程序中用数组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),否则给出出错信息,结束编译;
⒀解释执行生成的目标代码,列出结果
plo编程注意事项
编辑
语音
PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。
PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现 。其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。
用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。
当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。