提交 36358cf1 创建 作者: 庞天聪's avatar 庞天聪

任务完成,提交作业

上级 e3ffc3b5
......@@ -92,29 +92,18 @@ NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState)
return n;
}
/*
功能:
将解析树的后序序列转换为 NFA。
参数:
postfix -- 解析树的后序序列指针。
返回值:
NFA 的开始状态指针。
*/
/*功能:将解析树的后序序列转换为 NFA。
参数:postfix -- 解析树的后序序列指针。
返回值:NFA 的开始状态指针。*/
const char VoidTrans = '$'; // 表示空转换
NFAState* post2nfa(char *postfix)
{
char *p; // 游标
{ char *p; // 游标
NFAFragment fragment1, fragment2, fm; // NFA 片段结构体变量
NFAFragment fragment = {0, 0}; // 初始化用于返回的 NFA 片段
NFAState *NewStartState, *NewAcceptState; // 开始状态和接受状态指针
for(p=postfix; *p != '\0'; p++)
{
switch(*p)
{
default: // 构造单字符 NFA 片段
for(p = postfix;*p !='\0';p++)
{ switch(*p)
{ default: // 构造单字符 NFA 片段
// 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();
......@@ -138,43 +127,88 @@ NFAState* post2nfa(char *postfix)
fm = MakeNFAFragment(fragment1.StartState, fragment2.AcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
case '|': // 构造选择 NFA 片段
//
// TODO: 在此添加代码
//
break;
case '*': // 构造星号 NFA 片段
//
// TODO: 在此添加代码
//
case'|': //构造选择NFA片段
// 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();
//将栈顶的两个片段出栈,构造新的 NFA 片段, 并入栈
fragment2 = PopNFAFragment(&FragmentStack);
fragment1 = PopNFAFragment(&FragmentStack);
fragment1.AcceptState->AcceptFlag = 0;
fragment2.AcceptState->AcceptFlag = 0;
NewAcceptState->AcceptFlag = 1;
// 开始状态通过ε转换与片段 1 连接
NewStartState->Next1 =fragment1.StartState;
NewStartState->Transform = VoidTrans;
// 开始状态通过ε转换与片段 2 连接
NewStartState->Next2 =fragment2.StartState;
NewStartState->Transform = VoidTrans;
// 片段 1通过ε转换与接受状态连接
fragment1.AcceptState->Next1=NewAcceptState;
fragment1.AcceptState->Transform = VoidTrans;
// 片段 2通过ε转换与接受状态连接
fragment2.AcceptState->Next1=NewAcceptState;
fragment2.AcceptState->Transform = VoidTrans;
// 调用 MakeNFAFragment 函数生成一个新的 NFA 片段, 并入栈
fm = MakeNFAFragment(NewStartState, NewAcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
case '?': // 构造问号 NFA 片段
//
// TODO: 在此添加代码
//
case'*': //构造星号NFA片段
fragment = PopNFAFragment(&FragmentStack);
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();//开始状态的Transform域赋值为空转换,Next1域指向片段的开始状态,Next2域指向新创建的接受状态
NewStartState->Transform = VoidTrans;
NewStartState->Next1 = fragment.StartState;
NewStartState->Next2 = NewAcceptState;
//接受状态的AcceptFlag域赋值为1
NewAcceptState->AcceptFlag = 1; //片段的接受状态的AcceptFlag域赋值为0,Next1域指向片段自身的开始状态,Next2域指向新创建的接受状态,Transform域为空转换
fragment.AcceptState->AcceptFlag = 0;
fragment.AcceptState->Next1 = fragment.StartState;
fragment.AcceptState->Next2 = NewAcceptState;
fragment.AcceptState->Transform = VoidTrans;
//调用MakeNFAFragment函数生成一个新的NFA片段,并入栈
fm = MakeNFAFragment(NewStartState,NewAcceptState);
PushNFAFragment(&FragmentStack,fm);
break;
case '+': // 构造加号 NFA 片段
//
// TODO: 在此添加代码
//
case'?': //构造问号NFA片段
// 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();
//将栈顶的一个片段出栈,构造新的 NFA 片段, 并入栈
fragment1 = PopNFAFragment(&FragmentStack);
fragment1.AcceptState->AcceptFlag = 0;
NewAcceptState->AcceptFlag = 1; //开始状态通过ε转换与片段1相连
NewStartState->Next1 =fragment1.StartState;
NewStartState->Transform = VoidTrans;
//开始状态通过ε转换与接受状态相连
NewStartState->Next2 =NewAcceptState;
NewStartState->Transform = VoidTrans;
//片段1通过ε转换与接受状态相连
fragment1.AcceptState->Next1 =NewAcceptState;
fragment1.AcceptState->Transform = VoidTrans;
// 调用 MakeNFAFragment 函数生成一个新的 NFA 片段, 并入栈
fm = MakeNFAFragment(NewStartState, NewAcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
}
}
//
// 将 NFA 最终结果出栈保存到 fragment 中
//
fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState;
case'+': //构造加号NFA片段
// 调用 CreateNFAState 函数生成一个新的状态
NewAcceptState = CreateNFAState();
//将栈顶的一个片段出栈,构造新的 NFA 片段, 并入栈
fragment1 = PopNFAFragment(&FragmentStack);
fragment1.AcceptState->AcceptFlag = 0;
NewAcceptState->AcceptFlag = 1;
//片段1通过ε转换与接受状态相连
fragment1.AcceptState->Next1 =NewAcceptState;
fragment1.AcceptState->Transform = VoidTrans;
//接受状态通过ε转换与片段1开始状态相连
NewAcceptState->Next1 =fragment1.StartState;
NewAcceptState->Transform = VoidTrans;
// 调用 MakeNFAFragment 函数生成一个新的 NFA 片段, 并入栈
fm = MakeNFAFragment(fragment1.StartState, NewAcceptState);
PushNFAFragment(&FragmentStack, fm);
break;
}
}
//将NFA最终结果出栈保存到fragment中
fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState; }
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论