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

📄 diguixiajiang.c

📁 可以识别字符串是否符合以下文法: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S-&gt
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 20 //

int E(char* in,int* ip);
int G(char* in,int* ip);
int T(char* in,int* ip);
int S(char* in,int* ip);
int F(char* in,int* ip);

int E(char* in,int* ip)
{
	printf("E->TG\n");
	if(T(in,ip));else printf("Error in E.\n"),exit(1);//执行子过程T
	if(G(in,ip));else printf("Error in E.\n"),exit(1);//执行子过程G,其他过程类似
	return -1;
}

int G(char* in,int* ip)
{
	if(in[*ip]=='+'){
		printf("G->+TG\n");
		*ip=*ip+1;
		if(T(in,ip));else printf("Error in G.\n"),exit(1);
		if(G(in,ip));else printf("Error in G.\n"),exit(1);
		return -1;
	}
	else if(in[*ip]=='-'){
		printf("G->-GT\n");
		*ip=*ip+1;
		if(T(in,ip));else printf("Error in G.\n"),exit(1);
		if(G(in,ip));else printf("Error in G.\n"),exit(1);
		return -1;
	}
	else {printf("G->empty\n");return -1;}
}

int T(char* in,int* ip)
{
	printf("T->FS\n");
	if(F(in,ip));else printf("Error in E.\n"),exit(1);
	if(S(in,ip));else printf("Error in E.\n"),exit(1);
	return -1;
}

int S(char* in,int* ip)
{
	if(in[*ip]=='*'){
		printf("S->*FS\n");
		*ip=*ip+1;
		if(F(in,ip));else printf("Error in S.\n"),exit(1);
		if(S(in,ip));else printf("Error in S.\n"),exit(1);
		return -1;
	}
	else if(in[*ip]=='/'){
		*ip=*ip+1;
		printf("S->/FS\n");
		if(F(in,ip));else printf("Error in S.\n"),exit(1);
		if(S(in,ip));else printf("Error in S.\n"),exit(1);
		return -1;
	}
	else {printf("S->empty\n");return -1;}
}

int F(char* in,int* ip)
{
	if(in[*ip]=='('){
		printf("F->(E)\n");
		*ip=*ip+1;
		if(E(in,ip));else printf("Error in F.\n"),exit(1);
		if(in[*ip]==')'){*ip=*ip+1;return -1;}
		else printf("Expect an ')' but found %s\n",in+*ip),exit(1);
	}else if(in[*ip]=='i'){printf("F->i\n");*ip=*ip+1;return -1;}
	else {printf("Expect an 'i' but found %s\n",in+*ip);exit(1);}
}

int main(void)
{
	char in[MAX_SIZE];
	int i=0,ip=0;
	
	printf("递归下降分析程序,制作人:\n");
	printf("输入以#结束的字符串,包括字符+,-,*,/,(,),i:\n");
	scanf("%s",in);
	for(i=0;in[i]!='#'&&in[i]!='\0';i++)
		if(in[i]!='i'&&in[i]!='+'&&in[i]!='-'&&in[i]!='*'&&in[i]!='/'&&in[i]!='('&&in[i]!=')')
			printf("Illegal charactor %c",in[i]);
	if(E(in,&ip))
	if(in[ip]=='#')
	printf("%s 是合法字符串\n",in,ip);
	else printf("Extra letters %s.\n",in+ip);
		else printf("Not Accepted");
	return 0;
}

⌨️ 快捷键说明

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