• 大小: 199KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-05
  • 语言: C/C++
  • 标签: firstfollow  

资源简介

编译原理实验 first、follow、select集合的求解,经测试正确,c语言编写

资源截图

代码片段和文件信息

#include
#include
#include
typedef struct Node
{
    char nonTerminal;
    char str[10];    //用来存放各个产生式右边的字符串
    int tag;         //用来标记是否能推出空
    char first[10];  //用来存放非终结符的first集合
    char firsts[10]; //用来存放字符串的first集合
    char follow[10];  //用来存放各个非终结符的follow集
    char formFollow[10];//用来存放各个非终结符的follow集合的组成部分
    int fol;        //用来标记非终结符是否已经计算过follow集
    char sellect[10];//用来存放sellect集合
    int fir;   //用来标志非终结符的first集合是否计算过,0表示没有,1表示计算过
}nonTer*nonTerminal;
typedef struct 
{
    char Ldata;
//  int tag1; //用来标记是否能推出空
    int tag2;//用来标记该产生式是否被删除
}LeftData;
typedef struct node
{
    LeftData lData;
    char mData[2];
    char rData[10];//产生式右边字符串最大值为10
}Pro;
typedef struct
{
    Pro proNum[50];    //输入产生式的最大数量        
}Production;
static int num=0;  //统计实际输入产生式的数量
int sum=1;   //统计非终结符的数量
Production init()  //初始化产生式
{
    Production p;
    int ij;
    for(i=0;i<50;i++)
    {
        for(j=0;j<10;j++)
     {
            p.proNum[i].rData[j]=‘\0‘;
     }
    
    }
    return p;
}
Production input()  //输入产生式
{
    int i=0j=0;
    Production p;
    p=init();
    printf(“依次输入各个产生式,每次以回车结束; 用‘#‘结束,表示不再有产生式要输入\n“);
    while((p.proNum[i].lData.Ldata=getchar())!=‘#‘)
    {
        scanf(“%c%c“&p.proNum[i].mData[0]&p.proNum[i].mData[1]);
        scanf(“%s“&p.proNum[i].rData);
      //  p.proNum[i].lData.tag1=0;
        p.proNum[i].lData.tag2=1;
        getchar();
        if(j>20)
     {
            printf(“输入产生是的数量超过上限程序不能处理\n“);
     }
        num++;
        i++;
    }
    return p;
}
Production copyProduction(Production p)
{
    Production cp;
    int ij;
    for(i=0;i    {
        cp.proNum[i].lData.Ldata=p.proNum[i].lData.Ldata;
    //  cp.proNum[i].lData.tag1=p.proNum[i].lData.tag1;
        cp.proNum[i].lData.tag2=p.proNum[i].lData.tag2;
        cp.proNum[i].mData[0]=p.proNum[i].mData[0];
        cp.proNum[i].mData[1]=p.proNum[i].mData[1];
        for(j=0;j<10;j++)
     {
            cp.proNum[i].rData[j]=p.proNum[i].rData[j];
     }
    
    }
    return cp;
}
int isJudLegal(Production p)  //判断产生式是否合法
{
    int mid1mid2right=0;
    int i;
    int flag=0;
    mid1=0;
    mid2=1;
    right=0;
    if(num==0)
    {
        printf(“产生式个数为零\n“);
        return 0;
    }
    for(i=0;i    {
        if(p.proNum[i].lData.Ldata>‘Z‘||p.proNum[i].lData.Ldata<‘A‘)
     {
            printf(“产生式左部应该为非终结符(大写字母)\n“);
            return 0;
     }
        if(p.proNum[i].mData[mid1]!=‘-‘||p.proNum[i].mData[mid2]!=‘>‘)
     {
            printf(“产生式中间->有误\n“);
            return 0;
     }
        while(p.proNum[i].rData[right]!=‘\0‘)
     {
            if((p.proNum[i].rData[right]==‘*‘)||(p.proNum[i].rData[right]>=‘a‘&&p.proNum[i].rData[right]<=‘z‘)
                ||(p.proNum[i].rData[right]>=‘A‘&&(p.proNum[i].rData[right]<=‘Z‘)))
             flag=1;
            if(flag!=1)
     {

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     204860  2013-05-27 15:33  ll1\Debug\ll1.exe

     文件     190988  2013-05-27 15:33  ll1\Debug\ll1.ilk

     文件      43273  2013-05-27 15:33  ll1\Debug\ll1.obj

     文件     225860  2013-05-27 15:32  ll1\Debug\ll1.pch

     文件     377856  2013-05-27 15:33  ll1\Debug\ll1.pdb

     文件      33792  2013-05-27 15:34  ll1\Debug\vc60.idb

     文件      45056  2013-05-27 15:33  ll1\Debug\vc60.pdb

     文件      34488  2013-05-27 15:33  ll1\ll1.cpp

     文件       4248  2013-05-27 15:32  ll1\ll1.dsp

     文件        531  2013-05-27 15:24  ll1\ll1.dsw

     文件      41984  2013-05-27 16:00  ll1\ll1.ncb

     文件      48640  2013-05-27 16:00  ll1\ll1.opt

     文件        880  2013-05-27 15:33  ll1\ll1.plg

     目录          0  2013-06-03 09:26  ll1\Debug

     目录          0  2013-06-03 09:26  ll1

----------- ---------  ---------- -----  ----

              1252456                    15


评论

共有 条评论