提交 28c705f7 创建 作者: 宋海霞's avatar 宋海霞

push

上级 25f92e25
......@@ -29,8 +29,10 @@ void PushNFAFragment(NFAFragmentStack* pS, NFAFragment Elem)
//
// 栈满,入栈失败。
//
if(MAX_STACK_LENGTH - 1 <= pS->top)
if (MAX_STACK_LENGTH - 1 <= pS->top)
{
return;
}
pS->top++;
pS->buffer[pS->top] = Elem; // 将元素插入栈顶
......@@ -57,8 +59,10 @@ NFAFragment PopNFAFragment(NFAFragmentStack* pS)
//
// 栈为空,出栈失败
//
if(NFAFragmentStackEmpty(pS))
if (NFAFragmentStackEmpty(pS))
{
return fragment;
}
pos = pS->top;
pS->top--;
......
#ifndef _NFAFRAGMENTSTACK_H_
#define _NFAFRAGMENTSTACK_H_
#ifndef NFAFRAGMENTSTACK_H_
#define NFAFRAGMENTSTACK_H_
//
// 在此处包含 C 标准库头文件
//
//
// 在此处包含其他头文件
//
#include "NFAToDFA.h"
//
// 在此处定义数据结构
//
#define MAX_STACK_LENGTH 1024 // 栈的最大长度
// 栈
typedef struct _NFAFragmentStack{
typedef struct _NFAFragmentStack
{
NFAFragment buffer[MAX_STACK_LENGTH]; // 栈的缓冲区
int top; // 指示栈顶的位置,而不是栈中元素的个数
}NFAFragmentStack;
//
// 在此处声明函数
//
......@@ -39,11 +33,9 @@ void PushNFAFragment(NFAFragmentStack* pS, NFAFragment Elem);
NFAFragment PopNFAFragment(NFAFragmentStack* pS);
int NFAFragmentStackEmpty(NFAFragmentStack* pS);
//
// 在此处声明全局变量
//
#endif /* _NFAFRAGMENTSTACK_H_ */
#endif /* NFAFRAGMENTSTACK_H_ */
......@@ -30,8 +30,10 @@ void PushNFAState(NFAStateStack* pS, NFAState* Elem)
//
// 栈满,入栈失败。
//
if(MAX_STACK_LENGTH - 1 <= pS->top)
if (MAX_STACK_LENGTH - 1 <= pS->top)
{
return;
}
pS->top++;
pS->buffer[pS->top] = Elem; // 将元素插入栈顶
......@@ -58,8 +60,10 @@ NFAState* PopNFAState(NFAStateStack* pS)
//
// 栈为空,出栈失败
//
if(NFAStateStackEmpty(pS))
if (NFAStateStackEmpty(pS))
{
return State;
}
pos = pS->top;
pS->top--;
......
#ifndef _NFASTATESTACK_H_
#define _NFASTATESTACK_H_
#ifndef NFASTATESTACK_H_
#define NFASTATESTACK_H_
//
// 在此处包含 C 标准库头文件
//
//
// 在此处包含其他头文件
//
//
// 在此处定义数据结构
//
#define MAX_STACK_LENGTH 1024 // 栈的最大长度
// 栈
typedef struct _NFAStateStack{
typedef struct _NFAStateStack
{
NFAState* buffer[MAX_STACK_LENGTH]; // 栈的缓冲区
int top; // 指示栈顶的位置,而不是栈中元素的个数
}NFAStateStack;
//
// 在此处声明函数
//
......@@ -37,12 +31,9 @@ void PushNFAState(NFAStateStack* pS, NFAState* Elem);
NFAState* PopNFAState(NFAStateStack* pS);
int NFAStateStackEmpty(NFAStateStack* pS);
//
// 在此处声明全局变量
//
#endif /* _NFASTATESTACK_H_ */
#endif /* NFASTATESTACK_H_ */
#ifndef _NFATODFA_H_
#define _NFATODFA_H_
#ifndef NFATODFA_H_
#define NFATODFA_H_
//
// 在此处包含 C 标准库头文件
//
#include <stdio.h>
//
// 在此处包含其他头文件
//
//
// 在此处定义数据结构
//
#define MAX_STATE_NUM 64 // 状态的最大数量。
typedef struct _NFAState{
typedef struct _NFAState
{
char Transform; // 状态间装换的标识,用 '$' 表示 'ε-转换'。
struct _NFAState *Next1; // 指向下一个状态。
struct _NFAState *Next2; // 指向下一个状态。
......@@ -31,13 +27,15 @@ typedef struct _NFAState{
}NFAState;
// Fragment 结构是一个 NFA 的片段
typedef struct _NFAFragment{
typedef struct _NFAFragment
{
NFAState *StartState; // 开始状态。
NFAState *AcceptState; // 接受状态。
}NFAFragment;
// 转换
typedef struct _Transform{
typedef struct _Transform
{
char TransformChar; // 状态之间的转换标识符。
int DFAStateIndex; // DFA 状态在数组中的下标。
NFAState* NFAlist[MAX_STATE_NUM];// NFA 状态集合。
......@@ -46,24 +44,24 @@ typedef struct _Transform{
}Transform;
// DFA 状态
typedef struct _DFAState{
typedef struct _DFAState
{
NFAState* NFAlist[MAX_STATE_NUM];// NFA 状态集合。
int NFAStateCount; // 状态集合计数。
Transform* firstTran; // 指向第一个转换。
}DFAState;
// DFA
typedef struct DFA{
typedef struct DFA
{
DFAState* DFAlist[MAX_STATE_NUM]; // DFA 状态集合。
int length; // 状态集合计数。
}DFA;
//
// 在此处声明函数
//
void Closure(NFAState* State, NFAState** StateArray, int* Count);
DFAState* CreateDFAState(Transform* pTransform);
Transform* CreateDFATransform(char TransformChar, NFAState** NFAStateArray, int Count);
......@@ -72,7 +70,6 @@ Transform* IsTransformExist(DFAState* pDFAState, char TransformChar);
void AddNFAStateArrayToTransform(NFAState** NFAStateArray, int Count, Transform* pTransform);
DFA* post2dfa(DFA* pDFA, char *postfix);
//
// 在此声明全局变量
//
......@@ -80,6 +77,6 @@ DFA* post2dfa(DFA* pDFA, char *postfix);
extern const char VoidTrans;
extern NFAState* Start;
#endif /* _NFATODFA_H_ */
#endif /* NFATODFA_H_ */
......@@ -9,31 +9,31 @@
*/
void OutputResult(DFA* dfa)
{
int i =0,j = 0;
for(j = 0; j < dfa->length;j++)
int i =0, j = 0;
for (j = 0; j < dfa->length;j++)
{
printf("%d ", j);
int count = dfa->DFAlist[j]->NFAStateCount;
int flag = 0;
for(i = 0; i < count; i++)
for (i = 0; i < count; i++)
{
if(dfa->DFAlist[j]->NFAlist[i]->AcceptFlag ==1)
if (dfa->DFAlist[j]->NFAlist[i]->AcceptFlag == 1)
{
flag = 1;
break;
}
}
for(i = 0; i < count; i++)
for (i = 0; i < count; i++)
{
if(count == 1)
if (count == 1)
{
printf("%d->", dfa->DFAlist[j]->NFAlist[i]->Name);
}
else
{
if(i == 0)
if (i == 0)
{
if(flag == 1)
if (flag == 1)
{
printf("[%d ", dfa->DFAlist[j]->NFAlist[i]->Name);
}
......@@ -43,9 +43,9 @@ void OutputResult(DFA* dfa)
}
}
else if(i == count - 1)
else if (i == count - 1)
{
if(flag == 1)
if (flag == 1)
{
printf("%d]->", dfa->DFAlist[j]->NFAlist[i]->Name);
}
......@@ -65,21 +65,21 @@ void OutputResult(DFA* dfa)
Transform* curTran = NULL;
curTran = dfa->DFAlist[j]->firstTran;
while(curTran != NULL)
while (curTran != NULL)
{
for(i = 0; i < curTran->NFAStateCount; i++)
for (i = 0; i < curTran->NFAStateCount; i++)
{
if(curTran->NFAStateCount == 1)
if (curTran->NFAStateCount == 1)
{
printf("%d->", curTran->NFAlist[i]->Name);
}
else
{
if(i == 0)
if (i == 0)
{
printf("%c(%d,", curTran->TransformChar,curTran->NFAlist[i]->Name);
printf("%c(%d,", curTran->TransformChar, curTran->NFAlist[i]->Name);
}
else if(i == curTran->NFAStateCount - 1)
else if (i == curTran->NFAStateCount - 1)
{
printf("%d)%d->", curTran->NFAlist[i]->Name, curTran->DFAStateIndex);
}
......
#ifndef _OUTPUTRESULT_H_
#define _OUTPUTRESULT_H_
#ifndef OUTPUTRESULT_H_
#define OUTPUTRESULT_H_
#include "NFAToDFA.h"
void OutputResult(DFA* dfa);
#endif /* _OUTPUTRESULT_H_ */
#endif /* OUTPUTRESULT_H_ */
#include "PostToNFA.h"
#include "NFAFragmentStack.h"
#include <stdlib.h>
NFAFragmentStack FragmentStack;
......
#ifndef _POSTTONFA_H_
#define _POSTTONFA_H_
#ifndef POSTTONFA_H_
#define POSTTONFA_H_
//
// 在此处包含 C 标准库头文件
//
//
// 在此处包含其他头文件
//
#include "NFAToDFA.h"
//
// 在此处定义数据结构
//
//
// 在此处声明函数
//
NFAState* CreateNFAState();
NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState);
NFAState* post2nfa(char *postfix);
//
// 在此声明全局变量
//
#endif /* _POSTTONFA_H_ */
#endif /* POSTTONFA_H_ */
#include "RegexpToPost.h"
#include <string.h>
/*
功能:
......@@ -17,7 +18,8 @@ char* re2post(char *re)
static char buf[8000];
char *dst;
struct {
struct postseq
{
int nalt;
int natom;
} paren[100], *p;
......@@ -26,19 +28,25 @@ char* re2post(char *re)
dst = buf;
nalt = 0;
natom = 0;
if(strlen(re) >= sizeof buf/2)
if (strlen(re) >= sizeof buf/2)
{
return NULL;
}
for(; *re; re++){
switch(*re){
for (; *re; re++)
{
switch (*re)
{
case '(':
if(natom > 1)
if (natom > 1)
{
--natom;
*dst++ = '.';
}
if(p >= paren+100)
if (p >= paren+100)
{
return NULL;
}
p->nalt = nalt;
p->natom = natom;
p++;
......@@ -46,21 +54,33 @@ char* re2post(char *re)
natom = 0;
break;
case '|':
if(natom == 0)
if (natom == 0)
{
return NULL;
while(--natom > 0)
}
while (--natom > 0)
{
*dst++ = '.';
}
nalt++;
break;
case ')':
if(p == paren)
if (p == paren)
{
return NULL;
if(natom == 0)
}
if (natom == 0)
{
return NULL;
while(--natom > 0)
}
while (--natom > 0)
{
*dst++ = '.';
for(; nalt > 0; nalt--)
}
for (; nalt > 0; nalt--)
{
*dst++ = '|';
}
--p;
nalt = p->nalt;
natom = p->natom;
......@@ -69,12 +89,14 @@ char* re2post(char *re)
case '*':
case '+':
case '?':
if(natom == 0)
if (natom == 0)
{
return NULL;
}
*dst++ = *re;
break;
default:
if(natom > 1)
if (natom > 1)
{
--natom;
*dst++ = '.';
......@@ -84,12 +106,18 @@ char* re2post(char *re)
break;
}
}
if(p != paren)
if (p != paren)
{
return NULL;
while(--natom > 0)
}
while (--natom > 0)
{
*dst++ = '.';
for(; nalt > 0; nalt--)
}
for (; nalt > 0; nalt--)
{
*dst++ = '|';
}
*dst = 0;
return buf;
......
#ifndef _REGEXPTOPOST_H_
#define _REGEXPTOPOST_H_
#ifndef REGEXPTOPOST_H_
#define REGEXPTOPOST_H_
//
// 在此处包含 C 标准库头文件
//
//
// 在此处包含其他头文件
//
#include "NFAToDFA.h"
//
// 在此处定义数据结构
//
//
// 在此处声明函数
//
char* re2post(char *re);
#endif /* _REGEXPTOPOST_H_ */
#endif /* REGEXPTOPOST_H_ */
......@@ -4,6 +4,7 @@
#include "NFAStateStack.h"
#include "NFAFragmentStack.h"
#include "OutputResult.h"
#include <stdlib.h>
NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段
NFAStateStack StateStack; // 栈。用于储存 NFA 状态
......@@ -65,8 +66,10 @@ Transform* CreateDFATransform(char TransformChar, NFAState** NFAStateArray, int
int i;
Transform* pTransform = (Transform*)malloc(sizeof(Transform));
for(i=0; i<Count; i++)
for (i=0; i<Count; i++)
{
pTransform->NFAlist[i] = NFAStateArray[i];
}
pTransform->NFAStateCount = Count;
pTransform->TransformChar = TransformChar;
......@@ -91,8 +94,10 @@ DFAState* CreateDFAState(Transform* pTransform)
int i;
DFAState* pDFAState = (DFAState*)malloc(sizeof(DFAState));
for(i=0; i<pTransform->NFAStateCount; i++)
for (i=0; i<pTransform->NFAStateCount; i++)
{
pDFAState->NFAlist[i] = pTransform->NFAlist[i];
}
pDFAState->NFAStateCount = pTransform->NFAStateCount;
pDFAState->firstTran = NULL;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论