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

📄 cs.c

📁 语法分析器 能够对输入的数据进行判断 进行分析 判别输入字符串的各种信息
💻 C
字号:
#include "stdio.h"
#include "malloc.h"

void e();                     //E
void f();                     //F
void t();                     //T
void t1();                    //T'
void e1();                    //E'

char ch;
int Judg;                     //判断是否为空

struct CSstrchar{
	char char_ch;
	struct CSstrchar *next;
}CSstrchar,*bb,*cc,*Temp;          //输入串结构体定义     链:字符|指针 bb实体指针;cc替换存储



//************************************************************************
void e(void)                       // E->TE'
{
	t();                          
	e1(); 
}

void t(void)
{
	f();
	t1();                          //T->FT'
}



//*********************************************************************
void e1(void)                       //E'->+TE'|ε
{
	if(bb->char_ch=='+')
	{
		bb=bb->next;
		t();
		e1();
	}
	else
		if(bb->char_ch=='#'||bb->char_ch==')')
			return;
		else
			Judg=0;
}

void f()
{
	if(bb->char_ch=='i')
		bb=bb->next;
	else
		if(bb->char_ch=='(')
		{
			bb=bb->next;
			e();
			if(bb->char_ch==')')
				bb=bb->next;
			else
				Judg=0;
		}
		else
			Judg=0;
}

void t1(void)                      //T'->*FT'|ε
{
	if(bb->char_ch=='*')
	{
		bb=bb->next;
		f();
		t1();
	}
	else
		if(bb->char_ch!='#' && bb->char_ch!=')' && bb->char_ch!='+')
			Judg=0;
}
//***********************************************************************



void main(void)
{   printf("\n________________________________________________________________________________\n                               语法分析器 V1.0\n________________________________________________________________________________\n");
    printf("根据文法4.2 :E->E+T|T\n             T->T*F|F\n             F->(E)|i\n编译以下程序\n"); 
    printf("\n输入一个字符串 :\n例如 :i+i,i*i    并已#号结束\n");
	
	Judg=1;	
	bb=malloc(sizeof(CSstrchar));
	bb->next=NULL;
	cc=bb; //bb输入字符串指针 ;cc是替换存储指针;
	do{
		ch=getchar();
		putchar(ch);
		if(ch=='i'||ch=='+'||ch=='*'||ch=='('||ch==')'||ch=='#')
		{
			Temp=malloc(sizeof(CSstrchar));
			Temp->next=NULL;
			Temp->char_ch=ch;
			bb->next=Temp;
			bb=bb->next;
		}
		else
		{
			Temp=cc->next;
			printf("\nInput a wrong char!Input again:\n");
			for(;;)
			{				
				{if (Temp!=NULL)
					printf("%c",Temp->char_ch);						
				else
					break;}
				Temp=Temp->next;
			}
		}
	}
	while(ch!='#');
	cc=cc->next;
	bb=cc;
	e();
	if(bb->char_ch=='#'&&Judg)
		printf("\nOK!\n");
	else
		printf("\nError!\n");
}


















	
/*文法4.2存在左递归
直接消除左递归后变成:
            E->TE'
			E'->+TE'|ε
			T->FT'
            T'->*FT'|ε
			F->(E)|i
*/
/*
FIRST(F)={ (,i } 
FIRST(T’)={*,ε} 
FIRST(T)=FIRST(F)-{ε}={ (,i} 
FIRST(E’)={+,ε} 
FIRST(E)= FIRST(T)-{ε}={(,i} 
∴FIRST(TE’)=FIRST(T)-{ε}={(,i} 
    FIRST(+TE’)={+}           FIRST(ε)={ε} 
    FIRST(FT’)= FIRST(F)-{ε}={(,i} 
    FIRST(*FT’)={*}            FIRST(ε)={ε} 
    FIRST((E))={(}               FIRST(i)={i}

*/
           

⌨️ 快捷键说明

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