• 大小: 19KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2022-06-24
  • 语言: 其他
  • 标签: C语言  

资源简介

通过分析文件chanshengshi.txt中的文法,得到ll(1)预测分析表并在文件analysis_table.txt中输出显示。

资源截图

代码片段和文件信息

/*
LL(1)预测分析表的构造,空字用符号~表示
This procedure is written by fanxiangchao.
*/
#include
#include
#include
#include
#include
#define FALSE 0 
#define TRUE 1 
#define MAX 100
#define NULL 0
#define ERROR -1
/***********************定义结构体*********************************/
//1.定义非终结符的结构体
struct no_terminal_sign
{
char no_ter;                   //非终结符
char first[MAX];               //非终结符的first集合
char follow[MAX];              //非终结符的follow集合
};
//2.定义候选式的结构体
struct candidate_formular
{
char candidate[MAX];           //产生式串
char first[MAX];               //产生式的first集合
};
//3.定义产生式的结构体
typedef struct produce
{
char left;                //产生式左部 
char right[MAX];          //产生式右部
}chanshengshi;
//4.定义终结符的结构体
struct terminal_sign
{
char ter;               //终结符
char first[MAX];        //终结符的first集合
};
/******************************************************************/
//函数定义
int is_include(char * achar b)//一个终结符属于某个集合
{
int i;
for(i=0;a[i]!=‘\0‘;i++)
if(b==a[i])
return TRUE;
return FALSE;
}

void add_ter(char * achar sign)//向一个集合中添加一个终结符
{
int length;
if(!is_include(asign)){
length=strlen(a);
a[length]=sign;
    a[length+1]=‘\0‘;
}
}

void add_ter_to_first(struct no_terminal_sign * achar sign)//向一个终结符的first集合中添加一个终结符
{
int length;
if(!is_include(a->firstsign)){
        length=strlen(a->first);
a->first[length]=sign;
a->first[length+1]=‘\0‘;
}
}

void add_ter_to_candidate_first(struct candidate_formular * achar sign)//向一个候选式的first集合中添加一个终结符
{
int length;
if(!is_include(a->firstsign)){
length=strlen(a->first);
a->first[length]=sign;
a->first[length+1]=‘\0‘;
}
}

void add_ter_to_follow(struct no_terminal_sign * achar sign)//向一个终结符的follow集合中添加一个终结符
{
int length;
if(!is_include(a->followsign)){
length=strlen(a->follow);
a->follow[length]=sign;
    a->follow[length+1]=‘\0‘;
}
}

int is_terminal(char signstruct terminal_sign *a)//判断一个符号是终结符还是非终结符
{
struct terminal_sign * p;
if(sign==‘~‘) return -1;
for(p=a;p->ter!=NULL;p++)
if(p->ter==sign)
return TRUE;
return FALSE;
}

int is_include_null(struct no_terminal_sign *a)//判断一个非终结符的first集合中包含空字
{
int i;
for(i=0;a->first[i]!=‘\0‘;i++)
if(a->first[i]==‘~‘)
return TRUE;
return FALSE;
}

void subtract_null(char *a)//将一个集合减去空字
{
int imark;
for(i=0;a[i]!=‘\0‘;i++)
if(a[i]==‘~‘)
break;
mark=i;
for(i=mark;i<(signed)strlen(a);i++)
a[i]=a[i+1];
}

void merge_to_first(struct no_terminal_sign * achar *b)//将集合b添加到非终结符的first集合a中
{
int in;
n=strlen(a->first);
for(i=0;b[i]!=‘\0‘;i++)
if(!is_include(a->firstb[i]))
a->first[n++]=b[i];
a->first[n]=‘\0‘;
}

void merge_to_candidate_first(struct candidate_formular * achar *b)//将集合b添加到候选式的first集合a中
{
int in;
n=strlen(a->first);
for(i=0;b[i]!=‘\0‘;i++)
if(!is_include(a->firstb[i]))
a->first[n++]=b[i];
a->

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

     文件         54  2008-06-21 14:42  编译原理\chanshengshi.txt

     文件        828  2008-06-21 22:13  编译原理\analysis_table.txt

     文件      16296  2008-06-21 22:13  编译原理\LL(1).cpp

     文件     105984  2008-06-27 16:52  编译原理\LL(1)源码.doc

     目录          0  2008-06-21 18:49  编译原理

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

               123162                    5


评论

共有 条评论