〈表达式:=[+|一](项){《加法运算符)(项) (项):=(因子)((乘法运算符)(因子)} 〈因子):=(标识符)(无符号整数)川(?(表达式》) 〈加法运算符):=+1 《乘法运算符):=/ (关系运算符):==|#|<<=>> 〈条件语句):=F(条件)THEN(语句) 过程调用话句):=CALL(标识符) (当型循环语句):=WHILE(条件)DO(语句〉 读语句):=READ(?(标识符){,(标识符)》)' 〈写语句:=WRITE('(表达式){,(表达式)》)? (字母):=ab.XIY|Z (数字):=01|21.819 2.2PL/0编译程序的结构 由2.1节可知,PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译 解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。 PL/O的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语 言可在配备PASCAL语言的任何机器上实现。其编译过程采用一趟扫描方式,以语法分 析程序为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读 单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生 成得序。此外,用表格管理程序律立变量、常量和过程标识符的说明与引用之间的信息联 系。用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错误性 质。当源程序编译正确时,L/0编译程序自动调用解释执行程序,对目标代码进行解释 执行,并按用户程序要求输入数据和输出运行结果。其编译和解释执行的结构图如图2.2 (a)和2.2(b)所示。 L/0源程序 L/O语言目标图序◇PL/0语言解释执行程子 表 阈法分析程序 a 语法分析程序 情处理程序 箱人数据 序 代码生成程序 注:了内的中文表示子程序或过程 目标程序 淡 图2.2(a)PL/0编译程序的结构图 图2.26)PL/0的解释执行结构 PL/0编译程序是用PASCAL语言书写的,整个编译程序(包括主程序)是由18个嵌 。12
套及并列的过程或函数组成,下面分别简要给出这些函数的功能及它们的层次结构,如表 2.1和图2.3所示。 表21PL/0编译程序的过程或函数的功能表 过程或函数名 简要功能说明 p10 主程序 error 出错处理,打印出错位置和结误编码 词法分析,读取一个单词 etch 掉空格,读取 个子 ge 生成目标代码,并送入目标程序区 否合法 enter osition(数 符在名字表中的位置 变量说明处理 出目标 码清单 stateme 语句部分 表达式处理 西甲 用乙味用 nditio 条件处理 对目标代码的解释执行程序 通过静态链求出数据区的基地址 这些过程或函数的嵌套定义层次结构如图2.3所示。 factor 图2.3PL/0编译程序过程与函数定义层次结构图 ·13
由于PL/0编译程序采用一趙扫描方法,所以语法分析过程BLOCK是整个编译过 程的核心。下面我们将在图2.4中先给出编译程序的总体流程,以弄清BLOCK过程在整 个编译程序中的作用。在流程图2.4中可以看出,主程序置初值后先调用读单词过程 GETSYM取一个单词,然后再调用语法分析过程BLOCK,直到遇源程序的结束符“.”为 止。 启动 量初值 调用GETSYM取单词 调用dcK过☐ 当前单词是否 N 为原程序结束符 出错 Y 结来 图24PL/0编译程序总体流程图 2.3PL/0编译程序的词法分析 PL/0的词法分析程序GETSYM(图2.5)是一个独立的过程,其功能是为语法分析 提供单词用的,是语法分析的基础,它把输入的字符串形式的源程序分割成一个个单词符 号。为此PL0编译程序设置了三个全程量的公用单元如下: SYM:存放每个单词的类别,用内部编码形式表示。 1D:存放用户所定义的标识符的值。即标识符字符串的机内表示。 NUM:存放用户定义的数 单词的种类有五种。 基本字:也可称为保留字,如BEGIN,END,IF,THEN等 运算符:如:十、一、/、=、#、>=、<=等。 标识符:用户定义的变量名、常数名,过程名。 常数:如:10,25,100等整数。 界符:如:‘,’、’、'、等。 如果我们把基本字、运算符、界符称为语言固有的单词,而对标识符、常数称为用户定 ·14:
义的单词。那么经词法分析程序分出的单词,对语言固有的单词只给出类别存放在SY 中,而对用户定义的单词(标识符或常数)既给类别又给值,其类别放在SYM中,值放在 ID或NUM中,全部单词种类由编译程序定义的纯量类型SYMBOL给出,也可称为语法 的词汇表。如下面提到的IFSYM,THENSYM,IDENT,NUMBER均属SYMBOL中的 元素。 GETSYM CH CH是字母? GETCH K:=0 H是数字? K<102 拼数,将拼数后的值送 SYM NUMBER GETCH 将其类别送SYM中 ID :=A SYM IDENT 相应保留字类别送SYM☐ 前 图2.5词法分析过程GETSYM 因此词法分析程序GETSYM将完成下列任务: (1)滤空格:空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用 的,所以必须滤掉。 (2)识别保留字:设有一张保留字表。对每个字母打头的字母、数字字符串要查此表。 若查着则为保留字,将对应的类别放在SYM中。如IF对应值IFSYM,THEN对应值为 THENSYM,若查不着,则认为是用户定义的标识符。 (3)识别标识符:对用户定义的标识符将DENT放在SYM中,标识符本身的值放 在D中。 ·15·
(4)拼数:当所取单词是数字时,将数的类别NUMBER放在SYM中,数值本身的值 存放在NUM中. (⑤)拼复合词:对两个字符组成的算符 如:>=、=、<=等单词,识别后将类别送SYM中。 (6)输出源程序:为边读入字符边输出(可输出在文件中)。 由于一个单词往往是由一个或几个字符组成的,所以在词法分析过程GETSYM中 又定义了一个取字符过程GETCH(见图2.6),由词法分析需要取字符时调用。 GETCH 缓冲区中是 香还有字符? N Y 源程序文件 是否结束? 打印出错倍息 K 停止编译☐ C:VPCC 返回 图2.6取字符过程GETCH GETCH所用单元说明: CH:存放当前读取的字符,初值为空。 LINE:为一维数组,其数组元素是字符,界对为1:80。用于读入一行字符的缓冲区 LL和CC为计数器,初值为0。 GETSYM流程图的工作单元说明: A:一维数组,数组元素为字符,界对[1:10]。 ID:同A。 WOD:保留字表,一维数组,数组元素为以字符为元素的一维数组。界对为 [1:13].查表方式采用二分法。 2.4PL/0编译程序的语法分析 语法分析的任务是识别由词法分析给出的单词符号序列在结构上是否符合给定的文 法规则.PL0语言的文法规则已在2.1节中给出。本节将以语法图描述的语法形式为依 据,给出语法分析过程的直观思想。 ·16