• 大小: 155KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-10
  • 语言: C/C++
  • 标签: 编译器  pl0  C语言  

资源简介

C语言编写的pl0语言编译器 pl0作为编译原理最基础的学习编译原理的一个完备语言,最适合作为编写编译器的入门语言。

资源截图

代码片段和文件信息

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

void error(long n){
    long i;

    printf(“ ****“);
    for (i=1; i<=cc-1; i++){
printf(“ “);
    }
    printf(“^%2ld\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(“%5ld “ 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;

    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;
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];
}else{
    sym=ident;
}
    }else if(isdigit(ch)){ // number
k=0; num=0; sym=number;
do{
    num=num*10+(ch-‘0‘);
    k=k+1; getch();
}while(isdigit(ch));
if(k>nmax){
    error(31);
}
    }else if(ch==‘:‘){
getch();
if(ch==‘=‘){
    sym=becomes; getch();
}else{
    sym=nul;
}
    }else if(ch==‘<‘){
getch();
if(ch==‘=‘){
    sym=leq; getch();
}else if(ch==‘>‘){
    sym=neq; getch();
}else{
    sym=lss;
}
    }else if(ch==‘>‘){
getch();
if(ch==‘=‘){
    sym=geq; getch();
}else{
    sym=gtr;
}
    }else{
sym=ssym[(unsigned char)ch]; getch();
    }
}

void gen(enum fct x long y long z){
    if(cx>cxmax){
printf(“program too long\n“);
exit(1);
    }
    code[cx].f=x; code[cx].l=y; code[cx].a=z;
    cx=cx+1;
}

void test(unsigned long s1 unsigned long s2 long n){
    if (!(sym & s1)){
error(n);
s1=s1|s2;
while(!(sym & s1)){
    getsym();
}
    }
}

void enter(enum object k){ // enter object into table
    tx=tx+1;
    strcpy(table[tx].nameid);
    table[tx].kind=k;
    switch(k){
case constant:
    if(num>amax){
error(31);
num = 0;
    }
    table[tx].val=num;
    break;
case variable:
    table[tx].level=lev; table[tx].addr=dx; dx=dx+1;
    break;
case proc:
    table[tx].level=lev;
    break;
    }
}

long position(char* id){ // find identifier id in table
    long i;

    strcpy(table[0].nameid);
    i=tx;
    while(strcmp(table[i].nameid)!=0){
i=i-1;
    }
    return i;
}

void constdeclaration(){
    if(sym==ident){
getsym();
if(sym==eql||sym==becomes){
    if(sym==becomes){
error(1);
    }
    getsym();
    if(sym==number){
enter(constant); getsym();
    }e

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2804  2012-02-12 09:30  pl0\include\pl0.h
     文件       11892  2012-02-12 09:30  pl0\src\pl0.c
     文件         281  2012-02-12 09:30  pl0\sample\multiply.pl0
     文件        1530  2012-02-12 09:30  pl0\sample\multiply.res
     文件         716  2012-02-12 09:30  pl0\sample\tests.pl0
     文件        4481  2012-02-12 09:30  pl0\sample\tests.res
     文件      162903  2012-02-13 01:41  pl0\doc\pl0.pdf
     文件         408  2012-02-12 09:30  pl0\Makefile
     文件         130  2012-02-12 09:30  pl0\make.simple
     文件        1787  2012-02-13 01:46  pl0\README
     目录           0  2012-02-12 09:30  pl0\include\
     目录           0  2012-02-12 09:30  pl0\src\
     目录           0  2012-02-12 09:30  pl0\sample\
     目录           0  2012-02-12 09:31  pl0\test\
     目录           0  2012-02-13 01:45  pl0\doc\
     目录           0  2012-02-13 01:46  pl0\

评论

共有 条评论