資源簡介
編譯原理實驗報告及源碼,LR1 活前綴 字符串匹配

代碼片段和文件信息
#include
#include
#include
#include
#include
#include
//輸入為擴廣后的文法
//文法存儲在g中
#define?PROJECT_SET_SIZE?20
#define?PROJECT_ID_POS?0
#define?GRAMMER_ID_POS?1
#define?GRAMMER_START_CHAR_POS?5
#define?BFCHAR_POS?2
#define?AFCHAR_POS?3
#define?PROJECT_LEN_POS?4
#define?ID?10000
struct?grammer
{
char?**g;
char?vt[127];
char?vn[27];
char?s;
int?line;
};
typedef?struct
{
int?id;
char?ch;
}SElemType;
#include?“stack.h“
//?文法的項目
struct?gprjt
{
char?**gp;//gp的格式為gp[1][0]為編號(從0開始),gp[1][2]字符數gp[i][1]圓點前的字符若無則為0,gp[i][2]為圓點后的字符,若無為0
char?s;
int?line;
};
typedef?struct?prjset
{
int?id;//項目集編號,從10000開始,與項目編號(從0開始)區別
struct?prjset?*next;//指向下個項目集
char?prjt[PROJECT_SET_SIZE+1];//PROJECT_SET_SIZE個單元存儲項目的編號prjt[0]項目編號的個數
char?pointafter[PROJECT_SET_SIZE+1];//圓點后的字符pointafter[0]字符個數
struct?prjset?*actorgo[PROJECT_SET_SIZE];
char?pointbefore;
}prjset*pprjset;
struct?head
{
prjset?*I;//指向I0及第一個項目集
prjset?*tail;
int?size;//項目集的個數
};
struct?From
{
int?**form;
char?vn[27];
char?vt[127];
};
char?DOT?=?‘*‘;
grammer?g;
gprjt?project;
head?root;
struct?From?form;
/////////////////////////////////////////////////
void?Init();
void?Quit();
void?Input();
int?OpenFile(char?*s);
void?CreateProjectSet();//構造文法的項目集
void?Closure(prjset?*prjset);//prjset指向項目集
int?go(int?rk?prjset?*prjset);//rk為項目編號,將rk的去向加入prjset指向的項目集中返回項目編號,若無,返回-1
int?CreateAnalysisForm();//返回1,則LR(0)分析表創建成功;返回0,不成功
void?PrintPojectSet();
void?PrintForm();
void?AnalysisProcess(char?*s);
int?IsInSet(char?*s?char?ch);
void?JoinSet(char?*s?char?ch);
////////////////////////////////////////////////
void?main()
{
int?i;
char?ch;
char?filename[25];
char?string[100];
Init();
re: printf(“====================?LR(0)語法分析?=====================\n\n您希望從文件讀入文法請按1,退出請按0?\n“);
fflush(stdin);
ch?=?getche();
printf(“\n“);
????if(ch==‘0‘)
return;
if(ch==‘1‘)
{
printf(“請輸入存放文法的文件名(XXX.txt)?:“);
gets(filename);
if(!OpenFile(filename))
{
goto?re;
}
}
CreateProjectSet();
PrintPojectSet();
CreateAnalysisForm();
/* if(!CreateAnalysisForm())
{
printf(“不是?LR(0)?文法?!\n“);
goto?re;
}//if
*/
PrintForm();
re2:printf(“進行字符串匹配請按‘1‘退出請按‘0‘:“);
fflush(stdin);
printf(“請輸入您的選擇?:?“);
ch?=?getche();
printf(“\n“);
if(ch?==?‘1‘)
{
printf(“請輸入要匹配的序列串(以?‘#‘結尾):“);
gets(&string[1]);
string[0]?=?strlen(&string[1]);
i?=?string[0];
if(string[i]?!=?‘#‘)
{
string[i+1]?=?‘#‘;
string[i+2]?=?‘\0‘;
string[0]++;
}
AnalysisProcess(string);
goto?re2;
}
else?if(ch?==?‘0‘)
{
Quit();
return?;
}
else?
goto?re2;
}
void?Init()
{
form.form?=?NULL;
form.vn[0]?=?form.vt[0]?=?0;
root.I?=?root.tail?=?NULL;
root.size?=?0;
}
void?Quit()
{
if(root.I?!=?NULL)
{
for(pprjset?p=root.I;?p!=NULL;?p=p->next)
{
pprjset?q?=?p-
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????239058??2011-07-16?17:28??實驗3編譯原理?LR1\LR實驗報告冊.docx
?????文件??????19458??2011-06-19?22:28??實驗3編譯原理?LR1\LR語法分析.cpp
?????文件?????204891??2011-06-19?22:28??實驗3編譯原理?LR1\LR語法分析.exe
?????文件?????????29??2011-06-17?23:46??實驗3編譯原理?LR1\test.txt
?????目錄??????????0??2011-07-16?17:28??實驗3編譯原理?LR1
-----------?---------??----------?-----??----
???????????????463436????????????????????5
評論
共有 條評論