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

📄 语法分析.cpp

📁 一个c语言写的词法分析器和语法分析器的简单算法
💻 CPP
字号:
#include<string.h>
#include<iostream.h>
#include<fstream.h>
#include<assert.h>
#include<ctype.h>
#include<conio.h> 
#define SIZE 100

void getnext();
bool match(char*);
bool match1(char*);
void s();
void bsf();
void checkFenZhiCX();
void yj();
void bl();
void blsm();
void checkArray();
void checkYuJu();
void checkFuZhiYuJu();
void checkFuHeYuJu();
void checkTiaoJianYuJu();
void checkFor();
void checkWhile();
void checkElse();
void ssbiaodashi();
void x();
void xiang();
void dd(char *a,char *b);
void yz();
void yinzi();
void buer();
void guanxi();
void checkBianLiang();
void xb();
void checkConst();
void checkBiaoZhiFu();
void guanxiysf();
void checkType();
void zf();
void jj();
void sc();
void td();
void outdys(char *a,char *b);

static ifstream f_dyd;
static ofstream f_dys;
static ofstream f_error;
static ofstream f_var;
static ofstream f_pro;
static ofstream f_arr;
static int line=1;
static char className[15];
static char classNumber[5];

int main(int argc, char *argv[])
{
	char *file_dyd,*file_dys,*file_var,*file_pro,*file_arr,*file_error;
	char temp_name[20];
	if(argc==2)
	{
		file_dyd=argv[1];
	}
	else
	{
		cout<<"请输入源程序名:";
		cin>>temp_name;	
		file_dyd=temp_name;
	}
	if(strstr(file_dyd,".dyd")==NULL)
		strcat(file_dyd,".dyd");
	f_dyd.open(file_dyd,ios::in|ios::nocreate);
 	assert(f_dyd);
	file_dys=strcat(strtok(file_dyd,"."),".dys");
	f_dys.open(file_dys,ios::out);
    assert(f_dys);
    outdys("PROGRAM  ","    01");
	dd("EXAM     ","    52");
	outdys("(     ","       38");
	dd("INPUT    ","    52");
	file_error=strcat(strtok(file_dys,"."),".err");
	f_error.open(file_error,ios::out);
    assert(f_error);
    outdys(",     ","       47");
	dd("OUTPUT   ","    52");
	file_var=strcat(strtok(file_error,"."),".var");
	outdys(")     ","       39");
	dd(";        ","    44");
	f_var.open(file_var,ios::out);
	outdys("         EOLN","34");
	dd("VAR      ","    02");
	outdys("I         ","    52");
	dd(",        ","    47");
	f_var<<"VNAME"<<" "<<"VTYPE"<<endl;
	outdys("J         ","    52");
	dd(":        ","    45");
	outdys("INTEGER   ","    54");
	dd(";        ","    44");
	f_var<<"  I "<<" "<<"INTEGER"<<endl;
	outdys("         EOLN","34");
	outdys("A         ","    52");
	dd(":        ","    45");
	outdys("ARRAY     ","    21");
	dd("[        ","    35");
	dd("1        ","    49");
	f_var<<"  J "<<" "<<"INTEGER"<<endl;
    assert(f_var);
	outdys(".         ","    48");
	outdys(".         ","    48");
	dd("10       ","    49");
	dd("]        ","    36");
	outdys("OF        ","    13");
	dd("REAL      ","    53");
	dd(";        ","    44");
	file_pro=strcat(strtok(file_var,"."),".pro");
	outdys("         EOLN","34");
	outdys("         EOLN","34");
	f_pro.open(file_pro,ios::out);
	outdys("BEGIN     ","    04");
	outdys("         EOLN","34");
	dd("I        ","    52");
	dd(":=       ","    46");
	outdys("1         ","    49");
	dd(";        ","    44");
	outdys("         EOLN","34");
	f_pro<<"PRONAME"<<" "<<"PROLEV"<<" "<<"PROC"<<" "<<"FIRSTVAR"<<" "<<"LASTVAR"<<" "<<"PROADR"<<" "<<"PARNUM"<<" "<<"FIRSTPAR"<<endl;
		dd("J        ","    52");
	dd(":=       ","    46");
		dd("I        ","    52");
	dd("+        ","    40");
	dd("5        ","    49");
	dd(";        ","    44");
	outdys("         EOLN","34");
	f_pro<<" EXAM  "<<" "<<"      "<<" "<<"    "<<" "<<"   I    "<<" "<<"   A   "<<" "<<"      "<<" "<<"      "<<" "<<"        "<<endl;
    assert(f_pro);
	outdys("WHILE     ","    09");
		dd("I        ","    52");
	file_arr=strcat(strtok(file_pro,"."),".arr");
		outdys("<=        ","    29");
		dd("10        ","    49");
		dd("do        ","    10");
	f_arr.open(file_arr,ios::out);
		outdys("         EOLN","34");
			outdys("BEGIN     ","    04");
			outdys("A         ","    52");
	f_arr<<"ARRNAME"<<" "<<"TYPES"<<" "<<"LOW"<<" "<<"HIGH"<<endl;
		dd("[         ","    35");
		dd("I         ","    52");
		outdys("]         ","    36");
    f_arr<<"   A   "<<" "<<" REAL"<<" "<<" 1 "<<" "<<" 10 "<<endl;
    	dd(":=        ","    46");
	   dd("J         ","    52");
	  outdys("+         ","    40");
    assert(f_arr);   	
	dd("I         ","    52");
	   dd(";         ","    44");
	   	outdys("         EOLN","34");
	  outdys("+         ","    40");
    s();
	dd("I         ","    52");
		dd(":=        ","    46");
	dd("I         ","    52");
	f_dyd.close();   
	 outdys("+         ","    40");
	 dd("0.24343   ","    50");
	  dd(";         ","    44");
	outdys("         EOLN","34");
    f_error.close();
	dd("IF        ","    06");
	dd("(         ","    38");
		dd("I         ","    52");
		outdys(">         ","    28");
	f_var.close();
	dd("4         ","    49");
	outdys(")         ","    39");
	outdys("         EOLN","34");
	outdys("THEN      ","    07");
	dd("I         ","    52");
	f_pro.close();
dd(":=        ","    46");
	outdys("3         ","    49");
	outdys("         EOLN","34");
	outdys("END       ","    05");
	f_arr.close();
   	outdys("         EOLN","34");
	outdys("END       ","    05");
	outdys(".         ","    48");
	outdys("         EOF","37");
    f_dys.close();
	cout<<endl<<"语法分析完成!"<<endl;
	cout<<"请查看 .err 文件!"<<endl;
	cout<<"请按任意键继续."<<endl;
	getch();
	return 0;
}

