📄 scaner.h
字号:
/*
file name:Scaner.h
ensuing function is designed for Scaner
*/
#ifndef SCANER_H
#define SCANER_H
#include "_global.h"
#include "Scan.h"
#include<memory.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
void name_def(char *name,int tp)
{
if(vartablep>=maxvartablep)
{
cout<<"error of variable table overflow"<<endl;
error[index].row_error=row;
strcpy(error[index].p_Error,name);
strcat(error[index].p_Error,"error of variable table overflow");
index++;
}
for(int i=vartablep-1;i>=stack[s_top-1];i--)
{
if(strcmp(varTable[i].name ,name)==0)
{
cout<<"source.txt("<<row<<")error of variable"
<<name<<"redefination"<<endl;
error[index].row_error=row;
strcpy(error[index].p_Error,name);
strcat(error[index].p_Error," error of variable redefination ");
index++;return;
}
}
strcpy(varTable[vartablep].name,name);
varTable[vartablep].address =datep;
varTable[vartablep].type =tp;
datep++;
vartablep++;
return;
}
int lookup(char *str)
{
for(int i=0;i< KeyWnum ;i++)
{
if(strcmp( str,key_words[i])==0)
break;
}
if(i==KeyWnum)return 0;
else return (i+1);
}
int lookup_var(char *name)
{
int s=s_top;
s--;
for(int i=stack[s];i<vartablep;i++)
if(strcmp(varTable[i].name,name)==0)
return (varTable[i].address);
while(s)
{
int temp=s;
s--;
for(int i=stack[s];i<stack[temp];i++)
if(strcmp(varTable[i].name,name)==0)
return (varTable[i].address);
}
return -1;
}
char token[10];
void scaner()
{
strcpy(token,"");
if((!infile.eof ()))
{
char ch;
ch= infile.get();
int i,code_value;
while(ch==' '||ch=='\t'||ch=='\n'){
if(ch=='\n')row++;
ch= infile.get();
}
if(isalpha(ch)||ch=='_') {
token[0]=ch;
i=1;
ch=infile.get();
while(isalpha(ch)||isdigit(ch)){
token[i]=ch;
i++;
ch= infile.get();
}
token[i]='\0';
// cout<<token<<endl; //
infile.seekg(-1,ios::cur);
code_value=lookup(token);
if(code_value==0)
{
sym=ID;
code_number_in_row++;
outfile<<"("<<ID<<","<<token<<")"<<'\t';
if( code_number_in_row%5==0)
outfile<<endl;
}
else{
code_number_in_row++;
sym=code_value;
outfile<<"("<<code_value<<","<<token<<")"<<'\t';
if( code_number_in_row%5==0)
outfile<<endl;
}
}
else if(isdigit(ch)){
token[0]=ch;
i=1;
ch=infile.get();
while(isdigit(ch)){
token[i]=ch;
i++;
ch=infile.get();
}
if(isalpha(ch))
{
token[i]=ch;
i++;
ch=infile.get();
while(isalpha(ch)||isdigit(ch)){
token[i]=ch;
i++;
ch=infile.get();
}
token[i]='\0';
infile.seekg(-1,ios::cur);
error[index].row_error=row;
strcpy(error[index].p_Error,"illegal interger ");
index++;
}
else {
token[i]='\0';
infile.seekg(-1,ios::cur);
sym=NUM;
int a=atoi(token);
if(a>32767)
{
cout<< "source.txt("<<row<<")error of integer out of boundary"<<endl;
error[index].row_error=row;
strcpy(error[index].p_Error,"error of integer out of boundary ");
index++;
}
char b[10];
code_number_in_row++;
outfile<<"("<<sym<<","<<itoa(a,b,2)<<")"<<'\t';
if( code_number_in_row%5==0) outfile<<endl;
}
}
else switch(ch)
{
case '=':ch=infile.get();
if(ch=='=')
{
sym=EQU;
outfile<<"("<<sym<<","<<" =="<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else {
sym=SIGN;
infile.seekg(-1,ios::cur);
outfile<<"("<<sym<<","<<"="<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
break;
case '>': ch=infile.get();
if(ch=='=')
{
sym=GE;
outfile<<"("<<sym<<","<<">= "<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else if(ch=='>'){
sym=SHR;
outfile<<"("<<sym<<","<<">> "<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else {
sym=GT;
infile.seekg(-1,ios::cur);
outfile<<"("<<sym<<","<<">"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
break;
case '<': ch=infile.get();
if(ch=='=')
{
sym=LE;
outfile<<"("<<sym<<","<<"<="<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else if(ch=='>'){
sym=NE;
outfile<<"("<<sym<<","<<"<> "<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else if(ch=='<'){
sym=SHL;
outfile<<"("<<sym<<","<<" <<"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
else {
sym=LT;
infile.seekg(-1,ios::cur);
outfile<<"("<<sym<<","<<"<"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
break;
case '+':sym=PLUS;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '-':sym=MINUS;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '*':sym=STAR;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '/': ch= infile.get();
if(ch=='/')
{
char a[80];
infile.getline (a,80,'\n');
row++;
scaner();
}
else if(ch=='*'){
do{
ch=infile.get();
if(ch=='\n')row++;
}while(ch!='*'||infile.get()!='/');
scaner();
}
else {
sym=DIV;
outfile<<"("<<sym<<","<<"/"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
}
break;
case '(':sym=LP;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case ')':sym=RP;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '[':sym=LB;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case ']':sym=RB;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '{':sym=LC;
outfile<<"("<<sym<<","<<"{"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case '}':sym=RC;
outfile<<"("<<sym<<","<<ch<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case ',':sym=CMA;
outfile<<"("<<sym<<","<<" ,"<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
case ';':sym=SEMI;
outfile<<"("<<sym<<","<<"; "<<")"<<'\t';
code_number_in_row++;
if( code_number_in_row%5==0)
outfile<<endl;
break;
default:
if(ch!=EOF){
error[index].row_error=row;
strcpy(error[index].p_Error,"illegal characer");
index++;
}
else sym=END;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -