主题:请高手帮帮忙!对PL/0语言及其编译器进行扩充和修改(有源代码)
(1) 修改后的PL/0语言文本。包含词法分析(正规式),语法分析(BNF)。
(2) 程序流程图
(3) 有关修改后的PL/0编译/解释器的说明。详细说明你的编译器是如何编译新的PL/0语言程序的。指出你的程序中最精彩的部分,以及你为什么这样做,你是如何控制和恢复语义错误的。
(4) 给出你所改动后的编译器源程序清单,并标记出你所修改的部分。比较你的编译器和原来的编译器之间的差别。
(5) 说明你的编译器中可能存在的错误。
对现存的PL/0编译程序可做如下修改或扩充。
(1) 注释
注释由(*和*)包含,不允许嵌套。
(2) 布尔类型的数据
布尔类型的BNF为:
var_option → ε| var var_decl_list
var_decl_list → var_decl | var_decl_list var_decl
var_decl → ident_list : data_type
data_type → integer | boolean
这种修改包括:
(i) 区别整型与布尔型变量、常量和表达式。
(ii) 增加按严格计算的布尔类型运算符and、or和not。这些算符以及己有的运算符的优先级与Pascal语言相同。
(iii) 能够使用布尔常量true和false。
(iv) 把PL/0语言中的“条件”概念一般化为Pascal语言那样。
(v) 布尔表达式可以比较大小:false < true
(3) 布尔表达式的短路计算(5分)
增加布尔类型(见(2),除(2)的(ii)外),但对and和or采取短路计算。
(4) 数组(10分)
增加由任何数据类型构造的一维数组。数组的下标限于纯量类型。
注意:数组可以由其它的数组来构造,因而必须考虑多维数组的情况。数组的上下界可为任意的纯量常数。
数组的定义如下:
data_type → integer | boolean | array [const..const] of data_type
const → ident | number
语言中允许有数组说明,对数组元素赋值,在表达式中引用数组元素。为了便于解释执行,可能要增加新的PL/0机器操作指令。
(5) 参数 语法同Pascal,采用值-结果方式传递(不用var声明)。
(6) 函数 语法同Pascal。
(7) else子句和repeat语句
(8) for语句,语法参照Pascal或C语言
(9) exit语句(退出当前执行过程)和break语句(跳出包含它的最内层循环),(5分)
(10) 记录(结构),语法同Pascal语言。
(11) 更有力的语法错误恢复机制
(12) 分离解释和编译器
另外,为了实现以上功能,你可任意增加PL/0处理机的指令。但要注意指令的简单与合理。
实现PL/0语言的输入、输出语句。其语法、语义定义和Pascal语言相同。可以仅仅实现一次输入或输出一个值的语句——语句参数固定;也可以实现完全和Pascal语言一样,能够接受任意个数参数的输入或输出语句。