#include<stdio.h>
/*#include"pl0.h"*/
#include"string.h"
#include <windows.h>/*PL/0编译系统C版本头文件pl0.h*/
/*typedef enum{false,true}bool;*/
#define norw 13
#define txmax 100
#define nmax 14
#define al 10
#define amax 2047
#define levmax 3
#define cxmax 200enum symbol{nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,
};
#define symnum 32enum object{constant,variable,procedur,
};enum fct{lit,opr,lod,sto,cal,inte,jmp,jpc,
};
#define fctnum 8struct instruction
{enum fct f;int l;int a;
};
FILE* fas;
FILE* fa;
FILE* fa1;
FILE* fa2;
bool listswitch;
bool tableswitch;
char ch;
enum symbol sym;
char id[al+1];
int num;
int cc,ll;
int cx;
char line[81];
char a[al+1];
struct instruction code[cxmax];
char word[norw][al];
enum symbol wsym[norw];
enum symbol ssym[256];
char mnemonic[fctnum][5];
bool declbegsys[symnum];
bool statbegsys[symnum];
bool facbegsys[symnum];struct tablestruct
{char name[al];enum object kind;int val;int level;int adr;int size;
};
struct tablestruct table[txmax];
FILE* fin;
FILE* fout;
char fname[al];
int err;#define getsymdo if(-1==getsym())return -1
#define getchdo if(-1==getch())return -1
#define testdo(a,b,c) if(-1==test(a,b,c))return -1
#define gendo(a,b,c) if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1
#define factordo(a,b,c) if(-1==factor(a,b,c))return -1
#define termdo(a,b,c) if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1
#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1
#define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1
void error(int n);
int getsym();
int getch();
void init();
int gen(enum fct x,int y,int z);
int test(bool* s1,bool* s2,int n);
int inset(int e,bool* s);
int addset(bool* sr,bool* s1,bool* s2,int n);
int subset(bool* sr,bool* s1,bool* s2,int n);
int mulset(bool* sr,bool* s1,bool* s2,int n);
int block(int lev,int tx,bool* fsys);
void interpret();
int factor(bool* fsys,int* ptx,int lev);
int term(bool* fsys,int* ptx,int lev);
int condition(bool* fsys,int* ptx,int lev);
int expression(bool* fsys,int* ptx,int lev);
int statement(bool* fsys,int* ptx,int lev);
void listcode(int cx0);
int vardeclaration(int* ptx,int lev,int* pdx);
int constdeclaration(int* ptx,int lev,int*pdx);
int position(char* idt,int tx);
void enter(enum object k,int* ptx,int lev,int* pdx);
int base(int l,int* s,int b);#define stacksize 500
int main()
{bool nxtlev[symnum];printf("Input pl/0 file?");scanf("%s",fname);fin=fopen(fname,"r");if(fin){printf("List object code? (Y/N)");scanf("%s",fname);listswitch=(fname[0]=='y'||fname[0]=='Y');printf("List symbol table?(Y/N)");scanf("%s",fname);tableswitch=(fname[0]=='y'||fname[0]=='Y');fa1=fopen("fa1.tmp","w");fprintf(fa1,"Input pl/0 file?");fprintf(fa1,"%s\n",fname);init();err=0;cc=cx=ll=0;ch=' ';if(-1!=getsym()){fa=fopen("fa.tmp","w");fas=fopen("fas.tmp","w");addset(nxtlev,declbegsys,statbegsys,symnum);nxtlev[period]=true;if(-1==block(0,0,nxtlev)){fclose(fa);fclose(fa1);fclose(fas);fclose(fin);printf("\n");return 0;}fclose(fa);fclose(fa1);fclose(fas);if(sym!=period){error(9);}if(err==0){fa2=fopen("fa2.tmp","w");interpret();fclose(fa2);}else{printf("Errors in pl/0 program");}}fclose(fin);}else{printf("Can't open file!\n");}printf("\n");return 0;
}
void init()
{int i;for(i=0;i<=255;i++){ssym[i]=nul;}ssym['+']=plus;ssym['-']=minus;ssym['*']=times;ssym['/']=slash;ssym['(']=lparen;ssym[')']=rparen;ssym['=']=eql;ssym[',']=comma;ssym['.']=period;ssym['#']=neq;ssym[';']=semicolon;strcpy(&(word[0][0]),"begin");strcpy(&(word[1][0]),"call");strcpy(&(word[2][0]),"const");strcpy(&(word[3][0]),"do");strcpy(&(word[4][0]),"end");strcpy(&(word[5][0]),"if");strcpy(&(word[6][0]),"odd");strcpy(&(word[7][0]),"procedure");strcpy(&(word[8][0]),"read");strcpy(&(word[9][0]),"then");strcpy(&(word[10][0]),"var");strcpy(&(word[11][0]),"while");strcpy(&(word[12][0]),"write");wsym[0]=beginsym;wsym[1]=callsym;wsym[2]=constsym;wsym[3]=dosym;wsym[4]=endsym;wsym[5]=ifsym;wsym[6]=oddsym;wsym[7]=procsym;wsym[8]=readsym;wsym[9]=thensym;wsym[10]=varsym;wsym[11]=whilesym;wsym[12]=writesym;strcpy(&(mnemonic[lit][0]),"lit");strcpy(&(mnemonic[opr][0]),"opr");strcpy(&(mnemonic[lod][0]),"lod");strcpy(&(mnemonic[sto][0]),"sto");strcpy(&(mnemonic[cal][0]),"cal");strcpy(&(mnemonic[inte][0]),"int");strcpy(&(mnemonic[jmp][0]),"jmp");strcpy(&(mnemonic[jpc][0]),"jpc");for(i=0;i<symnum;i++){declbegsys[i]=false;statbegsys[i]=false;facbegsys[i]=false;}declbegsys[constsym]=true;declbegsys[varsym]=true;declbegsys[procsym]=true;statbegsys[beginsym]=true;statbegsys[callsym]=true;statbegsys[ifsym]=true;statbegsys[whilesym]=true;facbegsys[ident]=true;facbegsys[number]=true;facbegsys[lparen]=true;
}int inset(int e,bool *s)
{return s[e];
}
int addset(bool *sr,bool *s1,bool *s2,int n)
{int i;for(i=0;i<n;i++){sr[i]=s1[i]||s2[i];}return 0;
}
int subset(bool *sr,bool *s1,bool *s2,int n)
{int i;for(i=0;i<n;i++){sr[i]=s1[i]&&(!s2[i]);}return 0;
}
int mulset(bool *sr,bool *s1,bool *s2,int n)
{int i;for(i=0;i<n;i++){sr[i]=s1[i]&&s2[i];}return 0;
}void error(int n)
{char space[81];memset(space,32,81);space[cc-1]=0;printf("****%s!%d\n",space,n);fprintf(fa1,"****%s!%d\n",space,n);err++;
}int getch()
{if(cc==ll){if(feof(fin)){printf("program incomplete");return -1;}ll=0;cc=0;printf("%d",cx);fprintf(fa1,"%d",cx);ch=' ';while(ch!=10){if(EOF==fscanf(fin,"%c",&ch)){line[ll]=0;break;}printf("%c",ch);fprintf(fa1,"%c",ch);line[ll]=ch;ll++;}printf("\n");fprintf(fa1,"\n");}ch=line[cc];cc++;return 0;
}int getsym()
{int i,j,k;while(ch==' '||ch==10||ch==9){getchdo;}if(ch>='a'&&ch<='z'){k=0;do{if(k<al){a[k]=ch;k++;}getchdo;}while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');a[k]=0;strcpy(id,a);i=0;j=norw-1;do{k=(i+j)/2;if(strcmp(id,word[k])<=0){j=k-1;}if(strcmp(id,word[k])>=0){i=k+1;}}while(i<=j);if(i-1>j){sym=wsym[k];}else{sym=ident;}}else{if(ch>='0'&&ch<='9'){k=0;num=0;sym=number;do{num=10*num+ch-'0';k++;getchdo;}while(ch>='0'&&ch<='9');k--;if(k>nmax){error(30);}}else{if(ch==':'){getchdo;if(ch=='='){sym=becomes;getchdo;}else{sym=nul;}}else{if(ch=='<'){getchdo;if(ch=='='){sym=leq;getchdo;}else{sym=lss;}}else{if(ch=='>'){getchdo;if(ch=='='){sym=geq;getchdo;}else{sym=gtr;}}else{sym=ssym[ch];if(sym!=period){getchdo;}}}}}}return 0;
}int gen(enum fct x,int y,int z)
{if(cx>=cxmax){printf("Program too long");return -1;}code[cx].f=x;code[cx].l=y;code[cx].a=z;cx++;return 0;
}int test(bool *s1,bool *s2,int n)
{if(!inset(sym,s1)){error(n);while((!inset(sym,s1))&&(!inset(sym,s2))){getsymdo;}}return 0;
}int block(int lev,int tx,bool *fsys)
{int i;int dx;int tx0;int cx0;bool nxtlev[symnum];dx=3;tx0=tx;table[tx].adr=cx;gendo(jmp,0,0);if(lev>levmax){error(32);}do{if(sym==constsym){getsymdo;do{constdeclarationdo(&tx,lev,&dx);while(sym==comma){getsymdo;constdeclarationdo(&tx,lev,&dx);}if(sym==semicolon){getsymdo;}else{error(5);}}while(sym==ident);}if(sym==varsym){getsymdo;do{vardeclarationdo(&tx,lev,&dx);while(sym==comma){getsymdo;vardeclarationdo(&tx,lev,&dx);}if(sym==semicolon){getsymdo;}else{error(5);}}while(sym==ident);}while(sym==procsym){getsymdo;if(sym==ident){enter(procedur,&tx,lev,&dx);getsymdo;}else{error(4);}if(sym==semicolon){getsymdo;}else{error(5);}memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[semicolon]=true;if(-1==block(lev+1,tx,nxtlev)){return -1;}if(sym==semicolon){getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool)* symnum);nxtlev[ident]=true;nxtlev[procsym]=true;testdo(nxtlev,fsys,6);}else{error(5);}}memcpy(nxtlev,statbegsys,sizeof(bool)* symnum);nxtlev[ident]=true;nxtlev[period]=true;testdo(nxtlev,declbegsys,7);}while(inset(sym,declbegsys));code[table[tx0].adr].a=cx;table[tx0].adr=cx;table[tx0].size=dx;cx0=cx;gendo(inte,0,dx);if(tableswitch){printf("TABLE:\n");if(tx0+1>tx){printf("NULL\n");}for(i=tx0+1;i<=tx;i++){switch(table[i].kind){case constant:printf(" %d const %s ",i,table[i].name);printf(" val=%d\n",table[i].val);fprintf(fas," %d const %s ",i,table[i].name);fprintf(fas," val=%d\n",table[i].val);break;case variable:printf(" %d var %s ",i,table[i].name);printf(" lev=%d addr=%d\n",table[i].level,table[i].adr);fprintf(fas," %d var %s ",i,table[i].name);fprintf(fas," lev=%d addr=%d\n",table[i].level,table[i].adr);break;case procedur:printf(" %d proc %s ",i,table[i].name);printf(" lev=%d addr=%d size=%d\n",table[i].level,table[i].adr,table[i].size);fprintf(fas," %d proc %s ",i,table[i].name);fprintf(fas," lev=%d addr=%d size=%d\n",table[i].level,table[i].adr,table[i].size);break;}}printf("\n");}memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[semicolon]=true;nxtlev[endsym]=true;statementdo(nxtlev,&tx,lev);gendo(opr,0,0);memset(nxtlev,0,sizeof(bool)* symnum);testdo(fsys,nxtlev,8);listcode(cx0);return 0;
}void enter(enum object k,int* ptx,int lev,int* pdx)
{(*ptx)++;strcpy(table[(*ptx)].name,id);table[(*ptx)].kind=k;switch(k){case constant:if(num>amax){error(31);num=0;}table[(*ptx)].val=num;break;case variable:table[(*ptx)].level=lev;table[(*ptx)].adr=(*pdx);(*pdx)++;break;case procedur:table[(*ptx)].level=lev;break;}
}int position(char* idt,int tx)
{int i;strcpy(table[0].name,idt);i=tx;while(strcmp(table[i].name,idt)!=0){i--;}return i;
}int constdeclaration(int* ptx,int lev,int* pdx)
{if(sym==ident){getsymdo;if(sym==eql||sym==becomes){if(sym==becomes){error(1);}getsymdo;if(sym==number){enter(constant,ptx,lev,pdx);getsymdo;}else{error(2);}}else{error(3);}}else{error(4);}return 0;
}int vardeclaration(int* ptx,int lev,int* pdx)
{if(sym==ident){enter(variable,ptx,lev,pdx);getsymdo;}else{error(4);}return 0;
}void listcode(int cx0)
{int i;if(listswitch){for(i=cx0;i<cx;i++){printf("%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);fprintf(fa,"%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);}}
}int statement(bool* fsys,int* ptx,int lev)
{int i,cx1,cx2;bool nxtlev[symnum];if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{getsymdo;if(sym==becomes){getsymdo;}else{error(13);}memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);if(i!=0){gendo(sto,lev-table[i].level,table[i].adr);}}}}else{if(sym==readsym){getsymdo;if(sym!=lparen){error(34);}else{do{getsymdo;if(sym==ident){i=position(id,*ptx);}else{i=0;}if(i==0){error(35);}else{gendo(opr,0,16);gendo(sto,lev-table[i].level,table[i].adr);}getsymdo;}while(sym==comma);}if(sym!=rparen){error(33);while(!inset(sym,fsys)){getsymdo;}}else{getsymdo;}}else{if(sym==writesym){getsymdo;if(sym==lparen){do{getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[rparen]=true;nxtlev[comma]=true;expressiondo(nxtlev,ptx,lev);gendo(opr,0,14);}while(sym==comma);if(sym!=rparen){error(33);}else{getsymdo;}}gendo(opr,0,15);}else{if(sym==callsym){getsymdo;if(sym!=ident){error(14);}else{i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind==procedur){gendo(cal,lev-table[i].level,table[i].adr);}else{error(15);}}getsymdo;}}else{if(sym==ifsym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[thensym]=true;nxtlev[dosym]=true;conditiondo(nxtlev,ptx,lev);if(sym==thensym){getsymdo;}else{error(16);}cx1=cx;gendo(jpc,0,0);statementdo(fsys,ptx,lev);code[cx1].a=cx;}else{if(sym==beginsym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[semicolon]=true;nxtlev[endsym]=true;statementdo(nxtlev,ptx,lev);while(inset(sym,statbegsys)||sym==semicolon){if(sym==semicolon){getsymdo;}else{error(10);}statementdo(nxtlev,ptx,lev);}if(sym==endsym){getsymdo;}else{error(17);}}else{if(sym==whilesym){cx1=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[dosym]=true;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);if(sym==dosym){getsymdo;}else{error(18);}statementdo(fsys,ptx,lev);gendo(jmp,0,cx1);code[cx2].a=cx;}else{memset(nxtlev,0,sizeof(bool)* symnum);testdo(fsys,nxtlev,19);}}}}}}}return 0;
}int expression(bool* fsys,int* ptx,int lev)
{enum symbol addop;bool nxtlev[symnum];if(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);if(addop==minus){gendo(opr,0,1);}}else{memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);}while(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);if(addop==plus){gendo(opr,0,2);}else{gendo(opr,0,3);}}return 0;
}int term(bool* fsys,int* ptx,int lev)
{enum symbol mulop;bool nxtlev[symnum];memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[times]=true;nxtlev[slash]=true;factordo(nxtlev,ptx,lev);while(sym==times||sym==slash){mulop=sym;getsymdo;factordo(nxtlev,ptx,lev);if(mulop==times){gendo(opr,0,4);}else{gendo(opr,0,5);}}return 0;
}int factor(bool* fsys,int* ptx,int lev)
{int i;bool nxtlev[symnum];testdo(facbegsys,fsys,24);while(inset(sym,facbegsys)){if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{switch(table[i].kind){case constant:gendo(lit,0,table[i].val);break;case variable:gendo(lod,lev-table[i].level,table[i].adr);break;case procedur:error(21);break;}}getsymdo;}else{if(sym==number){if(num>amax){error(31);num=0;}gendo(lit,0,num);getsymdo;}else{if(sym==lparen){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[rparen]=true;expressiondo(nxtlev,ptx,lev);if(sym==rparen){getsymdo;}else{error(22);}}testdo(fsys,facbegsys,23);}}}return 0;
}int condition(bool* fsys,int* ptx,int lev)
{enum symbol relop;bool nxtlev[symnum];if(sym==oddsym){getsymdo;expressiondo(fsys,ptx,lev);gendo(opr,0,6);}else{memcpy(nxtlev,fsys,sizeof(bool)* symnum);nxtlev[eql]=true;nxtlev[neq]=true;nxtlev[lss]=true;nxtlev[leq]=true;nxtlev[gtr]=true;nxtlev[geq]=true;expressiondo(nxtlev,ptx,lev);if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq){error(20);}else{relop=sym;getsymdo;expressiondo(fsys,ptx,lev);switch(relop){case eql:gendo(opr,0,8);break;case neq:gendo(opr,0,9);break;case lss:gendo(opr,0,10);break;case geq:gendo(opr,0,11);break;case gtr:gendo(opr,0,12);break;case leq:gendo(opr,0,13);break;}}}return 0;
}void interpret()
{int p,b,t;struct instruction i;int s[stacksize];printf("start pl0\n");t=0;b=0;p=0;s[0]=s[1]=s[2]=0;do{i=code[p];p++;switch(i.f){case lit:s[t]=i.a;t++;break;case opr:switch(i.a){case 0:t=b;p=s[t+2];b=s[t+1];break;case 1:s[t-1]=-s[t-1];break;case 2:t--;s[t-1]=s[t-1]+s[t];break;case 3:t--;s[t-1]=s[t-1]-s[t];break;case 4:t--;s[t-1]=s[t-1]*s[t];break;case 5:t--;s[t-1]=s[t-1]/s[t];break;case 6:s[t-1]=s[t-1]%2;break;case 8:t--;s[t-1]=(s[t-1]==s[t]);break;case 9:t--;s[t-1]=(s[t-1]!=s[t]);break;case 10:t--;s[t-1]=(s[t-1]<s[t]);break;case 11:t--;s[t-1]=(s[t-1]>=s[t]);break;case 12:t--;s[t-1]=(s[t-1]>s[t]);break;case 13:t--;s[t-1]=(s[t-1]<=s[t]);break;case 14:printf("%d",s[t-1]);fprintf(fa2,"%d",s[t-1]);t--;break;case 15:printf("\n");fprintf(fa2,"\n");break;case 16:printf("?");fprintf(fa2,"?");scanf("%d",&(s[t]));fprintf(fa2,"%d\n",s[t]);t++;break;}break;case lod:s[t]=s[base(i.l,s,b)+i.a];t++;break;case sto:t--;s[base(i.l,s,b)+i.a]=s[t];break;case cal:s[t]=base(i.l,s,b);s[t+1]=b;s[t+2]=p;b=t;p=i.a;break;case inte:t+=i.a;break;case jmp:p=i.a;break;case jpc:t--;if(s[t]==0){p=i.a;}break;}}while(p!=0);
}int base(int l,int* s,int b)
{int b1;b1=b;while(l>0){b1=s[b1];l--;}return b1;
}

