提交 528bcbe6 创建 作者: 宋海霞's avatar 宋海霞

modify

上级 6aa1b357
...@@ -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--;
......
...@@ -6,30 +6,25 @@ ...@@ -6,30 +6,25 @@
// 在此处包含 C 标准库头文件 // 在此处包含 C 标准库头文件
// //
// //
// 在此处包含其他头文件 // 在此处包含其他头文件
// //
#include "RegexpToNFA.h" #include "RegexpToNFA.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,12 +34,8 @@ void PushNFAFragment(NFAFragmentStack* pS, NFAFragment Elem); ...@@ -39,12 +34,8 @@ 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_ */
...@@ -12,64 +12,64 @@ int g_count = 0; ...@@ -12,64 +12,64 @@ int g_count = 0;
*/ */
void OutputResult(NFAState* result) void OutputResult(NFAState* result)
{ {
if(result == NULL) if (result == NULL)
{ {
return; return;
} }
int k = 0; int k = 0;
for(k = 0; k < 100; k++) for (k = 0; k < 100; k++)
{ {
if((int)result == g_address[k]) if ((int)result == g_address[k])
{ {
return; return;
} }
} }
if(result != NULL) if (result != NULL)
{ {
g_address[g_count++] = (int)result; g_address[g_count++] = (int)result;
if(result -> Next1 != NULL) if (result -> Next1 != NULL)
{ {
printf("%d(%d)",result->Name,result->AcceptFlag); printf("%d(%d)", result->Name, result->AcceptFlag);
if(result->Transform == '$') if (result->Transform == '$')
{ {
printf("->$->%d",result->Next1->Name); printf("->$->%d", result->Next1->Name);
} }
else else
{ {
printf("->%c->%d",result->Transform,result->Next1->Name); printf("->%c->%d", result->Transform, result->Next1->Name);
} }
printf("\n"); printf("\n");
} }
if(result -> Next2 != NULL) if (result -> Next2 != NULL)
{ {
printf("%d(%d)",result->Name,result->AcceptFlag); printf("%d(%d)", result->Name, result->AcceptFlag);
if(result->Transform == '$') if (result->Transform == '$')
{ {
printf("->$->%d",result->Next2->Name); printf("->$->%d", result->Next2->Name);
} }
else else
{ {
printf("->%c->%2d",result->Transform,result->Next2->Name); printf("->%c->%2d", result->Transform, result->Next2->Name);
} }
printf("\n"); printf("\n");
} }
if(result -> Next1 != NULL) if (result -> Next1 != NULL)
{ {
NFAState* result1 = result -> Next1; NFAState* result1 = result -> Next1;
OutputResult(result1); OutputResult(result1);
} }
if(result -> Next2 != NULL) if (result -> Next2 != NULL)
{ {
NFAState* result2 = result -> Next2; NFAState* result2 = result -> Next2;
OutputResult(result2); OutputResult(result2);
} }
if(result->AcceptFlag == 1) if (result->AcceptFlag == 1)
{ {
printf("%d(%d)\n",result->Name,result->AcceptFlag); printf("%d(%d)\n", result->Name, result->AcceptFlag);
} }
} }
......
#ifndef OUTPUTRESULT_H_ #ifndef OUTPUTRESULT_H_
#define OUTPUTRESULT_H_ #define OUTPUTRESULT_H_
#include "RegexpToNFA.h" #include "RegexpToNFA.h"
void OutputResult(NFAState* result); void OutputResult(NFAState* result);
......
#ifndef REGEXPTONFA_H_ #ifndef REGEXPTONFA_H_
#define REGEXPTONFA_H_ #define REGEXPTONFA_H_
// //
// 在此处包含 C 标准库头文件 // 在此处包含 C 标准库头文件
// //
#include <stdio.h> #include <stdio.h>
// //
// 在此处包含其他头文件 // 在此处包含其他头文件
// //
// //
// 在此处定义数据结构 // 在此处定义数据结构
// //
typedef struct _NFAState{ typedef struct _NFAState
{
char Transform; // 状态间转换的标识,用 '$' 表示 'ε-转换' char Transform; // 状态间转换的标识,用 '$' 表示 'ε-转换'
struct _NFAState *Next1; // 指向下一个状态 struct _NFAState *Next1; // 指向下一个状态
struct _NFAState *Next2; // 指向下一个状态 struct _NFAState *Next2; // 指向下一个状态
...@@ -29,22 +25,20 @@ typedef struct _NFAState{ ...@@ -29,22 +25,20 @@ 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;
// //
// 在此处声明函数 // 在此处声明函数
// //
NFAState* CreateNFAState(); NFAState* CreateNFAState();
NFAState* post2nfa(char *postfix); NFAState* post2nfa(char *postfix);
NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState); NFAFragment MakeNFAFragment(NFAState *StartState, NFAState *AcceptState);
// //
// 在此声明全局变量 // 在此声明全局变量
// //
...@@ -53,5 +47,4 @@ extern int nstate; ...@@ -53,5 +47,4 @@ extern int nstate;
extern const char VoidTrans; extern const char VoidTrans;
extern char* regexp; extern char* regexp;
#endif /* REGEXPTONFA_H_ */ #endif /* REGEXPTONFA_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,14 +106,19 @@ char* re2post(char *re) ...@@ -84,14 +106,19 @@ 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 "RegexpToNFA.h" #include "RegexpToNFA.h"
// //
// 在此处定义数据结构 // 在此处定义数据结构
// //
// //
// 在此处声明函数 // 在此处声明函数
// //
char* re2post(char *re); char* re2post(char *re);
#endif /* REGEXPTOPOST_H_ */ #endif /* REGEXPTOPOST_H_ */
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
#include "RegexpToPost.h" #include "RegexpToPost.h"
#include "NFAFragmentStack.h" #include "NFAFragmentStack.h"
#include "OutputResult.h" #include "OutputResult.h"
#include <stdlib.h>
NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段 NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段
char* regexp = "ab"; // 例 1 char* regexp = "ab"; // 例 1
// char* regexp = "a|b"; // 例 2 // char* regexp = "a|b"; // 例 2
// char* regexp = "a*"; // 例 3 // char* regexp = "a*"; // 例 3
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论