📄 scanner.c
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/
#include"Global.h"
void scan()
{
char readin[len];
int i = 0;
char c;
int lineNo = 1;
int j = 0;
c = fgetc(fin);
//fprintf(fout,"LineNo\tCat:\tID\n\n");
while(!feof(fin))
{
// 处理空格
if(isspace(c))
{
if(c == '\n')
lineNo++;
c = fgetc(fin);
}
//处理注释//
else if(c == '/')
{
c = fgetc(fin);
if( c == '/')
{
while(c != '\n')
c = fgetc(fin);
}
else if(c == '*')
{
c = fgetc(fin);
while(!feof(fin))
{
if(c == '\n')
lineNo++;
else if(c == '*')
{
c = fgetc(fin);
if(c == '/')
{
c = fgetc(fin);
break;
}
}
c = fgetc(fin);
}
}
else
{
fprintf(fout,"%d\tDIV_OP\t/\n",lineNo);
fprintf(temp,"DIV_OP\t/\n");
//fprintf(errlog,"@%d Illegal character %c\n",lineNo,c);
//c = fgetc(fin);
}
}
//处理整数
else if(isdigit(c))
{
if(c != '0')
{
readin[i++] = c;
c = fgetc(fin);
while(isdigit(c) && !feof(fin))
{
readin[i++] = c;
c = fgetc(fin);
}
}
else if(c == '0')
{
readin[i++] = c;
c = fgetc(fin);
}
readin[i] = '\0';
fprintf(fout,"%d\tINTEGER\t%s\n",lineNo,readin);
fprintf(temp,"INTEGER\t%s\n",readin);
i = 0;
}
/*
*处理关键字和标识符
*/
else if(isalpha(c) || c == '_')
{
if(isalpha(c))
readin[i++] = tolower(c);
else
readin[i++] = c;
c = fgetc(fin);
while(1)
{
if(feof(fin) || !(isalpha(c) || c == '_' || isdigit(c)) )
break;
if(isalpha(c))
readin[i++] = tolower(c);
else
readin[i++] = c;
c = fgetc(fin);
}
readin[i]='\0';
for(j = 0; j < 10; j++)
{
if(strcmp(readin,keywords[j]) == 0)
{
fprintf(fout,"%d\t%s\t%s\n",lineNo,keywords[j],readin);
fprintf(temp,"%s\t%s\n",keywords[j],readin);
break;
}
}
if(j == 10)
{
fprintf(fout,"%d\tID\t%s\n",lineNo,readin);
fprintf(temp,"ID\t%s\n",readin);
}
i = 0;
}
/*
* 处理字符串
*/
else if(c == '\"')
{
//readin[i++] = c;
c = fgetc(fin);
while(c!= '\"' && !feof(fin))
{
readin[i++] = c;
c = fgetc(fin);
}
c = fgetc(fin);
readin[i] = '\0';
fprintf(fout,"%d\tSTRING\t%s\n",lineNo,readin);
fprintf(temp,"STRING\t%s\n",readin);
i = 0;
}
/*
*乘号
*/
else if(c == '*')
{
fprintf(fout,"%d\tMUL_OP\t%c\n",lineNo,c);
fprintf(temp,"MUL_OP\t%c\n",c);
c = fgetc(fin);
}
/*
*除号
*/
else if(c == '/')
{
fprintf(fout,"%d\tDIV_OP\t%c\n",lineNo,c);
fprintf(temp,"DIV_OP\t%c\n",c);
c = fgetc(fin);
}
/*
*加号
*/
else if(c == '+')
{
fprintf(fout,"%d\tADD_OP\t%c\n",lineNo,c);
fprintf(temp,"ADD_OP\t%c\n",c);
c = fgetc(fin);
}
/*
*减号
*/
else if(c == '-')
{
fprintf(fout,"%d\tSUB_OP\t%c\n",lineNo,c);
fprintf(temp,"SUB_OP\t%c\n",c);
c = fgetc(fin);
}
/*
*赋值和等于号
*/
else if(c == '=')
{
c = fgetc(fin);
if(c == '=')
{
fprintf(fout,"%d\tROP\t==\n",lineNo);
fprintf(temp,"ROP\t==\n");
c = fgetc(fin);
}
else
{
fprintf(fout,"%d\tASSIGN\t=\n",lineNo);
fprintf(temp,"ASSIGN\t=\n");
}
}
/*
* 大于 && 大于等于
*/
else if(c == '>')
{
c = fgetc(fin);
if(c == '=')
{
fprintf(fout,"%d\tROP\t>=\n",lineNo);
fprintf(temp,"ROP\t>=\n");
c = fgetc(fin);
}
else
{
fprintf(fout,"%d\tROP\t>\n",lineNo);
fprintf(temp,"ROP\t>\n");
}
}
/*
* 小于 && 小于等于
*/
else if(c == '<')
{
c = fgetc(fin);
if(c == '=')
{
fprintf(fout,"%d\tROP\t<=\n",lineNo);
fprintf(temp,"ROP\t<=\n");
c = fgetc(fin);
}
else
{
fprintf(fout,"%d\tROP\t<\n",lineNo);
fprintf(temp,"ROP\t<\n");
}
}
/*
*不等于
*/
else if(c == '!')
{
c = fgetc(fin);
if(c = '=')
{
fprintf(fout,"%d\tNE\t!=\n",lineNo);
fprintf(temp,"NE\t!=\n");
c = fgetc(fin);
}
else
{
fprintf(fout,"@%d Illegal character !\n",lineNo);
fprintf(temp,"Illegal character !\n");
fprintf(errlog,"@%d Illegal character !\n",lineNo);
}
}
/*
* {
*/
else if(c == '{')
{
fprintf(fout,"%d\tLBrace\t{\n",lineNo);
fprintf(temp,"LBrace\t{\n");
c = fgetc(fin);
}
/*
* }
*/
else if(c == '}')
{
fprintf(fout,"%d\tRBrace\t}\n",lineNo);
fprintf(temp,"RBrace\t}\n");
c = fgetc(fin);
}
/*
* (
*/
else if(c == '(')
{
fprintf(fout,"%d\tLParen\t(\n",lineNo);
fprintf(temp,"LParen\t(\n");
c = fgetc(fin);
}
/*
* )
*/
else if(c == ')')
{
fprintf(fout,"%d\tRParen\t)\n",lineNo);
fprintf(temp,"RParen\t)\n");
c = fgetc(fin);
}
/*
* ; && ,
*/
else if(c == ';' || c == ',')
{
if(c == ';')
{
fprintf(fout,"%d\tSEMIC\t%c\n",lineNo,c);
fprintf(temp,"SEMIC\t%c\n",c);
}
else
{
fprintf(fout,"%d\tCOLOM\t%c\n",lineNo,c);
fprintf(temp,"COLOM\t%c\n",c);
}
c = fgetc(fin);
}
/*
* 出现非法字符!
*/
else
{
fprintf(fout,"@%d Illegal character %c\n",lineNo,c);
fprintf(temp,"Illegal character %c\n",c);
fprintf(errlog,"@%d Illegal character %c\n",lineNo,c);
c = fgetc(fin);
}
}
fclose(fin);
}
int NextSym(FILE * finn)
{
//static char sym[len];
int ll;
if(!feof(finn))
{
fgets(Sym,len,finn);
split(Sym);
ll = strlen(Symbol[2]);
Symbol[2][ll-1] = '\0';
return 1;
}
else
{
Sym[0] = '\0';
return 0;
}
}
void split(char *string)
{
Symbol[0] = strtok(string,sep);
Symbol[1] = strtok(NULL,sep);
Symbol[2] = strtok(NULL,sep);
}
void Error(int k)
{
fprintf(errlog,"Syntax error @ %s:%s\n",Symbol[0],errmsg[k]);
printf("Syntax error @ %s:%s\n",Symbol[0],errmsg[k]);
error = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -