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

📄 syntaxaanalysis.cpp

📁 一个语法分析程序的实现。上大学的时候编写的。是通过文法产生式来编写的分析程序。比较简单
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
FILE *fout;
char sym;
//获取一个字符
void getSymbol()
{
	sym=fgetc(fout);
	if(sym==EOF)
		exit(0);
}
void Error()
{
	printf("Error!\n");
	exit(0);
}
void E1();
void F();
void F1();
void T();
void T1();
void P();
void E()
{
	printf("E->TE1\n");
	T();
	E1();
	//printf("验证通过!\n");
}
void E1()
{
	if(sym=='+')
	{
		printf("E1->+E\n");
		getSymbol();
		E();
	}
	else if(sym=='#'||sym==')')
	{
		printf("E1->ε\n");
		//getSymbol();
	}
	else
		Error();
}
void F()
{
	printf("F->PF1\n");
	P();
	F1();
}
void F1()
{
	if(sym=='*')
	{
		printf("F1->*F1\n");
		getSymbol();
		F1();
	}
	else if(sym=='#'||sym=='a'||sym=='b'||sym=='('||sym==')'||sym=='^'||sym=='+')
	{
		printf("F1->ε\n");
		//getSymbol();
	}
	else
		Error();
}
void P()
{
	if(sym=='(')
	{
		printf("P->(E)\n");
		getSymbol();
		E();
		if(sym!=')')
			getSymbol();
	}
	else if(sym=='a')
	{
		printf("P->a\n");
		getSymbol();
	}
	else if(sym=='b')
	{
		printf("P->b\n");
		getSymbol();
	}
	else if(sym=='^')
	{
		printf("P->^\n");
		getSymbol();
	}
	else
		Error();
}
void T()
{
	printf("T->FT1\n");
	F();
	T1();
}
/*void T1()
{
	if(isspace(sym))
	{
		getSymbol();
	}
	else
		T();
}*/

void T1()
{
	if(sym=='('||sym=='a'||sym=='b'||sym=='^')
	{
		printf("T1->T\n");
		getSymbol();
		T();
	}
	else if(sym=='#'||sym=='+'||sym==')')
	{
		printf("T1->ε\n");
		//getSymbol();
	}
	else
		Error();
}
void main()
{
	//若源文件末尾没有回车,给源文件末尾自动添加一个回车,否则根据以上去字符函数的定义,读不出文件最后一个符号
	FILE *fp;
	fp=fopen("test.txt","a+");
	fseek(fp,-1,SEEK_END);
	if(fgetc(fp)!='\n')
	{
		fseek(fp,0,SEEK_END);
		fprintf(fp,"\n");
	}
	fclose(fp);

	fout=fopen("test.txt","r");
	getSymbol();
	E();
	fclose(fout);
}

⌨️ 快捷键说明

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