📄 1.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"pl0.h"
void init ()
{
int i;
for (i=0; i<=20; i++)
{
ssym[i] = " ";
}
ssym[0] = "plus";
ssym[1] = "minus";
ssym[2] = "times";
ssym[3] = "slash";
ssym[4] = "lparen";
ssym[5] = "rparen";
ssym[6] = "eql";
ssym[7] = "comma";
ssym[8] = "period";
ssym[9] = "neq";
ssym[10] = "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;
wsym1[0]="beginsym";
wsym1[1]="callsym";
wsym1[2]="constsym";
wsym1[3]="dosym";
wsym1[4]="endsym";
wsym1[5]="ifsym";
wsym1[6]="oddsym";
wsym1[7]="procsym";
wsym1[8]="readsym";
wsym1[9]="thensym";
wsym1[10]="varsym";
wsym1[11]="whilesym";
wsym1[12]="writesym";
}
void error(int n)
{
space[cc]=0;
printf("****%s!error%d\n",space,n);
fprintf(fa1,"****%s!error%d\n",space,n);
err++;
cspace=0;
memset(space,32,81);
}
void getch()
{
if(cc==ll)
{
if(feof(fin))
{
printf("Program incomplete!");
return;
}
ll=0;
cc=0;
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;
}
void getsym()
{
int i,j,k;
while(ch==' '||ch==10||ch==9)
getch();
if (ch>='a'&&ch<='z')
{
k=0;
do
{
if (k<AL)
{
a[k]=ch;
k++;
}
getch();
}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;
else if (strcmp(id,word[k])>0)
i=k+1;
else if (strcmp(id,word[k])==0)
break;
}while (i<=j);
if (i<=j)
{
sym=wsym[k];
sym1=wsym1[k];
fprintf(fa1,"%4s\t%5s\n",id,sym1);
}
else
{
sym=ident;
sym1="ident";
fprintf(fa1,"%4s\t%5s\n",id,sym1);
}
}
else if (ch>='0'&&ch<='9')
{
k=0;
num=0;
sym=number;
do
{
space[cspace]=ch;
cspace++;
num=10*num+ch-'0';
k=k++;
getch();
if(ch!=10&&(ch>='a'&&ch<='z'))
{
do{
space[cspace]=ch;
cspace++;
getch();
}while(ch!=10&&(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
error(5);
return;
}
}while(ch!=10&&(ch>='0'&&ch<='9')||(ch>='a'&&ch<='z'));
k--;
if(k<=NMAX)
{
sym1="number";
fprintf(fa1,"%13s\t%2d\t\n",sym1,num);
}
if(k>NMAX)
{
error(30);
}
}
else if (ch==':')
{
char b=ch;
getch();
if (ch=='=')
{
sym=becomes;
sym1="becomes";
fprintf(fa1,"%4c%c\t%5s\t\n",b,ch,sym1);
getch();
}
else
{
sym=nul;
sym1="nul";
fprintf(fa1,"%4c\t%5s\t\n",b,sym1);
}
}
else if (ch=='<')
{
char c=ch;
getch();
if (ch=='=')
{
sym=leq;
sym1="leq";
fprintf(fa1,"%4c%c\t%5s\t\n",c,ch,sym1);
getch();
}
else
{
sym=lss;
sym1="lss";
fprintf(fa1,"%4c\t%5s\t\n",c,sym1);
}
}
else if (ch=='>')
{
char d=ch;
getch();
if (ch=='=')
{
sym=geq;
sym1="geq";
fprintf(fa1,"%4c%c\t%5s\t\n",d,ch,sym1);
getch();
}
else
{
sym=gtr;
sym1="gtr";
fprintf(fa1,"%4c\t%5s\t\n",d,sym1);
}
}
else
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='='||ch==','||ch=='.'||ch=='#'||ch==';')
{
ss=ch;
switch(ss)
{
case '+':
s=0;break;
case '-':
s=1;break;
case '*':
s=2;break;
case '/':
s=3;break;
case '(':
s=4;break;
case ')':
s=5;break;
case '=':
s=6;break;
case ',':
s=7;break;
case '.':
s=8;break;
case '#':
s=9;break;
case ';':
s=10;break;
}
sym1=ssym[s];
fprintf(fa1,"%3c\t%5s\t\n",ch,sym1);
}
getch();
}
}
void main()
{
memset(space,32,81);
init ();
printf("请输入文件名:");
scanf("%s",filename);
fin=fopen(filename,"r");
if(fin)
{
fa1=fopen("fa1.txt","w");
err=0;
cc=ll=0;
ch=9;
while(!feof(fin))
{
getsym();
}
fclose(fa1);
fclose(fin);
}
else
printf("不能打开文件!\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -