提交 77ec3793 创建 作者: 宋海霞's avatar 宋海霞

modify main.c

上级 1dd89150
......@@ -29,6 +29,9 @@ int main(int argc, char **argv)
//
InitNFAFragmentStack(&FragmentStack);
// 在 CP Lab中执行程序时不会使用下面宏定义包含的代码,提交作业后,在线上运行流水线时会包含宏定义这部分代码。
// 下面宏定义代码会在运行流水线时从input.txt文件中读取正则表达式,进行算例的验证。
// 其中,input1.txt ~ input3.txt文件中包含的正则表达式与例1 ~ 例3的正则表达式是对应的。
#ifdef CODECODE_CI
scanf("%255s", regexp_ci);
regexp = regexp_ci;
......@@ -44,6 +47,9 @@ int main(int argc, char **argv)
//
dfa = post2dfa(dfa, post);
//
// 将 DFA 打印输出
//
OutputResult(dfa);
return 0;
......@@ -201,8 +207,81 @@ DFA* post2dfa(DFA* pDFA, char *postfix)
Start = post2nfa(postfix);
//
// 调用 Closure 函数构造开始状态的ε-闭包
//
Closure(Start, NFAStateArray, &Count);
// 调用 CreateDFATransform 函数创建一个转换(忽略转换字符),
// 然后,调用 CreateDFAState 函数,利用刚刚创建的转换新建一个 DFA 状态
Transform* pTransform = CreateDFATransform('\0', NFAStateArray, Count);
DFAState* pDFAState = CreateDFAState(pTransform);
// 将 DFA 状态加入到 DFA 状态线性表中
pDFA->DFAlist[pDFA->length++] = pDFAState;
// 遍历线性表中所有 DFA 状态
for(i=0; i<pDFA->length; i++)
{
// 遍历第 i 个 DFA 状态中的所有 NFA 状态
for(j=0; j<pDFA->DFAlist[i]->NFAStateCount; j++)
{
NFAState* NFAStateTemp = pDFA->DFAlist[i]->NFAlist[j];
// 如果 NFA 状态是接受状态或者转换是空转换,就跳过此 NFA 状态
if(NFAStateTemp->Transform == VoidTrans || NFAStateTemp->AcceptFlag == 1)
continue;
// 调用 Closure 函数构造 NFA 状态的ε-闭包
Closure(NFAStateTemp->Next1, NFAStateArray, &Count);
// 调用 IsTransfromExist 函数判断当前 DFA 状态的转换链表中是否已经存在该 NFA 状态的转换
pTransform = IsTransformExist(pDFA->DFAlist[i], NFAStateTemp->Transform);
if(pTransform == NULL)
{
// 不存在,调用 CreateDFATransform 函数创建一个转换,并将这个转换插入到转换链表的开始位置
//
// TODO: 在此添加代码
//
}
else
{
//存在,调用 AddNFAStateArrayToTransform 函数把ε-闭包合并到已存在的转换中
//
// TODO: 在此添加代码
//
}
}
// 遍历 DFA 状态的转换链表,根据每个转换创建对应的 DFA 状态
for(pTFCursor = pDFA->DFAlist[i]->firstTran; pTFCursor != NULL; pTFCursor = pTFCursor->NextTrans)
{
// 调用 NFAStateIsSubset 函数判断转换中的 NFA 状态集合是否为某一个 DFA 状态中 NFA 状态集合的子集
int Index = NFAStateIsSubset(pDFA, pTFCursor);
if(Index == -1)
{
// 不是子集,调用 CreateDFAState 函数创建一个新的 DFA 状态并加入 DFA 线性表中
// 将转换的 DFAStateIndex 赋值为新加入的 DFA 状态的下标
//
// TODO: 在此添加代码
//
}
else
{
// 是子集,将转换的 DFAStateIndex 赋值为 Index
//
// TODO: 在此添加代码
//
}
}
}
return pDFA;
}
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论