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

📄 c_compile.cpp

📁 一个自己写的词法分析器,绝对可以运行,而且很好!
💻 CPP
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<ctype.h>
#include<process.h>

void lookup(char *p);
void wordanalysis();
void program();
void mid_list();
void declaration();
void declaration1();
void type_specifier();
void params();
void param1();
void param();
void compound_stmt();
void local_declarations();
void statement_list();
void statement();
void evaluate_stmt();
void selection_stmt();
void select1();
void iteration_stmt();
void E();
void simple1();
void relop();
void additive_expression();
void term1();
void addop();
void term();
void factor1();
void mulop();
void factor();

#define NUM 100

struct
{
	char symbol[30];
	int classID;
}keywordtable[33]={"+",3,"-",4,"*",5,"/",6,"<",7,"<=",8,"==",9,"!=",10,">",11,
">=",12,"&",13,"&&",14,"||",15,"=",16,"(",17,")",18,"[",19,"]",20,"{",21,"}",22,
":",23,";",24,",",25,"void",26,"int",27,"float",28,"char",29,"if",30,"else",31,"while",32,
"do",33,"!",34,"main",35};

FILE *fp;								//打开源文件
char ch;
int key_count=33;
int eryuanshi_count=0;
int sym_count=0;
int worknum=0;
int symID;

struct
{
	char name[20];
	int type;						//0表示整数,1表示标识符
}symtable[NUM];					    //符号表

struct
{
	char sign[20];
	int classID;					//0表示整数,1表示标识符
}eryuanshi[NUM];

//查询符号链表或关键字链表

void lookup(char *p)
{
	int i,j,num=0;
	for(i=0;i<key_count;i++)
		if(strcmp(keywordtable[i].symbol,p)==0)
		{
			strcpy(eryuanshi[eryuanshi_count].sign,p);
			eryuanshi[eryuanshi_count++].classID=keywordtable[i].classID;
			break;
		}
		if(i==key_count)			//没找着,再找符号表
		{
			for(j=0;j<sym_count;j++)
			{
				if(strcmp(symtable[j].name,p)==0)
				{
					strcpy(eryuanshi[eryuanshi_count].sign,p);
					eryuanshi[eryuanshi_count++].classID=symtable[j].type;
					break;
				}
			}
			if(j==sym_count)		//在符号表中没找着
			{
				strcpy(symtable[sym_count].name,p);
				if(isdigit(*p))
					symtable[sym_count++].type=0;			//整数
				else
					symtable[sym_count++].type=1;			//字符串
				strcpy(eryuanshi[eryuanshi_count].sign,p);
				eryuanshi[eryuanshi_count++].classID=symtable[sym_count-1].type;
			}
		}
}

void wordanalysis()
{
	char word[20];
	int status=0,k=0;
	while(1)
	{
		switch(status)
		{
		case 0:
			switch(ch)
			{
			case '<':
				status=6;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '=':
				status=7;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '>':
				status=8;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '+':
			case '-':
			case '*':
			case '(':
			case ')':
			case '[':
			case ']':
			case '{':
			case '}':
			case ':':
			case ';':
			case ',':
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				status=2;
				break;
			case '/':
				status=9;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '!':
				status=13;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '&':
				status=14;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case '|':
				status=15;
				k=0;
				word[k++]=ch;
				ch=fgetc(fp);
				break;
			case EOF:
				return;
			default:
				if(isalpha(ch)||ch=='_')
				{
					status=1;
					k=0;
					word[k++]=ch;
					ch=fgetc(fp);
				}
				else if(isdigit(ch))
				{
					status=3;
					k=0;
					word[k++]=ch;
					ch=fgetc(fp);
				}
				else
					ch=fgetc(fp);
				break;
			}
			break;
		case 1:
			if(isalpha(ch)||isdigit(ch)||ch=='_')
			{
				word[k++]=ch;
				ch=fgetc(fp);
			}else
				status=2;
			break;
		case 2:
			word[k]='\0';
			lookup(word);
			status=0;
			break;
		case 3:
			if(isdigit(ch))
			{
				word[k++]=ch;
				ch=fgetc(fp);
			}
			else if(ch=='.')
			{
				status=4;
				word[k++]=ch;
				ch=fgetc(fp);
			}
			else
				status=2;
			break;
		case 4:
			if(isdigit(ch))
			{
				status=5;
				word[k++]=ch;
				ch=fgetc(fp);
			}else
			{
				cout<<"Error!\n";
				return;
			}
			break;
		case 5:
			if(isdigit(ch))
			{
				word[k++]=ch;
				ch=fgetc(fp);
			}
			else
				status=2;
			break;
		case 6:
			if(ch=='=')
			{
				word[k++]=ch;
				ch=fgetc(fp);
				status=2;
			}
			else
				status=2;
			break;
		case 7:
			if(ch=='=')
			{
				status=2;
				word[k++]=ch;
				ch=fgetc(fp);
			}
			else
				status=2;
			break;
		case 8:
			if(ch=='=')
			{
				status=2;
				word[k++]=ch;
				ch=fgetc(fp);
			}
			else
				status=2;
			break;
		case 9:
			if(ch=='*')
			{
				status=10;
				ch=fgetc(fp);
			}
			else
				status=2;
			break;
		case 10:
			if(ch=='*')
			{
				status=11;
				ch=fgetc(fp);
			}
			else
				ch=fgetc(fp);
			break;
		case 11:
			if(ch=='/')
			{
				status=12;
				ch=fgetc(fp);
			}
			else if(ch=='*')
				ch=fgetc(fp);
			else
			{
				status=10;
				ch=fgetc(fp);
			}
			break;
		case 12:
			status=0;
			break;
		case 13:
			if(ch=='=')
			{
				word[k++]=ch;
				status=2;
				ch=fgetc(fp);
			}else
				status=2;
			break;
		case 14:
			if(ch=='&')
			{
				word[k++]=ch;
				status=2;
				ch=fgetc(fp);
			}else
				status=2;
			break;
		case 15:
			if(ch=='|')
			{
				word[k++]=ch;
				status=2;
				ch=fgetc(fp);
			}else
				status=2;
			break;
		}
	}
}

