資源簡(jiǎn)介
通過(guò)分析文件chanshengshi.txt中的文法,得到ll(1)預(yù)測(cè)分析表并在文件analysis_table.txt中輸出顯示。

代碼片段和文件信息
/*
LL(1)預(yù)測(cè)分析表的構(gòu)造,空字用符號(hào)~表示
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
/***********************定義結(jié)構(gòu)體*********************************/
//1.定義非終結(jié)符的結(jié)構(gòu)體
struct?no_terminal_sign
{
char?no_ter;???????????????????//非終結(jié)符
char?first[MAX];???????????????//非終結(jié)符的first集合
char?follow[MAX];??????????????//非終結(jié)符的follow集合
};
//2.定義候選式的結(jié)構(gòu)體
struct?candidate_formular
{
char?candidate[MAX];???????????//產(chǎn)生式串
char?first[MAX];???????????????//產(chǎn)生式的first集合
};
//3.定義產(chǎn)生式的結(jié)構(gòu)體
typedef?struct?produce
{
char?left;????????????????//產(chǎn)生式左部?
char?right[MAX];??????????//產(chǎn)生式右部
}chanshengshi;
//4.定義終結(jié)符的結(jié)構(gòu)體
struct?terminal_sign
{
char?ter;???????????????//終結(jié)符
char?first[MAX];????????//終結(jié)符的first集合
};
/******************************************************************/
//函數(shù)定義
int?is_include(char?*?achar?b)//一個(gè)終結(jié)符屬于某個(gè)集合
{
int?i;
for(i=0;a[i]!=‘\0‘;i++)
if(b==a[i])
return?TRUE;
return?FALSE;
}
void?add_ter(char?*?achar?sign)//向一個(gè)集合中添加一個(gè)終結(jié)符
{
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)//向一個(gè)終結(jié)符的first集合中添加一個(gè)終結(jié)符
{
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)//向一個(gè)候選式的first集合中添加一個(gè)終結(jié)符
{
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)//向一個(gè)終結(jié)符的follow集合中添加一個(gè)終結(jié)符
{
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)//判斷一個(gè)符號(hào)是終結(jié)符還是非終結(jié)符
{
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)//判斷一個(gè)非終結(jié)符的first集合中包含空字
{
int?i;
for(i=0;a->first[i]!=‘\0‘;i++)
if(a->first[i]==‘~‘)
return?TRUE;
return?FALSE;
}
void?subtract_null(char?*a)//將一個(gè)集合減去空字
{
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添加到非終結(jié)符的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->
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????????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
評(píng)論
共有 條評(píng)論