PL/0语言编译程序整理实现:(9)、错误信息

unit uErrorInfo;

 

interface

 

const

    CNT_Error1 = '程序编译失败';

    CNT_Error2 = '数值溢出';

    CNT_Error3 = '无效字符';

    CNT_Error4 = '代码太长';

    CNT_Error_1 = 'Error 01:  常数说明中“=”写成“:=';

    CNT_Error_2 = 'Error 02:  常数说明中的“=”后应为数字';

    CNT_Error_3 = 'Error 03:  常数说明中的标识符后应是“=';

    CNT_Error_4 = 'Error 04:  const,var,procedure后应为标识符';

    CNT_Error_5 = 'Error 05:  漏掉了‘,’或‘;';

    CNT_Error_6 = 'Error 06:  过程说明后的符号不正确(应是语句开始符或过程开始符)';

    CNT_Error_7 = 'Error 07:  应是语句开始符';

    CNT_Error_8 = 'Error 08:  过程体内语句部分的后跟符不正确';

    CNT_Error_9 = 'Error 09:  程序结尾丢了句号‘.';

    CNT_Error_10 = 'Error 10:  语句之间漏了‘;';

    CNT_Error_11 = 'Error 11:  标识符没说明';

    CNT_Error_12 = 'Error 12:  赋值语句中,赋值号左部标识符属性应是变量';

    CNT_Error_13 = 'Error 13:  赋值语句左部标识符应是赋值号‘:=';

    CNT_Error_14 = 'Error 14:  call后应为标识符';

    CNT_Error_15 = 'Error 15:  call后标识符属性应为过程';

    CNT_Error_16 = 'Error 16:  条件语句中丢了then';

    CNT_Error_17 = 'Error 17:  丢了end;';

    CNT_Error_18 = 'Error 18:  while型循环语句中丢了do';

    CNT_Error_19 = 'Error 19:  语句后的标识符不正确';

    CNT_Error_20 = 'Error 20:  应为关系运算符';

    CNT_Error_21 = 'Error 21:  表达式内标识符属性不能是过程';

    CNT_Error_22 = 'Error 22:  表达式中漏掉了右括号‘)';

    CNT_Error_23 = 'Error 23:  因子后的非法符号';

    CNT_Error_24 = 'Error 24:  表达式开始符不能是此符号';

    CNT_Error_25 = 'Error 25:  文件在不该结束的地方结束了';

    CNT_Error_26 = 'Error 26:  结束符出现在不该结束的地方';

    CNT_Error_27 = 'Error 27:  过程嵌套层数太多';

    CNT_Error_28 = 'Error 28:  repeat语句中缺少until';

    CNT_Error_29 = 'Error 29:  write语句中漏掉了右括号‘)';

    CNT_Error_30 = 'Error 30:  数组缺少右括号‘]';

    CNT_Error_31 = 'Error 31:  数越界';

    CNT_Error_32 = 'Error 32:  read语句括号中标识符不是变量';

    CNT_Error_33 = 'Error 33:  read语句中漏掉了左括号‘(';

    CNT_Error_34 = 'Error 34:  read语句中漏掉了右括号‘)';

    CNT_Error_35 = 'Error 35:  数组维数应为数字';

    CNT_Error_36 = 'Error 36:  数组缺少左括号‘[';

    CNT_Error_37 = 'Error 37:  数组越界';

 

 

implementation

 

end.

在《算法+数据结构=程序》一书中,Niklaus Wirth 设计的 PL/0 语言编译器分成两部分,把源语言翻译成中间语言的编译器和中间语言解释器,编译器用的是递归下降的预测分析方法中间语言是一种栈机器代码,其指令集是根据 PL/0 语言的需要来设计的。编译器源码及测试程序可从。一条指令由三个域组成: (1)操作码 f:上面已经列出了所有 8 种操作码。 (2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a 。该域仅用于存取指令和调用指令。 (3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。 编译器对 PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,编译器每编译完一个分程序,就列出该分程序的代码,这由编译器的 listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的代码(即绕过内嵌过程的代码)。listcode 过程没有列出这条代码。 解释器是编译器中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。 由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问。活动记录栈的栈顶以外的存储空间作为代码执行过程中所需要的计算栈,无需另外设立计算栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值