• 大小: 1.28MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-12-27
  • 语言: 其他
  • 标签: 计算机  编译原理  

资源简介

该资源为2016级哈工程计算机专业的编译原理课程设计的代码与实验报告。其中共选择了以下实验: 1实验环境的使用 2使用Lex自动生成扫描程序 3消除左递归(无替换) 4 提取左因子 5 First集合 6 Follow集合

资源截图

代码片段和文件信息

#include “RegexpToNFA.h“
#include “RegexpToPost.h“
#include “NFAFragmentStack.h“

NFAFragmentStack FragmentStack; // 栈。用于储存 NFA 片段


 //char* regexp = “ab“; // 例 1
// char* regexp = “a|b“; // 例 2
// char* regexp = “a*“; // 例 3
// char* regexp = “a?“; // 例 4
// char* regexp = “a+“; // 例 5
// char* regexp = “a(a|1)*“;// 例 6
 char* regexp = “(aa|b)*a(a|bb)*“;// 例 7
// char* regexp = “(a|b)*a(a|b)?“;  // 例 8

int main(int argc char **argv)
{
char *post;
NFAState *start;

//
// 初始化栈
//
InitNFAFragmentStack(&FragmentStack);

//
// 调用 re2post 函数将正则表达式字符串转换成解析树的后续遍历序列
//
post = re2post(regexp);

//
// 调用 post2nfa 函数将解析树的后续遍历序列转换为 NFA 并返回开始状态
//
start = post2nfa(post);
system(“pause“);
return 0;
}

/*
功能:
初始化一个状态。
  
返回值:
状态指针。
*/
int nstate = 1;  // 状态名计数器
NFAState* CreateNFAState()
{
NFAState *s = (NFAState*)malloc(sizeof(NFAState));

s->Name = nstate++;
s->Transform = ‘\0‘;
s->Next1 = NULL;
s->Next2 = NULL;
s->AcceptFlag = 0;

return s;
}

/*
功能:
将开始状态和接受状态组成一个 Fragment。

参数:
StartState -- 开始状态。
AcceptState -- 接受状态。
  
返回值:
 Fragment 结构体指针。
*/
NFAFragment MakeNFAFragment(NFAState *StartState NFAState *AcceptState)
{
NFAFragment n = {StartState AcceptState};
return n;
}

/*
功能:
将解析树的后序序列转换为 NFA。

参数:
postfix -- 解析树的后序序列指针。
  
返回值:
NFA 的开始状态指针。
*/



/*
typedef struct _NFAState{
char Transform;         // 状态间转换的标识,用 ‘$‘ 表示 ‘ε-转换‘
struct _NFAState *Next1; // 指向下一个状态 
struct _NFAState *Next2; // 指向下一个状态
int Name;      // 状态名称
int AcceptFlag;      // 是否为接受状态的标志,1 表示是接受状态 0 表示不是接受状态 
}NFAState;

// Fragment 结构是一个 NFA 的片段
typedef struct _NFAFragment{
NFAState *StartState;  // 开始状态
NFAState *AcceptState;  // 接受状态
}NFAFragment;
*/

