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

modify

上级 f0de2fd7
没有这种文件类型的预览
...@@ -22,6 +22,11 @@ int main(int argc, char **argv) ...@@ -22,6 +22,11 @@ int main(int argc, char **argv)
char *post; char *post;
NFAState *start; NFAState *start;
// 在 CP Lab中执行程序时不会使用下面宏定义包含的代码,提交作业后,这部分代码会用于线上流水线运行时进行算例的验证。
// 在运行流水线时会从input.txt文件中读取正则表达式,进行算例的验证。
// 其中,input1.txt ~ input8.txt文件中包含的正则表达式与例1 ~ 例8的正则表达式是对应的。
#ifdef CODECODE_CI #ifdef CODECODE_CI
scanf("%255s", regexp_ci); scanf("%255s", regexp_ci);
regexp = regexp_ci; regexp = regexp_ci;
...@@ -102,11 +107,76 @@ NFAState* post2nfa(char *postfix) ...@@ -102,11 +107,76 @@ NFAState* post2nfa(char *postfix)
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; // 开始状态和接受状态指针
for(p=postfix; *p != '\0'; p++)
{
switch(*p)
{
default: // 构造单字符 NFA 片段
// 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();
// 开始状态通过单字符转换到接受状态
NewStartState->Transform = *p;
NewStartState->Next1 = NewAcceptState;
NewAcceptState->AcceptFlag = 1;
// 调用 MakeNFAFragment 函数生成一个新的 NFA 片段, 并入栈
fm = MakeNFAFragment(NewStartState, NewAcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
case '.': // 构造连接 NFA 片段
// 栈顶的两个片段出栈,构造新的 NFA 片段
fragment2 = PopNFAFragment(&FragmentStack);
fragment1 = PopNFAFragment(&FragmentStack);
// 片段 1 通过ε转换与片段 2 连接
fragment1.AcceptState->AcceptFlag = 0;
fragment1.AcceptState->Next1 = fragment2.StartState;
fragment1.AcceptState->Transform = VoidTrans;
// 调用 MakeNFAFragment 函数生成一个新的 NFA 片段, 并入栈
fm = MakeNFAFragment(fragment1.StartState, fragment2.AcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
case '|': // 构造选择 NFA 片段
//将栈顶的两个片段出栈,构造新的 NFA 片段, 并入栈
//
// TODO: 在此添加代码
//
break;
case '*': // 构造星号 NFA 片段
//将栈顶的一个片段出栈,构造新的 NFA 片段, 并入栈
//
// TODO: 在此添加代码
//
break;
case '?': // 构造问号 NFA 片段
//将栈顶的一个片段出栈,构造新的 NFA 片段, 并入栈
//
// TODO: 在此添加代码
//
break;
case '+': // 构造加号 NFA 片段
//将栈顶的一个片段出栈,构造新的 NFA 片段, 并入栈
//
// TODO: 在此添加代码
//
break;
}
}
// //
// TODO: 在此添加代码 // 将 NFA 最终结果出栈保存到 fragment 中
// //
fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState; return fragment.StartState;
} }
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论