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

更新 main.c

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