void program()
{
	declaration();
	mid_list();
}

void mid_list()
{
	if(symID==26||symID==27||symID==28||symID==29)					//void int float char
	{
		declaration();
		mid_list();
	}
	else if(worknum!=eryuanshi_count+1)
	{
		cout<<"应该以int,char,float或void开始说明全局变量或函数!\n";
		return;
	}
}

void declaration()
{
	type_specifier();
	if(symID==1 || symID==35)									//ID
	{
		symID=eryuanshi[worknum++].classID;
		declaration1();
	}
	else{
		cout<<"类型关键字后应跟标识符!\n";
		return;
	}
}

void declaration1()
{
	if(symID==24)									//;
	{
		symID=eryuanshi[worknum++].classID;
		return;
	}
	else if(symID==17)								// 处理字符 (
	{
		symID=eryuanshi[worknum++].classID;
		params();
		if(symID==18)								//处理字符 )
		{
			symID=eryuanshi[worknum++].classID;
			compound_stmt();
		}
		else
		{
			cout<<"少了一个')'!\n";
			return;
		}
	}
	else
	{
		cout<<"少了一个'('或';'!\n";
		return;
	}
}

void type_specifier()
{
	if(symID==26||symID==27||symID==28||symID==29)
		symID=eryuanshi[worknum++].classID;
	else
	{
		cout<<"应该有int,float,char或void!\n";
		return;
	}
}

void params()
{
	if(symID==26||symID==27||symID==28||symID==29)
	{
		param();
		param1();
	}
	else if(symID!=18)
	{
		cout<<"应该有')'\n";
		return;
	}
}

void param1()
{
	if(symID==25)								//,
	{
		symID=eryuanshi[worknum++].classID;
		param();
		param1();
	}
	else if(symID!=18)
	{
		cout<<"应该有')'\n";
		return;
	}
}
void param()
{
	type_specifier();
	if(symID==1)
		symID=eryuanshi[worknum++].classID;
	else
	{
		cout<<"应该有标识符\n";
		return;
	}
}

void compound_stmt()
{
	if(symID==21)								//{
	{
		symID=eryuanshi[worknum++].classID;
		local_declarations();
		statement_list();
		if(symID==22)							//}
			symID=eryuanshi[worknum++].classID;
		else
		{
			cout<<"'}' is expected!\n";
			return;
		}
	}
	else
	{
		cout<<"应该有'{'\n";
		return;		
	}
}

void local_declarations()
{
	if(symID==26||symID==27||symID==28||symID==29)
	{
		type_specifier();
		if(symID==1)
			symID=eryuanshi[worknum++].classID;
		if(symID==24)
		{
			symID=eryuanshi[worknum++].classID;
		}
		local_declarations();
	}
	else if(symID!=24 && symID!=1 && symID!=21 && symID!=22
		&& symID!=30 && symID!=32)
	{
		cout<<"缺少下列关键字或标识符:\";、ID、{、}、if、while\"\n";
		return;	
	}
}

void statement_list()
{
	if(symID==24 || symID==1 || symID==21 || symID==30 || symID==32)
	{
		statement();
		statement_list();
	}
	else if(symID!=22)
	{
		cout<<"应该有'}'\n";
		return;	
	}
}

