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

modify

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