求上下文无关文法的first和follow集合C语言实现

本文档介绍了如何使用C语言来实现编译原理中的关键概念——first集合和follow集合的计算。通过对上下文无关文法的分析,详细阐述了算法的实现过程,帮助读者理解编译器构造的基础知识。
摘要由CSDN通过智能技术生成
//define.h
#define NUM 30   //the room for table 

#define LISTNUM 30  //the length of aggregate

#define N 30  //proNum for each VN

################################################################

//VN.h
#include <stdio.h>
#include <string.h>
#include "define.h"
#include "aggregate.h"


typedef struct{
    char name;
    int state,NumOfPro,position[N],done;
    struct List first,Prof[N],Follow;
}vn;

int Check_states(vn VN_struct_arr[],int NumOfVN);

int Kind(char VN_name[],int NumOfVN,char x);

int forsure(char VN_name[],int NumOfVN,char Pro[]);

void Reset(vn VN_struct_arr[],int NumOfVN);

int Changed_num(vn VN_struct_arr[],int NumOfVN);

void printAllfirstList(vn VN_struct_arr[],int NumOfVN);

void printAllfollowList(vn VN_struct_arr[],int NumOfVN);

void printAllProList(vn VN_struct_arr[],int NumOfVN,char table[][NUM]);

#############################################################

//VN.c
#include <stdio.h>
#include <string.h>
#include "VN.h"

int Check_states(vn VN_struct_arr[],int NumOfVN){  //1表示完成 ,0 表示未完成
	int i;
    for(i=1;i<=NumOfVN;i++)
      if(VN_struct_arr[i].state=='2')
         return 0;
    return 1;
}

int Kind(char VN_name[],int NumOfVN,char x){//0表示终结符  ,1表示` ,   2是VN
	int i,flag=0;
    for(i=1;i<=NumOfVN;i++)
       if(VN_name[i]==x)   flag++;
    if(flag>=1)   return 2;
	if(x=='`')    return 1;
	return 0;
}

int forsure(char VN_name[],int NumOfVN,char Pro[]){
	int i=1,k,flag0=0,flag1=0,flag2=0;
	while(Pro[i] != '\n'){
		k=Kind(VN_name,NumOfVN,Pro[i]);
		if(k==0)  flag0++;
		else if(k==1)  flag1++;
		else   flag2++;
		i++;
	}
     if(flag0>0)   return 0;
	 else if(flag2==0)   return 1;
	 else   return 2;
}

void Reset(vn VN_struct_arr[],int NumOfVN){
    int i;
    for(i=1;i<=NumOfVN;i++)
        VN_struct_arr[i].done=0;
}

int Changed_num(vn VN_struct_arr[],int NumOfVN){
    int i,flag=0;
    for(i=1;i<=NumOfVN;i++)
        if(VN_struct_arr[i].done==1)
           flag++;
   return flag; 
}

void printAllfirstList(vn VN_struct_arr[],int NumOfVN)
{
     int i;
	 for(i=1;i<=NumOfVN;i++)
	 {
          printf("FIRST(%c)= ",VN_struct_arr[i].name);
		  printList(VN_struct_arr[i].first);
		  printf("\n");
	 }
}




void printAllfollowList(vn VN_struct_arr[],int NumOfVN)
{
     int i;
	 for(i=1;i<=NumOfVN;i++)
	 {
          printf("FOLLOW(%c)= ",VN_struct_arr[i].name);
		  printList(VN_struct_arr[i].Follow);
		  printf("\n");
	 }
}

void printAllProList(vn VN_struct_arr[],int NumOfVN,char table[][NUM])
{
     int i,j,z;
	 for(i=1;i<=NumOfVN;i++)
	 {
          for(j=1;j<=VN_struct_arr[i].NumOfPro;j++)
          {
           z=1;
           printf("FIRST(");
           while(table[VN_struct_arr[i].position[j]][z]!='\n')
           {
              printf("%c",table[VN_struct_arr[i].position[j]][z]);
              z++;
           }
           printf(")=");
		  printList(VN_struct_arr[i].Prof[j]);
		  printf("\n");
          }
	 }
}

##############################################################

//arrdeal.h
#include <stdio.h>
#include <string.h>
#include "define.h"

int Init(char table[]);

int Inits(char table[][NUM]);

int Input(char table[],char pose[],int pN);

int Inputs(char table[][NUM],char pose[],int pN);

int Char_to_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值