pl-0 编译系统.pdf下载分享

资料简介

本文详细介绍了PL/0编译系统的组成及其工作原理,包括PL/0编译程序、类P-code虚拟机等内容。通过具体的PL/0程序示例,如计算最大公约数和阶乘求和,以及对应的类P-code目标代码,帮助读者理解PL/0编译程序的词法分析、语法分析、语义分析、错误处理及目标代码生成等关键环节。适合计算机科学与技术专业的学生和编程爱好者阅读学习。

  • 文件名称:pl-0 编译系统.pdf

  • 文件类型:PDF文档

  • 文件标签:PL/0编译系统、编译原理、P-code虚拟机

pl-0 编译系统.pdf下载分享

百度网盘下载

内容预览

第二讲   PL/0 编译系统 
 PL/0 编译系统组成 

   PL/0 编译程序 
   类 P-code 虚拟机 

输入数据 
输出数据 
PL/0 程序 
类P-code程序 
PL/0 编译程序 
类 P-code 
解释程序 
类P-code 虚拟机 
PL/0编译系统 

   PL/0 编译程序总体结构 
   PL/0 语言描述 
   PL/0 编译程序的词法分析 

   类 P-code 虚拟机 

PL/0编译系统 

   PL/0 编译程序的语法分析 

   PL/0 编译程序的语义分析和符号表 

   PL/0 编译程序的错误处理 

   PL/0 编译程序的目标代码生成 

PL/0 程序示例 
CONST A=1 0;                    /*主程序常量说明部分*/ 
VAR   B,C;                          /*主程序变量说明部分*/ 
PROCEDURE  P;               /*主程序过程说明部分*/ 
      VAR D;                         /*过程P的局部变量说明部分*/ 
      PROCEDURE  Q;        /*过程P的局部过程说明部分*/ 
           VAR X;                    /*过程Q的局部变量说明部分*/ 
           BEGIN 
           READ(X); 
                D:=X; 
                WHILE X#0        
                DO CALL P; 
      END; 
  BEGIN 
        WRITE(D); 
        CALL Q; 
  END 
BEGIN 
 CALL P; 
END. 
P 的过程体 
Q 的过程体 
主程序的过程体 

PL/0 程序示例 

var m, n, r, q; 

{ 计算m和n的最大公约数 } 

procedure gcd; 
    begin 
        while r#0  do  
             begin 
                 q := m / n; 
                  r := m - q * n; 
                 m := n; 
                 n := r; 
             end 
   end; 

begin 
     read(m); 
     read(n); 
     { 为了方便,规定m >= n } 
     if m < n then 
         begin 
              r := m; 
              m := n; 
              n := r; 
         end; 
     begin 
         r:=1 ; 
         call gcd; 
         write(m); 
     end; 
end. 

 计算最大公约数  

PL/0 程序示例 

var n, m, fact, sum; 

{ 递归计算 fact = m! } 
procedure factorial; 
    begin 
        if m > 0 then 
            begin 
                fact := fact * m; 
                m := m - 1 ; 
                call factorial; 
            end; 
    end; 

begin 
     {读入n } 
     read(n); 
     sum := 0; 
     while n > 0 do 
          begin 
               m := n; 
               fact := 1 ; 
               call factorial; 
               sum  := sum + fact; 
               n := n - 1 ; 
          end; 
          {输出n! } 
          write(sum); 
end. 

  计算 

        sum = 1 ! + 2 ! + ... + n!,  
       (n从控制台读入) 

类P-code 

 类 P-code 语言 

   一种栈式机的语言 
     此类栈式机没有累加器和通用寄存器,有一 
     个栈式存储器,有四个控制寄存器(指令寄 
     存器 I,指令地址寄存器 P,栈顶寄存器 T 
     和基址寄存器 B),算逻运算都在栈顶进行 

 指令格式 

f    l    a 

f :
   操作码 

l :    层次差 (标识符引用层减去定义层) 

a :   不同的指令含义不同 

PL/0 程序和目标代码示例 

const  a=1 0; 
var    b,c; 
procedure p; 
  begin 
    c:=b+a; 
  end; 
begin 
  read(b); 
  while b#0 do 
  begin 
    call p; 
    write(2*c); 
    read(b); 
  end 
end. 
( 0) jmp 0 8         转向主程序入口 
( 1 ) jmp 0 2         转向过程p入口 
( 2) int 0 3           过程p入口,为过程p开辟空间 
( 3) lod 1  3          取变量b的值到栈顶 
( 4) lit 0 1 0          取常数1 0到栈顶 
( 5) opr 0 2         次栈顶与栈顶相加 
( 6) sto 1  4          栈顶值送变量c中 
( 7) opr 0 0         退栈并返回调用点(1 6) 
( 8) int 0 5          主程序入口开辟5个栈空间 
( 9) opr 0 1 6       从命令行读入值置于栈顶 
(1 0) sto 0 3        将栈顶值存入变量b中 
(11 ) lod 0 3        将变量b的值取至栈顶 
(1 2) lit 0 0          将常数值0进栈 
(1 3) opr 0 9        次栈顶与栈顶是否不等 
(1 4) jpc 0 24      相等时转(24)(条件不满足转) 
(1 5) cal 0 2         调用过程p 
(1 6) lit 0 2          常数值2进栈 
(1 7) lod 0 4        将变量c的值取至栈顶 
(1 8) opr 0 4        次栈顶与栈顶相乘(2*c) 
(1 9) opr 0 1 4      栈顶值输出至屏幕 
(20) opr 0 1 5      换行 
(21 ) opr 0 1 6      从命令行读取值到栈顶 
(22...

百度网盘下载