const char VoidTrans = ‘$‘; // 表示空转换
NFAState* post2nfa(char *postfix)
{
char *p;     // 游标
NFAFragment fragment1 fragment2 fm;      // NFA 片段结构体变量
NFAFragment fragment = {0 0};     // 初始化用于返回的 NFA 片段
NFAState *NewStartState *NewAcceptState;  // 开始状态和接受状态指针

//
// TODO: 在此添加代码
//
for(p=postfix;*p!=‘\0‘;p++)
{
switch(*p)
{
default:           //构造单字符NFA片段

//调用CreatNFAState函数生成两个新的状态
NewStartState = CreateNFAState();
NewAcceptState = CreateNFAState();


//开始状态通过单个字符转换到接受状态
NewStartState->Transform = *p;
NewStartState->Next1 = NewAcceptState;
NewAcceptState->AcceptFlag = 1;

//调用MakeFragment函数生成一个新的NFA片段,并入栈
fm = MakeNFAFragment(NewStartStateNewAcceptState);
PushNFAFragment(&FragmentStackfm);
break;

case ‘.‘:         //构造连接NFA片段
/*
连接状态不需要生成新的状态,第一个在接受状态就是第二个的开始状态
*/

//栈顶在两个片段出栈,构造出新的NFA片段
fragment2 = PopNFAFragment(&FragmentStack);
fragment1 = PopNFAFragment(&FragmentStack);
fragment1.AcceptState->AcceptFlag = 0;//将状态1在接受状态换成非接受状态,通过e转换与状态2进行连接
fragment1.AcceptState->Next1 = fragment2.StartState;//状态1在下一状态指针指向状态2

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-08-07 21:05  2016061521-王好天-编译原理\
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab1实验一\
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab1实验一\Debug\
     文件       31439  2018-12-24 15:50  2016061521-王好天-编译原理\lab1实验一\Debug\lab1实验一.exe
     文件        8132  2018-12-24 15:50  2016061521-王好天-编译原理\lab1实验一\Debug\main.o
     文件        4874  2018-12-17 16:14  2016061521-王好天-编译原理\lab1实验一\Debug\NFAFragmentStack.o
     文件        5500  2018-12-17 16:14  2016061521-王好天-编译原理\lab1实验一\Debug\RegexpToPost.o
     文件        1015  2018-12-24 16:19  2016061521-王好天-编译原理\lab1实验一\Debug\ValidateSource.txt
     文件        1015  2018-12-24 16:19  2016061521-王好天-编译原理\lab1实验一\Debug\ValidateTarget.txt
     文件        2079  2018-12-24 15:50  2016061521-王好天-编译原理\lab1实验一\lab1实验一.cplproj
     文件         472  2018-12-24 16:21  2016061521-王好天-编译原理\lab1实验一\lab1实验一.puo
     文件        7193  2018-12-24 15:50  2016061521-王好天-编译原理\lab1实验一\main.c
     文件        1085  2013-06-08 15:02  2016061521-王好天-编译原理\lab1实验一\NFAFragmentStack.c
     文件         753  2013-06-08 14:58  2016061521-王好天-编译原理\lab1实验一\NFAFragmentStack.h
     文件         982  2013-07-08 16:52  2016061521-王好天-编译原理\lab1实验一\RegexpToNFA.h
     文件        1581  2018-12-17 09:36  2016061521-王好天-编译原理\lab1实验一\RegexpToPost.c
     文件         292  2013-05-27 10:51  2016061521-王好天-编译原理\lab1实验一\RegexpToPost.h
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab3实验三\
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab3实验三\Debug\
     文件       42537  2018-12-24 15:51  2016061521-王好天-编译原理\lab3实验三\Debug\lab3实验三.exe
     文件       29302  2018-12-24 09:17  2016061521-王好天-编译原理\lab3实验三\Debug\main.o
     文件         638  2013-07-18 14:41  2016061521-王好天-编译原理\lab3实验三\define.h
     文件        2364  2018-12-24 15:51  2016061521-王好天-编译原理\lab3实验三\lab3实验三.cplproj
     文件         282  2018-12-25 14:08  2016061521-王好天-编译原理\lab3实验三\lab3实验三.puo
     文件          35  2018-12-21 15:53  2016061521-王好天-编译原理\lab3实验三\lex.backup
     文件       45699  2018-12-24 09:17  2016061521-王好天-编译原理\lab3实验三\main.c
     文件         269  2013-07-18 14:41  2016061521-王好天-编译原理\lab3实验三\sample.txt
     文件        6489  2018-12-19 14:14  2016061521-王好天-编译原理\lab3实验三\scan.txt
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab4实验四\
     目录           0  2018-12-25 16:22  2016061521-王好天-编译原理\lab4实验四\Debug\
     文件      308204  2018-12-24 09:13  2016061521-王好天-编译原理\lab4实验四\Debug\lab4实验4.exe
............此处省略38个文件信息

评论

共有 条评论