void statement()
{
	if(symID==1)												//ID
		evaluate_stmt();
	else if(symID==21)											//{
		compound_stmt();
	else if(symID==30)											//if
		selection_stmt();
	else if(symID==32)											//while
		iteration_stmt();
	else if(symID==24)											//;
	{
		symID=eryuanshi[worknum++].classID;
	}
	else
	{
		cout<<"Expected:ID,{,if,while,;\n";
		return;
	}
}

void evaluate_stmt()
{
	symID=eryuanshi[worknum++].classID;
	if(symID==16)
	{
		symID=eryuanshi[worknum++].classID;
		E();
		if(symID==24)
			symID=eryuanshi[worknum++].classID;
		else
		{
			cout<<"';' is expected!\n";
			return;
		}
	}
	else
	{
		cout<<"'=' is expected!\n";
		return;
	}
}

void selection_stmt()
{
	symID=eryuanshi[worknum++].classID;
	if(symID==17)											//(
	{
		symID=eryuanshi[worknum++].classID;
		E();
		if(symID==18)										//)
		{
			symID=eryuanshi[worknum++].classID;
			statement();
			select1();
		}else
		{
			cout<<"A ')' is expected!\n";
			return;
		}
	}
	else
	{
		cout<<"A '(' is expected!\n";
		return;
	}
}

void select1()
{
	if(symID==31)
	{
		symID=eryuanshi[worknum++].classID;
		statement();
	}
	else if(symID!=24 && symID!=1 && symID!=21 && symID!=22
		&& symID!=30 && symID!=32)
	{
		cout<<"缺少下列关键字或标识符:\";、ID、{、}、if、while\"\n";
		return;	
	}
}

void iteration_stmt()
{
	symID=eryuanshi[worknum++].classID;
	if(symID==17)
	{
		symID=eryuanshi[worknum++].classID;
		E();
		if(symID==18)
		{
			symID=eryuanshi[worknum++].classID;
			statement();
		}else
		{
			cout<<"A ')' is expected!\n";
			return;
		}
	}
	else
	{
		cout<<"A '(' is expected!\n";
		return;
	}
}

void E()
{
	additive_expression();
	simple1();
}

void simple1()
{
	if(symID>=7 && symID<=12)
	{
		relop();
		additive_expression();
	}
	else if(symID!=24 && symID!=18)
	{
		cout<<"')'or';' is expected!\n";
		return;
	}
}

void relop()
{
	if(symID>=7 && symID<=12)
		symID=eryuanshi[worknum++].classID;
}

void additive_expression()
{
	term();
	term1();
}

void term1()
{
	if(symID==3 || symID==4)
	{
		addop();
		term();
		term1();
	}
	else if(symID!=7 && symID!=8 && symID!=9
		&& symID!=10 && symID!=11 && symID!=12
		&& symID!=18 && symID!=24)
	{
		cout<<"\"<、<=、>、、!=、>=、= =、)\" or';' is expected!\n";
		return;
	}
}

void addop()
{
	if(symID==3 || symID==4)
		symID=eryuanshi[worknum++].classID;
	else
	{
		cout<<"'+'or'-' is expected!\n";
		return;
	}
}

void term()
{
	factor();
	factor1();
}

void factor1()
{
	if(symID==5 || symID==6)
	{
		mulop();
		factor();
		factor1();
	}
	else if(symID!=7 && symID!=8 && symID!=9
		&& symID!=10 && symID!=11 && symID!=12
		&& symID!=18 && symID!=24 && symID!=3 && symID!=4)
	{
		cout<<"\"<、<=、>、>=、、!=、= =、)、+、-、\" or';' is expected!\n";
		return;
	}
}

void mulop()
{
	if(symID==5 || symID==6)
		symID=eryuanshi[worknum++].classID;
	else
	{
		cout<<"'*'or'/' is expected!\n";
		return;
	}
}

void factor()
{
	if(symID==17)
	{
		symID=eryuanshi[worknum++].classID;
		E();
		if(symID==18)
			symID=eryuanshi[worknum++].classID;
		else
		{
			cout<<"')' is expected!\n";
			return;
		}
	}
	else if(symID==1 || symID==0)
		symID=eryuanshi[worknum++].classID;
	else
	{
		cout<<"'(',ID or NUM is expected!\n";
		return;
	}
}

void main()
{
	int i;
	fp=fopen("input.txt","r");						//打开源文件
	ch=fgetc(fp);
	wordanalysis();
	fclose(fp);
	for(i=0;i<eryuanshi_count;i++)
		cout<<eryuanshi[i].sign<<'\t'<<eryuanshi[i].classID<<endl;
	symID=eryuanshi[worknum++].classID;
	program();
	worknum--;
	if(worknum==eryuanshi_count)
		cout<<"Successful!\n";
	else
		cout<<"Source is Wrong!\n";
	fclose(fp);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -