词法分析器C语言
实实一 实法分析器实实
【实实目的】
1,熟悉实法分析的基本原理~实法分析的实程以及实法分析中要注意的实实。
2,实实高实实言~实一步加强用高实实言解实实实实的能力。来决
3,通实完成实法分析程序~了解实法分析的实程。
【实实容】内
用C实言实一写个PL/0实法分析器~实实法实实分析提供实实~使之能把实入的字符串形式的源程序分割成一实实符实实实实法实实分析~把分析实果;个个号并基本字~算符~实实符~常以及界运数
符,实出。
【实实步实和要求】
1.实法分析实程的
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
实
。
2.每模实的源代实个
//实实实字等实实初始化
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]),"program");
strcpy(&(word[10][0]),"var");strcpy(&(word[11][0]),"while");
strcpy(&(word[12][0]),"write");strcpy(&(word[13][0]),"then");
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]=programsym;wsym[10]=varsym;wsym[11]=whilesym;wsym[12]=writesym;wsym[13]=thensym;
}
//实取源文件判实实实实并断
void getsym()
{long m;
char id[al+1],a[al+1];
int i,k,n=0;
init();
if(ch==' '||ch==10||ch==9){ch=fgetc(fin);} //去除空格、制
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
符、实行符
else{
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){ //判是否保留字断
k=0;
do{
if(k
='a'&&ch<='z'||ch>='0'&&ch<='9'||ch>='A'&&ch<='Z');
a[k]=0;
strcpy(id,a);
for(i=0;i='0'&&ch<='9') //判是否字断数
{k=0;
m=0;
sym=number;
do{
m=10*m+ch-'0';
k++;
ch=getc(fin);
}while(ch>='0'&&ch<='9');if(k>=nmax){
printf("\t ERROR!数实太大!\n");}printf("%d\t\t\tnumber(常数)\n",m);
fprintf(fout,"%d\t\t\tnumber(常数)\n",m);
}
else{ //判是否算符、界符断运
if(ch==':'){
ch=getc(fin);
if(ch=='=')
{
sym=becomes;
printf(":=\t\t\tbecomes(运算符,实实)\n");
fprintf(fout,":=\t\t\tbecomes(运算符,实实)\n");
ch=fgetc(fin);
}
else{
sym=nul;
printf(":\t\t\tnul(非法符,冒号)\n");
fprintf(fout,":\t\t\tnul(非法符,冒号)\n");}}
else{
if(ch=='<'){
ch=fgetc(fin);
if(ch=='='){
sym=leq;
printf("<=\t\t\tlep(运算符,小于等于)\n");
fprintf(fout,"<=\t\t\tlep(运算符,小于
等于)\n");
ch=fgetc(fin);}
else{
sym=lss;
printf("<\t\t\tlss(运算符,小于)\n");
fprintf(fout,"<\t\t\tlss(运算符,小
于)\n");}
}
else{
if(ch=='>'){
ch=fgetc(fin);
if(ch=='='){
sym=geq;
printf(">=\t\t\tgeq(运算符,大于等于)
\n");
fprintf(fout,">=\t\t\tgeq(运算
符,大于等于)\n");
ch=fgetc(fin);}
else{
sym=gtr;
printf(">\t\t\tgtr(运算符,大于)\n");
fprintf(fout,">\t\t\tgtr(运算符,大
于)\n");}
}
else{
sym=ssym[ch];
if(ch=='+'){printf("+\t\t\tplus(运算符,加号)\n");
fprintf(fout,"+\t\t\tplus(运号算符,加)\n");ch=fgetc(fin);}
else
if(ch=='-'){printf("-\t\t\tminus(运算符,减号)\n");
fprintf(fout,"-\t\t\tminus(运减算符,号)\n");ch=fgetc(fin);}
else
if(ch=='*'){printf("*\t\t\ttimes(运算符,乘号)\n");
fprintf(fout,"*\t\t\ttimes(运算符,乘号)\n");ch=fgetc(fin);}
else
if(ch=='/'){printf("/\t\t\tslash(运算符,除号)\n");
fprintf(fout,"/\t\t\tslash(运号算符,除)\n");ch=fgetc(fin);}
else
if(ch=='('){printf("(\t\t\tlparen(界符,左括号)\n");
fprintf(fout,"(\t\t\tlparen(界符,左括号)\n");ch=fgetc(fin);}
else
if(ch==')'){printf(")\t\t\trparen(界符,右括号)\n");
fprintf(fout,")\t\t\trparen(界符,右括号)\n");ch=fgetc(fin);}
else
if(ch=='='){printf("=\t\t\teql(运算符,等号)\n");
fprintf(fout,"=\t\t\teql(运算符,等号)\n");ch=fgetc(fin);}
else
if(ch==','){printf(",\t\t\tcomma(运算符,不等号)\n");
fprintf(fout,",\t\t\tcomma(界符,逗号)\n");ch=fgetc(fin);}
else
if(ch=='#'){printf("#\t\t\tneq(运算符,不等号)\n");
fprintf(fout,"#\t\t\tneq(运算符,不等号)\n");ch=fgetc(fin);}
else
if(ch=='.'){printf(".\t\t\tperiod(界符,句号)\n");
fprintf(fout,".\t\t\tperiod(界符,句号)\n");ch=fgetc(fin);}
else
if(ch==';'){printf(";\t\t\tsemicoln(界符,分号)\n");
fprintf(fout,";\t\t\tsemicoln(界符,分号)\n");ch=fgetc(fin);}
else{printf("%c\t\t\tnul(界符,空格)\n",ch);
fprintf(fout,"%c\t\t\tnul(界符,空格)\n",ch);ch=fgetc(fin);}
}}}}}}}
3.实果截实