#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include"Compiler.h"
char name[MAXC][MAXWORD]; //用来存储标识符
int NumOfC=1; //符号表内元素的个数
Character Symlist[MAXC]; //符号表
int numoflev[MAXLEV]; //各层的表中变量数
opr pcode[MAXOP]; //存Pcode指令
int oprnum; //指令数
int stack[MAXGO]; //Pcode解释执行阶段的堆栈
int dl[MAXGOLEV],bl[MAXGOLEV]; //stack堆栈运行过程中的指针
int linenum=1; //源程序每行的代号
int errornum=0,error[MAXERROR],errorline[MAXERROR];
int gonum=0,dlnum=0,blnum=0;
int type=0;
int snum=0;
int start;
int lev=1;
int breakopr,Isbreak=0;
int typeofexp1=11, typeofexp2=12;
int oprnumcase=0;
int Isret=1;
//字符获取和处理
int getsym()
{
char ch,tmp;
int i,j,m;
ch=fgetc(FIN);
while(isspace(ch))//处理空格
{
putc(ch,FOUT);
if(ch=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
ch=fgetc(FIN);
}
i=0;
Word[i]=ch;
i++;
//token处理
if(isalpha(ch))
{
putc(ch,FOUT);
ch=fgetc(FIN);
while(isalpha(ch)||isdigit(ch)||(ch=='_')) //加入下划线
{
Word[i]=ch;
i++;
/*if(i==MAXWORD)
{
errorline[errornum]=linenum;
error[errornum++]=1;
i--;
Word[i]='\0';
putc(ch,FOUT);
ch=fgetc(FIN);
while(isalpha(ch)||isdigit(ch))
{
putc(ch,FOUT);
}
ungetc(ch,FIN);
return 1;//是标识符
}*/
putc(ch,FOUT);
ch=fgetc(FIN);
}
ungetc(ch,FIN);
Word[i]='\0';
for(m=0;m<kk;m++)
{
if(!(strcmp(Keyword[m],Word))) //读取的字符串符合对key word的判断
{
if(m+10==12)
return 1;
return m+10;//返回相应的keyword的对应数字
}
}
if(m==kk){
return 1;//不是key word,是标识符
}
}
//数值处理
if(isdigit(ch))
{
putc(ch,FOUT);
while(isdigit((ch=fgetc(FIN))))
{
putc(ch,FOUT);
Word[i++]=ch;
if(i==MAXWORD)
{
errorline[errornum]=linenum;
error[errornum++]=1;
Word[--i]='\0';
ch=fgetc(FIN);
while(isdigit(ch))
{
putc(ch,FOUT);
}
num=atoi(Word);//将字符串转化为对应的数字
ungetc(ch,FIN);
return 2;//是数字
}
}
ungetc(ch,FIN);
Word[i]='\0';
num=atoi(Word);//将字符串转化为对应的数字
return 2;//是数字
}
//分界符
i=34;
putc(ch,FOUT);
switch(ch){
case'\'':
ch=fgetc(FIN);
if(ch=='+'||ch=='-'||ch=='*'||ch=='\''||isalpha(ch)) //对应于printf语句中的各种参数
{
cischar=ch;
putc(ch,FOUT);
if ((ch=fgetc(FIN))=='\'')
{
putc(ch,FOUT);
return 4;//字符
}
else
{
putc(ch,FOUT);
errorline[errornum]=linenum;
error[errornum++]=3;
return -1;
}
}
case'"':
j=0;
while((ch=fgetc(FIN))!='"')//若不是非空串
{
putc(ch,FOUT);
sisstring[j++]=ch;
if(j==MAXLENGTH)
{
printf("warning!字符串过长\n");
sisstring[--j]='\0';
putc(ch,FOUT);
ch=fgetc(FIN);
while(ch!='"')
{
putc(ch,FOUT);
j++;
if(ch==EOF||j>100) //字符串过长或缺少反引号
{
errorline[errornum]=linenum;
error[errornum++]=5;
return -1;
}
}
return 5;//返回字符串
}
}
putc(ch,FOUT);
sisstring[j]='\0';//字符串结尾
return 5;//返回空字符串
case'}':
return 35;
case'(':
i++;
return 37;
case')':
i++;
return 36;
case';':
i++;
return 38;
case',':
i++;
return 39;
case '{':
i++;
return 40;
case'/':
if((ch=getc(FIN))=='/')//若为单行注释标志
{
putc(ch,FOUT);
while((ch=fgetc(FIN))!='\n')
putc(ch,FOUT);//注释内容不处理,直接输出
putc(ch,FOUT);
linenum++;
printf("%d:\t",linenum);
return (getsym());//递归调用,处理下一行代码
}
ungetc(ch,FIN);
return 34; //仅为/
case'*':
return 33;
case '-':
case'+'://之前为=或者(时才认为是+int否则是加号
//if(sym!=0&&sym!=1&&sym!=2)//不在等式中
tmp=ch;
j=0;
Word[j++]=ch;
ch=fgetc(FIN);
if(isdigit(ch)&&(sym==51||sym==37))
{
Word[j++]=ch;
putc(ch,FOUT);
while(isdigit(ch=fgetc(FIN)))
{
Word[j++]=ch;
putc(ch,FOUT);
if(i==MAXWORD)
{
errorline[errornum]=linenum;
error[errornum++]=1;
Word[--j]='\0';
ch=fgetc(FIN);
while(isdigit(ch))
{
putc(ch,FOUT);
}
num=atoi(Word);
ungetc(ch,FIN);
return 2;//带符号的数字
}
}
ungetc(ch,FIN);
Word[j]='\0';
num=atoi(Word);
return 2;//带符号的数字
}
else //是运算符
{
ungetc(ch,FIN);
ch=tmp;
if(ch=='-')
return 32;
if(ch=='+')
return 31;
}
case'<':
if((ch=fgetc(FIN))=='=')
{
putc(ch,FOUT);
return 50;// <=
}
else{
ungetc(ch,FIN);
return 46;// <
}
case'>':
if((ch=fgetc(FIN))=='=')
{
putc(ch,FOUT);
return 49;// >=
}
else
{
ungetc(ch,FIN);
return 45;// >
}
case'=':
if((ch=fgetc(FIN))=='=')
{
putc(ch,FOUT);
return 47;// ==
}
else
{
ungetc(ch,FIN);
return 51;// =
}
case'!':
if((ch=fgetc(FIN))=='=')
{
putc(ch,FOUT);
return 48;// !=
}
else
{ //不存在单独的!作为操作符
ungetc(ch,FIN);
errorline[errornum]=linenum;
error[errornum++]=2;
}
}
return 0;//出错
}
//分析程序
int program()
{
int i;
char c;
printf("%d:\t",linenum);
sym=getsym();
if(sym==10)
{
sym=11;
if(constdeclaration())
{
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
}
def: if(sym==11)
{
i=sym;
sym=getsym();
if(sym==1)
{
strcpy(name[NumOfC],Word);
sym=getsym();
if(sym!=39&&sym!=38&&sym!=37)
{
errorline[errornum]=linenum;
error[errornum++]=22;
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
if(sym==38||sym==39) //变量定义
{
if( vardefine(i))
{
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
}
while(sym==37) //return function
{
if(returnfunction(i))
{
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
if(sym==11||sym==12)
{
sym=getsym();
if(sym==1)
{
strcpy(name[NumOfC],Word);
if((sym=getsym())==37)
continue;
else
{
errorline[errornum]=linenum;
error[errornum++]=17;
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=27;
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
}
else
break;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=27;
while((c=fgetc(FIN))!=EOF)
{
putc(c,FOUT);
if(c=='\n')
{
linenum++;
printf("%d:\t",linenum);
}
}
printf("\n");
return 1;
}
}
if(sym==13) //void
{
sym=getsym();
while(sym==1)
if(voidfunction())
{
while((c=
hellobeijing123
- 粉丝: 1
- 资源: 6
最新资源
- (源码)基于Spring Boot和Vue的高性能售票系统.zip
- (源码)基于Windows API的USB设备通信系统.zip
- (源码)基于Spring Boot框架的进销存管理系统.zip
- (源码)基于Java和JavaFX的学生管理系统.zip
- (源码)基于C语言和Easyx库的内存分配模拟系统.zip
- (源码)基于WPF和EdgeTTS的桌宠插件系统.zip
- (源码)基于PonyText的文本排版与预处理系统.zip
- joi_240913_8.8.0_73327_share-2EM46K.apk
- Library-rl78g15-fpb-1.2.1.zip
- llvm-17.0.1.202406-rl78-elf.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页