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

更新 main.c

上级 528bcbe6
#include "RegexpToNFA.h" #include "RegexpToNFA.h"
#include "RegexpToPost.h" #include "RegexpToPost.h"
#include "NFAFragmentStack.h" #include "NFAFragmentStack.h"
#include "OutputResult.h" #include "OutputResult.h"
#include <stdlib.h> #include <stdlib.h>
NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段 NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段
char* regexp = "ab"; // 例 1 char* regexp = "ab"; // 例 1
// char* regexp = "a|b"; // 例 2 // char* regexp = "a|b"; // 例 2
// char* regexp = "a*"; // 例 3 // char* regexp = "a*"; // 例 3
// char* regexp = "a?"; // 例 4 // char* regexp = "a?"; // 例 4
// char* regexp = "a+"; // 例 5 // char* regexp = "a+"; // 例 5
// char* regexp = "a(a|1)*";// 例 6 // char* regexp = "a(a|1)*";// 例 6
// char* regexp = "(aa|b)*a(a|bb)*";// 例 7 // char* regexp = "(aa|b)*a(a|bb)*";// 例 7
// char* regexp = "(a|b)*a(a|b)?"; // 例 8 // char* regexp = "(a|b)*a(a|b)?"; // 例 8
char regexp_ci[256]; char regexp_ci[256];
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *post; char *post;
NFAState *start; NFAState *start;
#ifdef CODECODE_CI #ifdef CODECODE_CI
scanf("%s", regexp_ci); scanf("%255s", regexp_ci);
regexp = regexp_ci; regexp = regexp_ci;
#endif #endif
// //
// 初始化 // 初始化栈
// //
InitNFAFragmentStack(&FragmentStack); InitNFAFragmentStack(&FragmentStack);
// //
// 调用 re2post 函数将正则表达式字符串转换成解析树的后续遍历序列 // 调用 re2post 函数将正则表达式字符串转换成解析树的后续遍历序列
// //
post = re2post(regexp); post = re2post(regexp);
// //
// 调用 post2nfa 函数将解析树的后续遍历序列转换为 NFA 并返回开始状态 // 调用 post2nfa 函数将解析树的后续遍历序列转换为 NFA 并返回开始状态
// //
start = post2nfa(post); start = post2nfa(post);
OutputResult(start); OutputResult(start);
return 0; return 0;
} }
/* /*
功能 功能:
初始化一个状态。 初始化一个状态。
返回值: 返回值:
状态指针。 状态指针。
*/ */
int nstate = 1; // 状态名计数器 int nstate = 1; // 状态名计数器
NFAState* CreateNFAState() NFAState* CreateNFAState()
{ {
NFAState *s = (NFAState*)malloc(sizeof(NFAState)); NFAState *s = (NFAState*)malloc(sizeof(NFAState));
s->Name = nstate++; s->Name = nstate++;
s->Transform = '\0'; s->Transform = '\0';
s->Next1 = NULL; s->Next1 = NULL;
s->Next2 = NULL; s->Next2 = NULL;
s->AcceptFlag = 0; s->AcceptFlag = 0;
return s; return s;
} }
/* /*
功能 功能:
将开始状态和接受状态组成一个 Fragment。 将开始状态和接受状态组成一个 Fragment。
数: 参数:
StartState -- 开始状态 StartState -- 开始状态。
AcceptState -- 接受状态 AcceptState -- 接受状态。
返回值: 返回值:
Fragment 结构体指针。 Fragment 结构体指针。
*/ */
NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState) NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState)
{ {
NFAFragment n = {StartState, AcceptState}; NFAFragment n = {StartState, AcceptState};
return n; return n;
} }
/* /*
功能 功能:
将解析树的后序序列转换为 NFA。 将解析树的后序序列转换为 NFA。
数: 参数:
postfix -- 解析树的后序序列指针。 postfix -- 解析树的后序序列指针。
返回值: 返回值:
NFA 的开始状态指针 NFA 的开始状态指针。
*/ */
const char VoidTrans = '$'; // 表示空转换 const char VoidTrans = '$'; // 表示空转换
NFAState* post2nfa(char *postfix) NFAState* post2nfa(char *postfix)
{ {
char *p; // 游标 char *p; // 游标
NFAFragment fragment1, fragment2, fm; // NFA 片段结构体变量 NFAFragment fragment1, fragment2, fm; // NFA 片段结构体变量
NFAFragment fragment = {0, 0}; // 初始化用于返回的 NFA 片段 NFAFragment fragment = {0, 0}; // 初始化用于返回的 NFA 片段
NFAState *NewStartState, *NewAcceptState; // 开始状态和接受状态指针 NFAState *NewStartState, *NewAcceptState; // 开始状态和接受状态指针
// //
// TODO: 在此添加代码 // TODO: 在此添加代码
// //
return fragment.StartState; return fragment.StartState;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论