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

📄 syntax.c

📁 一个C语言编译器
💻 C
字号:
// 终结符列表
//      if,while,else,char,int,float,return,void,(共 8 个关键字)
//   +,-,*,/,%,=,>,<,!,AND,OR,BIG_EQUAL,SMA_EQUAL,UNEQUAL,EQUIV,SELF_ADD,SELF_SUB,(共 17 种运算)
//   ID,NUMBER,REAL,STRING,SINGLE_CHAR   (共5个声明类型)
//非终结符列表




//特殊符号列表
// DONE   ;   ,  {  }  [  ]  (  )  PARSE_ERROR     SYNCH  
//结束符 $ , 空字符为 #
/*
文法列表:

*/
#define T_SIZE  40
#define N_SIZE  40
#define E_SIZE   5
#define MAX_R_SIZE  10
#define INFER_SIZE  100
//使用一个整形数组来存取这些符号列表
int N_T[T_SIZE+N_SIZE];
//使用一个结构体数组存储产生式列表
struct node
{
	int curr;
	int s[10];
} First[N_SIZE];
int First[N_SIZE][10];
int Follow[N_SIZE][10];
struct list_node
{
	int header;    //存取左端的非终结符在N_T数组中的值
	int r_size;  //右端产生式的个数
	struct r_node *first;  //第一个产生式的地址
}  infer[INFER_SIZE];
//用链表存取右部产生式
struct r_node
{
	int len ; //产生式长度
	int s[MAX_R_SIZE];   //存放各节点的在N_T数组中的索引值 
	struct r_node *next;	
};
//存取项目
struct item
{
	int header; //产生式左部索引
	struct node *next; //产生式右部
	int position;       //项目 .的位置
};
//存取项目集簇
struct item_cluster
{
	struct item  set;
	struct item *next;
} state[MAX_STATE];
//E'-->A null-->#, T'-->B
void init_syntax()
{
   int i;	
   infer[0].header=N_T[0]='E';
   infer[2].header=N_T[1]='A';
   infer[3].header=N_T[2]='T';
   infer[4].header=N_T[3]='B';
   infer[5].header=N_T[4]='F';
   for(i=5;i<N_SIZE;i++)
   {
	   N_T[i]=0;
   }
	N_T[i++]=ID;
	N_T[i++]='+';
	N_T[i++]='*';
	N_T[i++]='(';
	N_T[i++]=')';
	N_T[i++]='#';
	N_T[i++]='$';
	for(;i<N_SIZE;i++)
		N_T[i]=0;

	infer[0].r_size=1;
	infer[1].r_size=2;
	infer[2].r_size=1;
	infer[3].r_size=2;
	infer[4].r_size=2;

	infer[0].first=(struct r_node *)malloc(sizeof(struct r_node));
	infer[0].first->len=2;
	infer[0].first->s[0]=ntoindex('T');
	infer[0].first->s[1]=ntoindex('A');
	infer[0].first->s[2]=ntoindex('$');
	infer[0].first->next=NULL;

	infer[1].first=(struct r_node *)malloc(sizeof(struct r_node));
	infer[1].first->len=3;
	infer[1].first->s[0]=ntoindex('+');
	infer[1].first->s[1]=ntoindex('T');
	infer[1].first->s[2]=ntoindex('A');
	infer[1].first->s[3]=ntoindex('$');
	infer[1].first->next=(struct r_node *)malloc(sizeof(struct r_node));
	infer[1].first->next->len=1;
	infer[1].first->next->s[0]=ntoindex('#');
	infer[1].first->next->s[1]=ntoindex('$');
	infer[1].first->next->next=NULL;

	infer[2].first=(struct r_node *)malloc(sizeof(struct r_node));
	infer[2].first->len=2;
	infer[2].first->s[0]=ntoindex('F');
	infer[2].first->s[1]=ntoindex('B');
	infer[2].first->s[2]=ntoindex('$');
	infer[2].first->next=NULL;

	infer[3].first=(struct r_node *)malloc(sizeof(struct r_node));
	infer[3].first->len=3;
	infer[3].first->s[0]=ntoindex('*');
	infer[3].first->s[1]=ntoindex('F');
	infer[3].first->s[2]=ntoindex('B');
	infer[3].first->s[3]=ntoindex('$');
	infer[3].first->next=(struct r_node *)malloc(sizeof(struct r_node));
	infer[3].first->next->len=1;
	infer[3].first->next->s[0]=ntoindex('#');
	infer[3].first->next->s[1]=ntoindex('$');
	infer[3].first->next->next=NULL;

	infer[4].first=(struct r_node *)malloc(sizeof(struct r_node));
	infer[4].first->len=3;
	infer[4].first->s[0]=ntoindex('(');
	infer[4].first->s[1]=ntoindex('E');
	infer[4].first->s[2]=ntoindex(')');
	infer[4].first->s[2]=ntoindex('$');
	infer[4].first->next=(struct r_node *)malloc(sizeof(struct r_node));
	infer[4].first->next->len=1;
	infer[4].first->next->s[0]=ntoindex(ID);
	infer[4].first->next->s[1]=ntoindex('$');
	infer[4].first->next->next=NULL;

}
void set_goto()
{
}
void action()
{
}
void closure()
{
}
void get_cluster()
{
}
int ntoindex(int n)
{
	int i=1;
	while(N_T[i]!=n)
	i++;
	return i;
}
void first(int head)
{
	int i;
	int len;
	int j;
	struct r_node *r;
 if(head>N_SIZE)
	 return;
 i=infer[head]->r_size;
 len=infer[head]->first->len;
 r=infer[head]->first;
 while(r->s[0]<N_SIZE)
 {

 }
		
}
void follow(int head)
{
}
int main()
{
	init_syntax();
	
}	 

⌨️ 快捷键说明

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