• 大小: 272KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-04-24
  • 语言: C/C++
  • 标签:

资源简介

这次实验是用C语言对pl/0的编译器进行扩展,实现了一下几个功能: (1)给PL/0语言增加像C语言那样的形式为/ …… /的注释。 (2)给PL/0语言增加带else子句的条件语句和exit语句。 (3)给PL/0语言增加输入输出语句。 (4)给PL/0语言增加带参数的过程。 (5)给PL/0语言增加布尔类型。 (6)给PL/0语言增加数组类型。 (7)给PL/0语言增加函数类型。 (8)给PL/0语言增加实数类型。 (9)分离解释器和编译器为两个独立的程序。 压缩包中还有实验要求以及参考文档等,希望对大家编写pl0编译器有帮助。

资源截图

代码片段和文件信息

// pl/0 compiler with code generation
#include 
#include 
#include 
#include 
#include “pl0.h“

void error(long n){
    long i;

    printf(“ ****“);
    for (i=1; i<=cc-1; i++){
printf(“ “);
    }
    printf(“^%2d\n“n);
    err++;
}

void getch() {          //输出源程序
    if(cc==ll){
if(feof(infile)){
    printf(“************************************\n“);
    printf(“      program incomplete\n“);
    printf(“************************************\n“);
    exit(1);
}
ll=0; cc=0;
printf(“%5d “ cx);
while((!feof(infile))&&((ch=getc(infile))!=‘\n‘)){     //输出一行原代码
    printf(“%c“ch);
    ll=ll+1; line[ll]=ch;
}
printf(“\n“);
ll=ll+1; line[ll]=‘ ‘;
    }
    cc=cc+1; ch=line[cc];
}

void getsym(){
    long ijk;
    int flag=0;
double t=1.0;     //标记小数点后的位数
double numt=0z=0;   //小数部分的值
    while(ch==‘ ‘||ch==‘\t‘){
getch();
    }
    if(isalpha(ch)){  // identified or reserved  开始进行词法分析
k=0;
do{
    if(k a[k]=ch; k=k+1;
    }
    getch();
}while(isalpha(ch)||isdigit(ch));
if(k>=kk){
    kk=k;
}else{
    do{
kk=kk-1; a[kk]=‘ ‘;
    }while(k }
strcpy(ida); i=0; j=norw-1;     //把符号串(如var)放入id中
do{
    k=(i+j)/2;
    if(strcmp(idword[k])<=0){
j=k-1;
    }
    if(strcmp(idword[k])>=0){
i=k+1;
    }
}while(i<=j);      //此循环用于在保留字符表中找到对应的保留字
if(i-1>j){
    sym=wsym[k];  //  sym返回词法单元的类型 如果i-1》j是保留字
}else{
    sym=ident;    //否则是定义的标识符

}
    }else if(isdigit(ch)){ // number
k=0; num=0; 
do{
    num=num*10+(ch-‘0‘);
    k=k+1; getch();
}while(isdigit(ch)); 
if(ch==‘.‘){   //遇到小数点说明是实型数据
getch();
if(isdigit(ch)){
while(isdigit(ch)){
t/=10;
num=num+(ch-‘0‘)*t;
    k++;
getch();
}
    sym=realsym;
}
else if(ch==‘.‘){     //又遇到一个点说明是数组的定义
            sym=intersym;
cc=cc-2;
}
else{
error(57);
}
}
else{
sym=intersym;
}
if(k>nmax){
    error(31);
}
    }else if(ch==‘:‘){
getch();
if(ch==‘=‘){
    sym=becomes; getch();
}else{
    sym=nul;
}
    }else if(ch==‘/‘){   //新增
getch();
if(ch==‘*‘){
flag++;
getch();
while(flag>0){
while(ch!=‘*‘){
getch();
}
getch();
if(ch==‘/‘)
flag--;
}
getch();
getsym();
}
else{
sym=ssym[(unsigned char)‘/‘];
}
}
else if(ch==‘*‘){
getch();
if(ch==‘/‘){
getch();
if(ch==‘*‘){
flag=0;
sym=ssym[(unsigned char)‘*‘];
flag++;
getch();
    while(flag>0){
while(ch!=‘*‘){
getch();
}
getch();
    if(ch==‘/‘)
    flag--;
}
getch();
}
else{
printf(“a superflous note symbol “);
sym=nul;
}
}
else{
sym=ssym[(unsigned char)‘*‘];
}
}
else if(ch==‘<‘){
getch();
    if(ch==‘=‘){
    sym=leq; getch();
}else if(ch==‘>‘){
    sym=neq; getch();
}else{
    sym=lss;
}
    }else i

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      37694  2011-05-15 16:49  PB08210256\编译器\pl0.c

     文件       4636  2011-05-15 09:50  PB08210256\编译器\pl0.h

     文件     143432  2011-05-15 15:21  PB08210256\编译器\PL0编译器.exe

     文件       6239  2011-05-15 10:45  PB08210256\解释器\interpret.cpp

     文件        476  2011-05-15 10:06  PB08210256\解释器\pl0.h

     文件     217160  2011-05-15 10:48  PB08210256\解释器\pl0解释器.exe

     目录          0  2011-05-15 16:51  PB08210256\编译器

     目录          0  2011-05-15 16:51  PB08210256\解释器

     目录          0  2011-05-15 16:51  PB08210256

     文件      20992  2011-05-09 00:50  测试程序.doc

     文件      15360  2011-05-15 16:56  错误记号.doc

     文件     169374  2011-04-14 09:59  project参考资料.pdf

     文件      23552  2011-04-29 00:26  课程实践 (1).doc

----------- ---------  ---------- -----  ----

               638915                    13


评论

共有 条评论

相关资源