• 大小: 48KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: 其他
  • 标签: 编译原理  

资源简介

编译原理课程设计。。。。简单的FIRST集FOLLOW集求解的程序。。。。压缩文档中ffs.cpp为源程序。。。。使用了bool。。。。所以做了cpp。。。。Production文本是供程序使用的产生式。。。。其余的是过程文件。。。。可以忽略。。。。

资源截图

代码片段和文件信息

/*
 * ffs.cpp
 *
 *  Created on: 2017年6月9日
 *  Author: PBB
 */
#include
#include
#include

struct node
{
char c;
struct node* next;
};
typedef struct node Node;

struct unit
{
Node* sign;
struct unit* next;
};
typedef struct unit Unit;

struct production
{
Unit* unterminal;
Unit* candidate;
Unit* FIRST;
struct production* next;
};
typedef struct production Production;

struct ff
{
Unit* unterminal;
Unit* FIRST;
Unit* FOLLOW;
struct ff* next;
};
typedef struct ff FF;

bool isEqual(Unit* xUnit* y);
bool stringCanBeEmpty(Production* headUnit* u);
bool isTerminal(Unit* u);
Node* copyNode(Node* nm);
Unit* copyUnit(Unit* ubool trimint count);
void displayNode(Node* n);
void displayUnit(Unit* ubool split);
int unitLength(Unit* u);
void traservalCandidate(Production* head);
void traservalFirstOfCandidate(Production *head);
void traservalFFVT(FF* head);
void freeNode(Node* n);
void freeUnit(Unit* u);
void freeProduction(Production* p);
void freeFF(FF* f);
void addInFF(Unit* uUnit* &f);
void dataFromFile(const char* pathProduction* &head);
void FFGenerate(FF* &headProduction* phead);
Unit* FirstOfUnit(Production* headUnit* string);
void Follow(FF* fheadProduction* phead);




bool isEqual(Unit* xUnit* y)//判断连个字符是否相等==两个传入的参数是需要进行比较的字符
{
if(x==NULL && y==NULL) return true;
if((x==NULL && y) || (x && y==NULL)) return false;
Node* nx;
Node* ny;

for(nx=x->signny=y->sign;;)
{
if(nx && ny)
{
if(nx->c!=ny->c) return false;
nx=nx->next;
ny=ny->next;
}
if((nx==NULL && ny) || (nx && ny==NULL)) return false;
if(nx==NULL && ny==NULL) return true;
}
return false;
}

bool unitCanbeEmpty(Production* headUnit* uUnit* &empty)//判断某个字符能否为空字==产生式链的头结点==要判断的字符==需要带回的空字的指针
{
empty=NULL;

Production* p;
p=head;

Unit* t_empty;
t_empty=(Unit*)malloc(sizeof(Unit));
t_empty->sign=(Node*)malloc(sizeof(Node));
t_empty->sign->c=‘ ‘;
t_empty->sign->next=NULL;
t_empty->next=NULL;

for(;p;p=p->next)
{
if(isEqual(p->unterminalu))
{
if(isEqual(t_emptyp->candidate))
{
empty=t_empty;
return true;
}
}
}
return false;
}

bool stringCanBeEmpty(Production* headUnit* u)//判断某个字符串能否为空字==产生式链的头指针==需要判断的字符串链的头指针
{
if(isTerminal(u)) return false;
Production* p;
for(;u;u=u->next)
{
for(p=head;p;p=p->next)
{
if(isEqual(p->unterminalu))
{
Unit* back_no_use;
if(!unitCanbeEmpty(headuback_no_use)) return false;
}
}
}
return true;
}

bool isTerminal(Unit* u)//判断某个字符是否为终结符==需要判断的字符
{
Node* n;
n=u->sign;
if(n->c>=‘A‘ && n->c<=‘Z‘) return false;
else return true;
}

Node* copyNode(Node* n)//复制节点----供copyUnit调用
{
if(n==NULL) return NULL;
Node* chead;
Node* copy;
chead=copy=(Node*)malloc(sizeof(Node));
copy->c=‘\0‘;
copy->next=NULL;
for(;n;)
{
copy->c=n->c;
if(copy->c==‘\n‘)
{
printf(“%d“c

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       14398  2017-06-16 10:01  ffs.cpp
     文件       53760  2017-06-05 17:40  FIRST、FOLLOW集合求解.vsd
     文件       19872  2017-06-15 21:23  FIRST、FOLLOW集求解思路.docx
     文件          39  2017-06-10 12:54  Production.txt
     文件         410  2017-06-06 09:03  产生式链遍历算法.c
     文件        2059  2017-06-06 08:38  文件读取算法.c
     文件        1483  2017-06-10 07:08  错误的算法记录.c

评论

共有 条评论