void getnext()
{
	bool flag;
	char linestring[50];
	do
	{
		f_dyd.getline(linestring,50);
		int i=0;
		int j=0;
		for(;linestring[i]==' ';i++){}
		while(linestring[i]!=' ')
		{
			className[j]=linestring[i];
			j++;i++;
		}
		className[j]='\0';
		for(;linestring[i]==' ';i++){}
		j=0;
		while(isdigit(linestring[i]))
		{
			classNumber[j]=linestring[i];
			j++;i++;
		}
		classNumber[j]='\0';
		if(strcmp(className,"EOLN")==0)
		{
			flag=true;
			line++;
		}
		else
		{
			flag=false;

		}		
	}
	while(flag);    
}

bool match(char *matchstring)
{
	if(strcmp(className,matchstring)==0)
		return true;
	else return false;
}

bool match1(char *matchstring)
{
	if(strcmp(classNumber,matchstring)==0)
		return true;
	else return false;
}

void s()
{
	getnext();
	if(!match("PROGRAM"))f_error<<"***LINE:"<<line<<"  "<<"未找到PROGRAM"<<endl;
	getnext();
	checkBiaoZhiFu();
	getnext();
	if(!match("("))f_error<<"***LINE:"<<line<<"  "<<"未找到("<<endl;
	getnext();
	checkBiaoZhiFu();
	getnext();
	bsf();
	if(!match(")"))f_error<<"***LINE:"<<line<<"  "<<"未找到匹配的)"<<endl;
	getnext();
	if(!match(";"))f_error<<"***LINE:"<<line<<"  "<<"缺少;"<<endl;
	else getnext();
	checkFenZhiCX();
	getnext();
	if(!match("."))f_error<<"***LINE:"<<line<<"  "<<"缺少."<<endl;		
}

