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

push

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