资源简介
编译原理实验报告及源码,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
评论
共有 条评论