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

任务完成,提交作业

上级 e3ffc3b5
...@@ -92,29 +92,18 @@ NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState) ...@@ -92,29 +92,18 @@ NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState)
return n; return n;
} }
/* /*功能:将解析树的后序序列转换为 NFA。
功能: 参数:postfix -- 解析树的后序序列指针。
将解析树的后序序列转换为 NFA。 返回值:NFA 的开始状态指针。*/
参数:
postfix -- 解析树的后序序列指针。
返回值:
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; // 开始状态和接受状态指针
for(p = postfix;*p !='\0';p++)
for(p=postfix; *p != '\0'; p++) { switch(*p)
{ { default: // 构造单字符 NFA 片段
switch(*p)
{
default: // 构造单字符 NFA 片段
// 调用 CreateNFAState 函数生成两个新的状态 // 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState(); NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState(); NewAcceptState = CreateNFAState();
...@@ -138,43 +127,88 @@ NFAState* post2nfa(char *postfix) ...@@ -138,43 +127,88 @@ NFAState* post2nfa(char *postfix)
fm = MakeNFAFragment(fragment1.StartState, fragment2.AcceptState); fm = MakeNFAFragment(fragment1.StartState, fragment2.AcceptState);
PushNFAFragment(&FragmentStack, fm); PushNFAFragment(&FragmentStack, fm);
break; break;
case '|': // 构造选择 NFA 片段 case'|': //构造选择NFA片段
// 调用 CreateNFAState 函数生成两个新的状态
// NewStartState = CreateNFAState();
// TODO: 在此添加代码 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; break;
case '*': // 构造星号 NFA 片段 case'*': //构造星号NFA片段
fragment = PopNFAFragment(&FragmentStack);
// NewStartState = CreateNFAState();
// TODO: 在此添加代码 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; break;
case '?': // 构造问号 NFA 片段 case'?': //构造问号NFA片段
// 调用 CreateNFAState 函数生成两个新的状态
// NewStartState = CreateNFAState();
// TODO: 在此添加代码 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; break;
case '+': // 构造加号 NFA 片段 case'+': //构造加号NFA片段
// 调用 CreateNFAState 函数生成一个新的状态
// NewAcceptState = CreateNFAState();
// TODO: 在此添加代码 //将栈顶的一个片段出栈,构造新的 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; break;
}
}
//
// 将 NFA 最终结果出栈保存到 fragment 中
//
fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState;
} }
}
//将NFA最终结果出栈保存到fragment中
fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState; }
\ No newline at end of file
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论