91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 5KB
    文件類型: .rar
    金幣: 2
    下載: 0 次
    發布日期: 2021-05-05
  • 語言: 其他
  • 標簽: PL/0??編譯器??

資源簡介

在《算法+數據結構=程序》一書中,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 語言是過程嵌套語言,因此程序運行時,活動記錄棧中每個活動記錄需要包含控制鏈和訪問。活動記錄棧的棧頂以外的存儲空間作為代碼執行過程中所需要的計算棧,無需另外設立計算棧。

資源截圖

代碼片段和文件信息

//?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(“^%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;

????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();
????}els

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----

?????文件???????2804??2011-04-19?21:24??pl0.h

?????文件??????11886??2010-01-28?11:54??pl0.c

????.......???????716??2009-11-26?22:48??tests.pl0

?????文件???????1530??2009-11-09?15:01??multiply.res

?????文件????????281??2009-11-08?22:54??multiply.pl0

-----------?---------??----------?-----??----

????????????????17217????????????????????5


評論

共有 條評論