用C语言写PL0编译器相关推荐

  1. c语言写os 编译器,你真的懂''Hello world''吗?从编译器到OS内核系列:编译器基本概念...

    本文是<你真的理解'Hello world'吗?从编译链接到OS内核系列专题>的第一章的第一小节,主要介绍编译器的基本概念以及C语言程序的构建过程.全系列大纲如下: 前言 第1章 编译器的 ...

  2. C 语言这么厉害,它自身是用什么语言写的?

    作者 | 刘欣 本文经授权转载自码农翻身(ID:coderising) 这是来自我的星球的一个提问:"C语言本身用什么语言写的?" 换个角度来问,其实是:C语言在运行之前,得编译才 ...

  3. C语言这么厉害,它自身又是用什么语言写的?

    这是来自我的星球的一个提问:"C语言本身用什么语言写的?" 换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来? 用什么语言来写的?如果是用C语言本身来写 ...

  4. C语言这么厉害,它自身又是用什么语言写的?编写过程被称为自举!

    来自一个小白的提问:"C语言本身用什么语言写的?" 换个角度来问,其实是:C语言在运行之前,得编译才行,那C语言的编译器从哪里来?用什么语言来写的?如果是用C语言本身来写的,到底是 ...

  5. c语言编译器_学C语言写自己的K语言:编译器词法分析。

    词法分析(lexical analysis),是计算机科学中将字符序列转换为记录(Token)序列化的过程.词法分析一般分手动与自动,自动是基于lex,flex词法分析器使用正则式来配置,我们这里将学 ...

  6. 自己写编译器词法分析c语言,从零开始写个编译器吧 - 开始写词法分析器(3)...

    上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧. 这章将结束词法分析的部分. 在之前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我 ...

  7. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

  8. Go语言写的解析器(支持json,linq,sql,net,http等)

    Monkey程序语言 Monkey v2.0版本已发布. monkey v2.0 增加了如下内容: 新增 short arrow(->)支持(类似C#的lambda表达式) 增加 列表推导和哈希 ...

  9. 精读《手写 SQL 编译器 - 文法介绍》

    1 引言 文法用来描述语言的语法规则,所以不仅可以用在编程语言上,也可用在汉语.英语上. 2 精读 我们将一块语法规则称为 产生式,使用 "Left → Right" 表示任意产生 ...

  10. 从零写一个编译器(完结):总结和系列索引

    前言 这个系列算作我自己的学习笔记,到现在已经有十三篇了,加上这篇一共十四篇.一步一步的从词法分析到语法分析.语义分析,再到代码生成,准备在这一篇做一个总结收尾和一个这个系列以前文章的索引. (另外, ...

最新文章

  1. 向公司讲述虚拟应用价值的技巧
  2. mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
  3. 算法 - 折半查找(C#)
  4. 不限制内存用桶排序PHP
  5. BOOST_CONSTANTS_GENERATE宏相关用法的测试程序
  6. svn 与 vs2010
  7. 全局替换安卓应用字体
  8. 华为诉争“鸿蒙HongMeng”商标再被驳回;比尔盖茨夫妇正式离婚;iOS 15“查找”新功能,关机也能用|极客头条...
  9. C++11 函数模板的默认模板参数
  10. Java NIO深入(Buffer)-我们到底能走多远系列(18)
  11. 机器学习与深度学习基本概念 学习笔记
  12. Java 正则表达式,正则表达式匹配a标签下的链接,正则表达式基础
  13. spss19 视频教程下载_19个网站免费下载股票视频介绍和录像
  14. 博士申请 | 西湖大学智能无人系统实验室招收空中机器人方向全奖博士生
  15. Kettle【实践 04】Java环境实现KJB和KTR脚本文件执行v9版本9.0.0.0-423相关依赖说明(云资源分享:依赖包+kjb+ktr+测试源码)
  16. 什么是全栈工程师 摘自360
  17. 安装MySQL---已删除服务,却显示服务已存在
  18. Debian 10安装教程
  19. 【小程序】拼多多领劵小程序修复版分享
  20. java反射机制的实现原理 (一)

热门文章

  1. 金融福尔摩斯修炼册-FULL GC篇
  2. [附源码]Java计算机毕业设计SSM儿童救助系统
  3. 谱悦‍供86盒式紧急报警拾音器对讲 高保真拾音器 窗口降噪高保真 银行ATM机对讲 报警按钮...
  4. PCA算法主要用于降维,就是将样本数据从高维空间投影到低维空间中
  5. java继承父类注解,看看这篇文章吧!
  6. JS基础学习笔记(看珠峰视频记录)
  7. 文件大小的计算与有意思的显示
  8. php护肤品在线销售系统毕业设计(附源码、运行环境)
  9. LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)
  10. 用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放