?? cifa.cpp
字號:
//#include "stdafx.h"
#include "cifa.h"
#include "stdlib.h"
cifa::cifa(FILE *fp1)
{
fp=fp1;
KeyWord k1[]={ //關(guān)鍵字?jǐn)?shù)組
{"program",3},
{"produce",5},
{"var",4},
{"begin",6},
{"end",7},
{"if",8},
{"then",9},
{"else",10},
{"while",11},
{"do",12},
{"integer",14},
{"real",15}
};
for(int i=0;i<13/*sizeof(k1)/sizeof(KeyWord)*/;i++)
{
keyword[i].id=k1[i].id;
strcpy(keyword[i].word,k1[i].word);
}
idaddr=0;
huanhang=0;
cur_ty=0;
}
void cifa:: reporterrors(char errorch[20])
{ huanhang++;
cout<<"**error(1)="<<errorch<<" ";
if(huanhang%4==0) cout<<endl;
}
void cifa:: reporterror(char errorch)//報(bào)錯(cuò)函數(shù)
{ huanhang++;
cout<<"**error(1)="<<errorch<<" ";
if(huanhang%4==0) cout<<endl;
}
int cifa::lookup(char *string)
{
for(int i=0;i<sizeof(keyword)/sizeof(KeyWord);i++)
{
if(strcmp(string,keyword[i].word)==0)
return keyword[i].id;
}
return 0;
}
int cifa:: lookuprecode(char *string)
{
for(int i=0;i<idaddr;i++)
{
if(strcmp(recode[i].word,string)==0)
return recode[i].idaddr;
}
strcpy(recode[idaddr].word,string);
recode[idaddr].idaddr=idaddr+1;
idaddr++;
return recode[idaddr-1].idaddr;//recode[idaddr].idaddr;
}
void cifa:: out(int id ,char *string)
{
if(id==1)
{
//cout<<"("<<id<<","<<lookuprecode(string)<<")";
//cout.width(12);
//cout.setf(ios::left,ios::adjustfield);
//cout<<string ;
cifaresult[cur_ty].type=1;
strcpy(cifaresult[cur_ty].text,string);
cifaresult[cur_ty].value=lookuprecode(string);
cifaresult[cur_ty].address=cur_ty;
}
else if(id==2)
{
//cout<<"("<<id<<","<<string<<")";
//cout.width(12);
//cout.setf(ios::left,ios::adjustfield);
//cout<<string ;
cifaresult[cur_ty].type=2;
strcpy(cifaresult[cur_ty].text,string);
cifaresult[cur_ty].value=atoi(string);
cifaresult[cur_ty].address=cur_ty;
}
else
{
//cout<<"("<<id<<","<<"0"<<")";
//cout.width(12);
//cout.setf(ios::left,ios::adjustfield);
//cout<<string ;
cifaresult[cur_ty].type=id;
strcpy(cifaresult[cur_ty].text,string);
cifaresult[cur_ty].value=0;
cifaresult[cur_ty].address=cur_ty;
}
//huanhang++;
//if(huanhang%4==0) cout<<endl;
cur_ty++;
//cout<<"二元"<<cur_ty<<endl;
}
bool cifa:: isalpha(char c)
{
if( (c>='a'&&c<='z') || (c>='A'&&c<='Z') )
return true;
else
return false;
}
bool cifa:: isdigit(char c)
{
if(c>='0'&&c<='9')
return true;
else
return false;
}
bool cifa:: isalnum(char c)
{
if( isalpha(c) || isdigit(c) )
return true;
else
return false;
}
void cifa:: scanner()
{
char ch;
int i,c;
int first=1;
while(!feof(fp))
{
ch=fgetc(fp);;
/*起使符號是字母的處理*/
if(isalpha(ch))
{
token[0]=ch;
ch=fgetc(fp);i=1;
while(isalnum(ch))
{
token[i]=ch;i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
c=lookup(token);
if(c==0) out(ID,token);
else out(c,token);
}
/*起使符號是數(shù)字的處理*/
else if(isdigit(ch))
{
token[0]=ch;
ch=fgetc(fp);i=1;
while(isdigit(ch))
{
token[i]=ch;i++;
ch=fgetc(fp);
}
if(!isalpha(ch))
{
token[i]='\0';
out(INT,token);
fseek(fp,-1,1);
goto next;
}
while(isalnum(ch))
{
token[i]=ch;i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
reporterrors(token);
next:;
cout<<"某dsdfsdfsdfsdf個(gè)數(shù)字"<<token<<endl;;
}
else
switch(ch)
{
case'<':
ch=fgetc(fp);
if(ch=='=') out(LE,"<=");
else if (ch=='>') out(NE,"<>");
else
{
fseek(fp,-1,1);
out(LT,"<");
}
break;
case '=': out(EQ, "="); break;
case '>': ch=fgetc(fp);
if(ch=='=')
out(GE,">=");
else
{
fseek(fp,-1,1);
out(GT,">");
}
break;
case ':': ch=fgetc(fp);
if(ch=='=') // := 為賦值語句
out(FZ,":=");
else
{
fseek(fp,-1,1);
out(MH,":");
}
break;
case '+':
out(ADD,"+");
break;
case '-':
out(SUB,"-");
break;
case '*':
out(MUL,"*");
break;
case '/':
first=1;
ch=fgetc(fp);
if(ch=='*')
{
do{
if(!first) fseek(fp,-1,1);
do
{
ch=fgetc(fp);
}while(ch!='*');
ch=fgetc(fp);
first=0;
}while(ch!='/');
}
if(ch=='/')
{
do
{
ch=fgetc(fp);
}while(ch!='\n');
}
else
{
fseek(fp,-1,1);
out(DIV," ");
}
break;
case '~':
out(SY,"~");
break;
case '^':
out(SS,"^");
break;
case '|':
out(XS,"|");
break;
case ';':
out(FH,";");
break;
case '.':
out(JH,".");
break;
case ',':
out(DH,",");
break;
case '(':
out(LKH,"(");
break;
case ')':
out(RKH,")");
break;
case ' ' : break; //刪除程序中的空格
case '\n': break; //刪除程序中的回車,并記錄程序編
case (char)(-1): break;
default :
{reporterror(ch);
break;}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -