⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scaner.h

📁 该程序用VC实现了一个小型编译系统
💻 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 + -