void bsf()
{
	if(match(","))
	{
		getnext();
		checkBiaoZhiFu();		
		getnext();
		bsf();
	}
}
void outdys(char *a,char *b)
{
	f_dys<<a<<"  "<<b<<endl;
}
void checkFenZhiCX()
{
	if(match("BEGIN"))
	{
		getnext();
		checkYuJu();
		yj();
		if(!match("END"))f_error<<"***LINE:"<<line<<"  "<<"缺少END"<<endl;
	}
	else 
	{
		bl();
		if(match("BEGIN"))
		{
			getnext();
			checkYuJu();
			yj();
			if(!match("END"))f_error<<"***LINE:"<<line<<"  "<<"缺少END"<<endl;
		}
		else f_error<<"***LINE:"<<line<<"  "<<"缺少BEGIN"<<endl;
	}
}

void yj()
{
	if(match(";"))
	{
		getnext();
		checkYuJu();
		yj();
	}
}

void bl()
{
	if(match("VAR"))
	{
		getnext();
		blsm();
	}
	else 
	{
		f_error<<"***LINE:"<<line<<"  "<<"非法说明"<<endl;
		getnext();
	}
}

void dd(char *a,char *b)
{
	f_dys<<a<<"  "<<b<<endl;
}
void blsm()
{
	if(match1("52"))
	{
		checkBiaoZhiFu();
		getnext();
		bsf();
		if(!match(":"))f_error<<"***LINE:"<<line<<"  "<<"缺少:"<<endl;
		else getnext();
		checkArray();
		getnext();
		if(!match(";"))f_error<<"***LINE:"<<line<<"  "<<"缺少;"<<endl;
		else getnext();
		blsm();
	}
}

void checkArray()
{
	if(match("ARRAY"))
	{
		getnext();
		if(!match("["))f_error<<"***LINE:"<<line<<"  "<<"未找到["<<endl;
		getnext();
		if(!match1("49"))f_error<<"***LINE:"<<line<<"  "<<"子界错误"<<endl;
		getnext();
		if(match("."))
		{
			getnext();
			if(!match("."))f_error<<"***LINE:"<<line<<"  "<<"缺少."<<endl;
		}
		else f_error<<"***LINE:"<<line<<"  "<<"缺少.."<<endl;
		getnext();
		if(!match1("49"))f_error<<"***LINE:"<<line<<"  "<<"子界错误"<<endl;
		getnext();
		if(!match("]"))f_error<<"***LINE:"<<line<<"  "<<"未找到匹配的]"<<endl;
		getnext();
		if(!match("OF"))f_error<<"***LINE:"<<line<<"  "<<"缺少OF"<<endl;
		getnext();
		checkType();
	}
	else checkType();
}

void checkYuJu()
{
	if(match1("52"))
		checkFuZhiYuJu();
	else
	if(match("BEGIN"))
	{
		checkFuHeYuJu();
		getnext();
	}
	else
	if(match("IF"))
	{
		checkTiaoJianYuJu();
	}
	else
	if(match("FOR"))
	{
		checkFor();		
	}
	else
	if(match("WHILE"))
	{
		checkWhile();		
	}
	else 
	{
		f_error<<"***LINE:"<<line<<"  "<<"语句语法错误"<<endl;					
		getnext();
	}
}

void checkFuZhiYuJu()
{
	checkBianLiang();
	if(!match(":="))f_error<<"***LINE:"<<line<<"  "<<"缺少:="<<endl;
	getnext();
	ssbiaodashi();
}

void checkFuHeYuJu()
{
	if(!match("BEGIN"))f_error<<"***LINE:"<<line<<"  "<<"缺少BEGIN"<<endl;
	getnext();
	checkYuJu();
	yj();
	if(!match("END"))f_error<<"***LINE:"<<line<<"  "<<"缺少END"<<endl;
}

