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

更新 main.c

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