提交 4cc3c94b 创建 作者: 庞天聪's avatar 庞天聪

任务完成,提交作业

上级 36358cf1
...@@ -92,18 +92,29 @@ NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState) ...@@ -92,18 +92,29 @@ 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++)
{ switch(*p) for(p=postfix; *p != '\0'; p++)
{ default: // 构造单字符 NFA 片段 {
switch(*p)
{
default: // 构造单字符 NFA 片段
// 调用 CreateNFAState 函数生成两个新的状态 // 调用 CreateNFAState 函数生成两个新的状态
NewStartState = CreateNFAState(); NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState(); NewAcceptState = CreateNFAState();
...@@ -127,33 +138,7 @@ for(p = postfix;*p !='\0';p++) ...@@ -127,33 +138,7 @@ for(p = postfix;*p !='\0';p++)
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();
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片段
fragment = PopNFAFragment(&FragmentStack); fragment = PopNFAFragment(&FragmentStack);
NewStartState = CreateNFAState(); NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();//开始状态的Transform域赋值为空转换,Next1域指向片段的开始状态,Next2域指向新创建的接受状态 NewAcceptState = CreateNFAState();//开始状态的Transform域赋值为空转换,Next1域指向片段的开始状态,Next2域指向新创建的接受状态
...@@ -207,8 +192,15 @@ for(p = postfix;*p !='\0';p++) ...@@ -207,8 +192,15 @@ for(p = postfix;*p !='\0';p++)
fm = MakeNFAFragment(fragment1.StartState, NewAcceptState); fm = MakeNFAFragment(fragment1.StartState, NewAcceptState);
PushNFAFragment(&FragmentStack, fm); PushNFAFragment(&FragmentStack, fm);
break; break;
}
} }
//将NFA最终结果出栈保存到fragment中 }
//
// 将 NFA 最终结果出栈保存到 fragment 中
//
fragment = PopNFAFragment(&FragmentStack); fragment = PopNFAFragment(&FragmentStack);
return fragment.StartState; }
\ No newline at end of file return fragment.StartState;
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论