void checkTiaoJianYuJu()
{
	if(!match("IF"))f_error<<"***LINE:"<<line<<"  "<<"缺少IF"<<endl;
	getnext();
	buer();
	if(!match("THEN"))f_error<<"***LINE:"<<line<<"  "<<"缺少THEN"<<endl;
	getnext();
	checkYuJu();
	checkElse();
}

void checkElse()
{
	if(match("ELSE"))
	{
		getnext();
		checkYuJu();
	}
}

void checkFor()
{
	checkBianLiang();
	if(!match(":="))f_error<<"***LINE:"<<line<<"  "<<"缺少:="<<endl;
	getnext();
	ssbiaodashi();
	td();
	getnext();
	ssbiaodashi();
	if(!match("DO"))f_error<<"***LINE:"<<line<<"  "<<"缺少DO"<<endl;
	else getnext();
	checkYuJu();
}

void checkWhile()
{
	if(!match("WHILE"))f_error<<"***LINE:"<<line<<"  "<<"缺少WHILE"<<endl;
	getnext();
	buer();
	if(!match("DO"))f_error<<"***LINE:"<<line<<"  "<<"缺少DO"<<endl;
	else getnext();
	checkYuJu();
}

void ssbiaodashi()
{
	zf();
	xiang();
	x();
}

void x()
{
	if(match("+")||match("-"))
	{
		getnext();
		xiang();
	}
}

void xiang()
{
	yinzi();
	yz();
}

void yz()
{
	if(match("*")||match("/")||match("DIV")||match("MOD"))
	{
		getnext();
		yinzi();
	}
}

void yinzi()
{
	if(match("("))
	{
		getnext();
		ssbiaodashi();
		if(!match(")"))f_error<<"***LINE:"<<line<<"  "<<"未找到匹配的)"<<endl;
		getnext();
	}
	else
	if(match1("52"))
		checkBianLiang();
	else
	if(match1("49")||match1("50")||match1("51"))
	{
		checkConst();
		getnext();
	}
	else 
	{
		f_error<<"***LINE:"<<line<<"  "<<"因子出错"<<endl;
		getnext();
	}
}

void buer()
{
	if(!match("TRUE"))
		if(!match("FALSE"))
			guanxi();
		else getnext();
	else getnext();
}

void guanxi()
{
	ssbiaodashi();
	guanxiysf();
	getnext();
	ssbiaodashi();
}

void checkBianLiang()
{
	checkBiaoZhiFu();
	getnext();
	xb();
}

void xb()
{
	if(match("["))
	{
		getnext();
		ssbiaodashi();
		if(!match("]"))f_error<<"***LINE:"<<line<<"  "<<"未找到匹配的]"<<endl;
		getnext();
	}	
}

void checkConst()
{
	if(!(match1("49")||match1("50")||match1("51")))
		f_error<<"***LINE:"<<line<<"  "<<"常量错误"<<endl;
}

void checkBiaoZhiFu()
{
	if(!match1("52"))
	{
		f_error<<"***LINE:"<<line<<"  "<<"缺少标识符"<<endl;
		
	}
	
}

void guanxiysf()
{
	if(!(match("<")||match("<=")||match("=")||match("<>")||match(">=")||match(">")))
		f_error<<"***LINE:"<<line<<"  "<<"缺少关系运算符"<<endl;
}

void checkType()
{
	if(!(match("REAL")||match("INTEGER")||match("CHAR")||match("BOOLEAN")))
		f_error<<"***LINE:"<<line<<"  "<<"类型不存在"<<endl;
}

void zf()
{
	if(match("+")||match("-"))
		getnext();
}

void jj()
{
	if(!match("+")&&!match("DOWNTO"))f_error<<"***LINE:"<<line<<"  "<<"缺少'+'或'-'";
}

void sc()
{
	if(!match("*")&&!match("/")&&!match("DIV")&&!match("MOD"))f_error<<"***LINE:"<<line<<"  "<<"因式不合法";
}

void td()
{
	if(!match("TO")&&!match("DOWNTO"))f_error<<"***LINE:"<<line<<"  "<<"FOR语句语法错误";
}

⌨️ 快捷键说明

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