提交 f6a801a0 创建 作者: 宋海霞's avatar 宋海霞

更新 main.c

上级 28c705f7
#include "NFAToDFA.h"
#include "RegexpToPost.h"
#include "PostToNFA.h"
#include "NFAStateStack.h"
#include "NFAFragmentStack.h"
#include "OutputResult.h"
#include <stdlib.h>
NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段
NFAStateStack StateStack; // 栈。用于储存 NFA 状态
const char VoidTrans = '$'; // 表示空转换
char* regexp = "a(a|1)*"; // 例 1
// char* regexp = "(aa|b)*a(a|bb)*"; // 例 2
// char* regexp = "(a|b)*a(a|b)?"; // 例 3
char regexp_ci[256];
int main(int argc, char **argv)
{
char *post;
DFA* dfa = (DFA*)malloc(sizeof(DFA));
dfa->length = 0;
//
// 初始化
//
InitNFAFragmentStack(&FragmentStack);
#ifdef CODECODE_CI
scanf("%s", regexp_ci);
regexp = regexp_ci;
#endif
//
// 调用 re2post 函数将正则表达式字符串转换成解析树的后序遍历序列
//
post = re2post(regexp);
//
// 调用 post2dfa 函数将解析树的后序遍历序列转换为 DFA
//
dfa = post2dfa(dfa, post);
OutputResult(dfa);
return 0;
}
/*
功能
创建一个 DFA 状态的转换。
数:
TransformChar -- 转换符号。
NFAStateArray -- NFA 状态指针数组。
Count -- 数组元素个数。
返回值:
Transform 结构体指针。
*/
Transform* CreateDFATransform(char TransformChar, NFAState** NFAStateArray, int Count)
{
int i;
Transform* pTransform = (Transform*)malloc(sizeof(Transform));
for (i=0; i<Count; i++)
{
pTransform->NFAlist[i] = NFAStateArray[i];
}
pTransform->NFAStateCount = Count;
pTransform->TransformChar = TransformChar;
pTransform->DFAStateIndex = -1;
pTransform->NextTrans = NULL;
return pTransform;
}
/*
功能
创建一个 DFA 状态。
数:
pTransform -- DFA 状态转换指针。
返回值:
DFAState 结构体指针。
*/
DFAState* CreateDFAState(Transform* pTransform)
{
int i;
DFAState* pDFAState = (DFAState*)malloc(sizeof(DFAState));
for (i=0; i<pTransform->NFAStateCount; i++)
{
pDFAState->NFAlist[i] = pTransform->NFAlist[i];
}
pDFAState->NFAStateCount = pTransform->NFAStateCount;
pDFAState->firstTran = NULL;
return pDFAState;
}
/*
功能
判断一个转换中的 NFA 状态集合是否为某一个 DFA 状态中 NFA 状态集合的子集。
数:
pDFA -- DFA 指针。
pTransform -- DFA 状态转换指针。
返回值:
如果存在返回 DFA 状态下标,不存在返回 -1。
*/
int NFAStateIsSubset(DFA* pDFA, Transform* pTransform)
{
//
// TODO: 在此添加代码
//
}
/*
功能
判断某个 DFA 状态的转换链表中是否已经存在一个字符的转换。
数:
pDFAState -- DFAState 指针。
TransformChar -- 转换标识符。
返回值:
Transform 结构体指针。
*/
Transform* IsTransformExist(DFAState* pDFAState, char TransformChar)
{
//
// TODO: 在此添加代码
//
}
/*
功能
将一个 NFA 集合合并到一个 DFA 转换中的 NFA 集合中。
注意,合并后的 NFA 集合中不应有重复的 NFA 状态。
数:
NFAStateArray -- NFA 状态指针数组,即待加入的 NFA 集合。
Count -- 待加入的 NFA 集合中元素个数。
pTransform -- 转换指针
*/
void AddNFAStateArrayToTransform(NFAState** NFAStateArray, int Count, Transform* pTransform)
{
//
// TODO: 在此添加代码
//
}
/*
功能
使用二叉树的先序遍历算法求一个 NFA 状态的ε-闭包。
数:
State -- NFA 状态指针。从此 NFA 状态开始求ε-闭包。
StateArray -- NFA 状态指针数组。用于返回ε-闭包。
Count -- 元素个数。 用于返回ε-闭包中 NFA 状态的个数。
*/
void Closure(NFAState* State, NFAState** StateArray, int* Count)
{
InitNFAStateStack(&StateStack); // 调用 InitNFAStateStack 函数初始化栈
//
// TODO: 在此添加代码
//
}
/*
功能
将解析树的后序遍历序列转换为 DFA。
数:
pDFA -- DFA 指针。
postfix -- 正则表达式的解析树后序遍历序列。
返回值:
DFA 指针。
*/
NFAState* Start = NULL;
DFA* post2dfa(DFA* pDFA, char *postfix)
{
int i, j; // 游标
Transform* pTFCursor; // 转换指
NFAState* NFAStateArray[MAX_STATE_NUM]; // NFA 状态指针数组。用于保存ε-闭包
int Count = 0; // ε-闭包中元素个数
//
// 调用 post2nfa 函数将解析树的后序遍历序列转换为 NFA 并返回开始状态
//
Start = post2nfa(postfix);
//
// TODO: 在此添加代码
//
return pDFA;
}
#include "NFAToDFA.h"
#include "RegexpToPost.h"
#include "PostToNFA.h"
#include "NFAStateStack.h"
#include "NFAFragmentStack.h"
#include "OutputResult.h"
#include <stdlib.h>
NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段
NFAStateStack StateStack; // 栈。用于储存 NFA 状态
const char VoidTrans = '$'; // 表示空转换
char* regexp = "a(a|1)*"; // 例 1
// char* regexp = "(aa|b)*a(a|bb)*"; // 例 2
// char* regexp = "(a|b)*a(a|b)?"; // 例 3
char regexp_ci[256];
int main(int argc, char **argv)
{
char *post;
DFA* dfa = (DFA*)malloc(sizeof(DFA));
dfa->length = 0;
//
// 初始化栈
//
InitNFAFragmentStack(&FragmentStack);
#ifdef CODECODE_CI
scanf("%255s", regexp_ci);
regexp = regexp_ci;
#endif
//
// 调用 re2post 函数将正则表达式字符串转换成解析树的后序遍历序列
//
post = re2post(regexp);
//
// 调用 post2dfa 函数将解析树的后序遍历序列转换为 DFA
//
dfa = post2dfa(dfa, post);
OutputResult(dfa);
return 0;
}
/*
功能:
创建一个 DFA 状态的转换。
参数:
TransformChar -- 转换符号。
NFAStateArray -- NFA 状态指针数组。
Count -- 数组元素个数。
返回值:
Transform 结构体指针。
*/
Transform* CreateDFATransform(char TransformChar, NFAState** NFAStateArray, int Count)
{
int i;
Transform* pTransform = (Transform*)malloc(sizeof(Transform));
for (i=0; i<Count; i++)
{
pTransform->NFAlist[i] = NFAStateArray[i];
}
pTransform->NFAStateCount = Count;
pTransform->TransformChar = TransformChar;
pTransform->DFAStateIndex = -1;
pTransform->NextTrans = NULL;
return pTransform;
}
/*
功能:
创建一个 DFA 状态。
参数:
pTransform -- DFA 状态转换指针。
返回值:
DFAState 结构体指针。
*/
DFAState* CreateDFAState(Transform* pTransform)
{
int i;
DFAState* pDFAState = (DFAState*)malloc(sizeof(DFAState));
for (i=0; i<pTransform->NFAStateCount; i++)
{
pDFAState->NFAlist[i] = pTransform->NFAlist[i];
}
pDFAState->NFAStateCount = pTransform->NFAStateCount;
pDFAState->firstTran = NULL;
return pDFAState;
}
/*
功能:
判断一个转换中的 NFA 状态集合是否为某一个 DFA 状态中 NFA 状态集合的子集。
参数:
pDFA -- DFA 指针。
pTransform -- DFA 状态转换指针。
返回值:
如果存在返回 DFA 状态下标,不存在返回 -1。
*/
int NFAStateIsSubset(DFA* pDFA, Transform* pTransform)
{
//
// TODO: 在此添加代码
//
}
/*
功能:
判断某个 DFA 状态的转换链表中是否已经存在一个字符的转换。
参数:
pDFAState -- DFAState 指针。
TransformChar -- 转换标识符。
返回值:
Transform 结构体指针。
*/
Transform* IsTransformExist(DFAState* pDFAState, char TransformChar)
{
//
// TODO: 在此添加代码
//
}
/*
功能:
将一个 NFA 集合合并到一个 DFA 转换中的 NFA 集合中。
注意,合并后的 NFA 集合中不应有重复的 NFA 状态。
参数:
NFAStateArray -- NFA 状态指针数组,即待加入的 NFA 集合。
Count -- 待加入的 NFA 集合中元素个数。
pTransform -- 转换指针。
*/
void AddNFAStateArrayToTransform(NFAState** NFAStateArray, int Count, Transform* pTransform)
{
//
// TODO: 在此添加代码
//
}
/*
功能:
使用二叉树的先序遍历算法求一个 NFA 状态的ε-闭包。
参数:
State -- NFA 状态指针。从此 NFA 状态开始求ε-闭包。
StateArray -- NFA 状态指针数组。用于返回ε-闭包。
Count -- 元素个数。 用于返回ε-闭包中 NFA 状态的个数。
*/
void Closure(NFAState* State, NFAState** StateArray, int* Count)
{
InitNFAStateStack(&StateStack); // 调用 InitNFAStateStack 函数初始化栈
//
// TODO: 在此添加代码
//
}
/*
功能:
将解析树的后序遍历序列转换为 DFA。
参数:
pDFA -- DFA 指针。
postfix -- 正则表达式的解析树后序遍历序列。
返回值:
DFA 指针。
*/
NFAState* Start = NULL;
DFA* post2dfa(DFA* pDFA, char *postfix)
{
int i, j; // 游标
Transform* pTFCursor; // 转换指针
NFAState* NFAStateArray[MAX_STATE_NUM]; // NFA 状态指针数组。用于保存ε-闭包
int Count = 0; // ε-闭包中元素个数
//
// 调用 post2nfa 函数将解析树的后序遍历序列转换为 NFA 并返回开始状态
//
Start = post2nfa(postfix);
//
// TODO: 在此添加代码
//
return pDFA;
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论