📄 22.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/*const int*/
#define norw 13
#define txmax 100
#define nmax 14
#define al 10
#define amax 2047
#define levmax 3
#define cxmax 14
enum 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
};
/*typedef alfa char[al+1];*/
char ch;
enum symbol sym;
/*alfa id;*/
char id[al+1];
int num;
int cc; //用于控制每行的单个字符
int ll; //计算每行的字符数
int linec=0;//行的计数器
int lastlinec=0;
int kk;
int cx;
/*alfa a*/
char a[al+1];
char line[82];
/*alfa word[norw+1][];*/
char word[norw+1][al+1]={{""},
{"begin "},{"call "},
{"const "},{"do "},
{"end "},{"if "},
{"odd "},{"procedure "},
{"read "},{"then "},
{"var "},{"while "},
{"write "}};
enum symbol wsym[norw+1];
char tokenword[norw+1][al+1]={{""},
{"beginsym "},{"callsym "},
{"constsym "},{"dosym "},
{"endsym "},{"ifsym "},
{"oddsym "},{"procsym "},
{"readsym "},{"thensym "},
{"varsym "},{"whilesym "},
{"writesym "}};
/*char tokenssym[127][al+1];
tokenssym['+'][al+1]="plus ";
tokenssym['-'][al+1]="minus ";
tokenssym['*'][al+1]="times ";
tokenssym['/'][al+1]="slash ";
tokenssym['('][al+1]="lparen ";
tokenssym[')'][al+1]="rparen ";
tokenssym['='][al+1]="eql ";
tokenssym[','][al+1]="comma ";
tokenssym['.'][al+1]="period ";
tokenssym['#'][al+1]="neq ";
tokenssym[';'][al+1]="semicolon ";*/
symbol ssym[127];/*常用的字符集合是0~127之间*/
int err;
//char inputchgetsym[al+1];
FILE *fa1,*ftoken,*fa2,*fin,*fou;
/*char *changedgtochar(int n)
{
int ni,r;
if(r=n%10)
} */
void error(int n)
{
char ab[10]="error:";
//ab[7]=linec+48;//0--48
printf(" %d line",linec);
//ab[8]=cc-1+48;
printf(" %d column",cc-1);
//ab[9]=n+48;
printf(" error code is %d\n",n);
//fwrite(ab,sizeof(char),10,fa1);
err=err+1;
}
void getchsym()
{
if(cc==ll)
{
//printf("end of a line!");
if(feof(fin))
{
lastlinec=1;
printf("\nprogram incomplete!");
exit(1);
}
ll=0;
cc=0;
while((ch=fgetc(fin))!='\n'&&!feof(fin))
{
ll=ll+1;
/*fputc(ch,fin);*/
printf("%c",ch);
//fputc(ch,fa1);
/*ch=fgetc(fin);*/
/*fputc(ch,fin);*/
/*fputc(ch,fa1);*/
line[ll]=ch;
}
printf("\n");
ll=ll+1;
line[ll]='\n';
linec=linec+1;//出现一行,计数一行
/* fread(&line,sizeof(char),ll,fin);*/
}
cc=cc+1;
ch=line[cc];
// printf("%c",ch);
}
void getsym()
{
int i,j,k;
while(ch==' '||ch=='\x0')/*one problem''ch=='\x0'''是保存在文件中的回车*/
{
getchsym();
}
if (islower(ch))//是ch in ['a'..'z']
{
k=0;
do
{
if (k<al)
{
//k=k+1;
a[k]=ch;
k=k+1;
}
getchsym();
}while(islower(ch)||isdigit(ch));//是not(ch in ['a'..'z','0'..'9'])
if (k>=kk)
kk=k;
else
do
{
a[kk]=' ';
kk=kk-1;
}while(kk>=k);
//与id=a;对应
for(i=0;i<al+1;i++)
{
id[i]=a[i];
//printf("\nid[%d]=%c",i,id[i]);
}
i=1;
j=norw;
do
{
k=(i+j)/2;
if(strcmp(id,word[k])<=0)
{ // printf("%d ",strcmp(id,word[k]));
j=k-1;
}
if(strcmp(id,word[k])>=0)
{
//printf("%d",strcmp(id,word[k]));
i=k+1;
}
}while(i<=j);
// printf("last%d",strcmp(id,word[k]));
if(i-1>j)
{
sym=wsym[k];
fwrite(&tokenword[k],sizeof(char),al+1,ftoken);
return;
}
else
{
sym=ident;
fwrite(&id,sizeof(char),al+1,ftoken);
return;
}
}
if(isdigit(ch))
{
k=0;
num=0;
sym=number;
char numchar[cxmax];//max size of code array
int numnum=0;
//inputchgetsym[]="number ";
//fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
do
{
numchar[numnum]=ch;
numnum++;
num=10*num+ch-'0';//ch-'0'为c语言的特点使用来获得到数值转化
k=k+1;
getchsym();
}while(isdigit(ch));
for(;numnum<cxmax;numnum++)
numchar[numnum]=' ';
fwrite(&numchar,sizeof(char),cxmax,ftoken);
if (k>nmax)
{
error(30);
return;
}
}
else
if (ch==':')
{
getchsym();
if(ch=='=')
{
sym=becomes;
char inputchgetsym[]=":= ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
getchsym();
return;
}
else
{
sym=nul;
char inputchgetsym[]=": ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
return;
}
}
else
if(ch=='<')
{
getchsym();
if(ch=='=')
{
sym=leq;
char inputchgetsym[]="<= ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
getchsym();
return;
}
else
{
sym=lss;
char inputchgetsym[]="< ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
return;
}
}
else
if(ch=='>')
{
getchsym();
if(ch=='=')
{
sym=geq;
char inputchgetsym[]=">= ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
getchsym();
return;
}
else
{
sym=gtr;
char inputchgetsym[]="> ";
fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
return;
}
}
else if(ch=='\n')
getchsym();
else
{
sym=ssym[ch];
char inputchgetsym;
if(sym==plus)
inputchgetsym='+';
if(sym==minus)
inputchgetsym='-';
if(sym==times)
inputchgetsym='*';
if(sym==slash)
inputchgetsym='/';
if(sym==lparen)
inputchgetsym='(';
if(sym==rparen)
inputchgetsym=')';
if(sym==eql)
inputchgetsym='=';
if(sym==comma)
inputchgetsym=',';
if(sym==period)
inputchgetsym='.';
if(sym==neq)
inputchgetsym='#';
if(sym==semicolon)
inputchgetsym=';';
fwrite(&inputchgetsym,sizeof(char),1,ftoken);
getchsym();
return;
}
}
main()
{
char ch,fname1[100]="source.txt",fname2[100]="error.txt",fname3[100]="token.txt";
/*fname[100]="D:\1.txt",fnamee[100];不能使用盘路径*/
char chafou[3]="w";/*写入文件的状态*/
char chafin[3]="r";/*读出文件的状态*/
/*clrscr()*/;
wsym[1]=beginsym;
wsym[2]=callsym;
wsym[3]=constsym;
wsym[4]=dosym;
wsym[5]=endsym;
wsym[6]=ifsym;
wsym[7]=oddsym;
wsym[8]=procsym;
wsym[9]=readsym;
wsym[10]=thensym;
wsym[11]=varsym;
wsym[12]=whilesym;
wsym[13]=writesym;
ssym['+']=plus;
ssym['-']=minus;
ssym['*']=times;
ssym['/']=slash;
ssym['(']=lparen;
ssym[')']=rparen;
ssym['=']=eql;
ssym[',']=comma;
ssym['.']=period;
ssym['#']=neq;
ssym[';']=semicolon;
cc=0;
ll=0;
ch=' ';
kk=al-1;
/*printf("\nEnter a file name :");*/
/*scanf("%s",fname);*/
/*getchar();*/
if((fin=fopen(fname1,chafin))==NULL)
{
printf("open %s file Error.\n",fname1);
exit(0);
}
if((fa1=fopen(fname2,chafou))==NULL)
{
printf("open %s file Error.\n",fname2);
exit(0);
}
if((ftoken=fopen(fname3,chafou))==NULL)
{
printf("open %s file Error.\n",fname3);
exit(0);
}
ch=fgetc(fin);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fin);
}
printf("\nOK! in read.\n");
rewind(fin);
while(lastlinec!=1)
getsym();
fclose(fin);
fclose(fa1);
fclose(ftoken);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -