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

资源简介

(1)Lex输入文件的解析: ·主函数main()实现对Lex输入文件结构的解析 ·int checkType(char c)函数判断是定义段开始?定义段结束?规则段? (2)正规表达式的解析: ·void replaceID(string &re)函数将用户标示id转换成re ·通过对正规表达式的解析的解析可以将规则段的模式部分全部转换成正规表达式 (3)一个正规表达式到NFA的转换算法的实现 ·void generateNFA(const string & re,vector<list > &tnfa,vector &isTer,int index)函数完成正规表达式到NFA的转换 其中:re:正规表达式 tnfa:数据结构是vector<list>,即NFA的每个结点是list (关于NFA的数据结构的描述见后面) isTer:统计tnfa中接受状态结点(isTer[i]!=0表示结点i为接受态) (3)多个NFA的合并 ·void joinNFA(vector<list > &nfa1,const vector<list > &nfa2) 函数完成了NFA nfa1和nfa2的合并,从总体来看起到所有NFA的合并 ·合并NFA的基本原理:将nfa2的开始的点中的内容全部拷贝给nfa1的开始结点然后,再把nfa2中除了开始点以外的点连接到nfa1的末尾即可,注意结点编号的变化 (4)NFA的确定化算法的实现 ·void TODFA()函数完成NFA到DFA的转换 ·在进行NFA确定化算法的同时,自动机的接受态集合也做相应的变换 vector nfaIsTer vector dfaIsTer

资源截图

代码片段和文件信息

#include
#include 
#include//文件流
#include
#include//栈
#include//容器
#include//链表
#include
#include
#include
using namespace std;

#define DEFINE_HEAD 27//定义段开始标识“%{”
#define DEFINE_END 28//定义段结束标识“%}”
#define RULE_ID 30//规则段标识“%%”

#define ERROR -11
#define EPSLONG -1

//描述NFA:
//当前结点接受值edgeValue转向编号为vertice的结点
struct Node

{
unsigned int edgeValue;//边上值:NFA可以接受的值edgeValue
unsigned int vertice;//当前NFA结点所指向的下一个结点的编号
};

//常量申明
ifstream readfile;

ofstream writefile;
ofstream writeReActNFA;
ofstream writeNFA;
ofstream writeDFA;

int lineno=0;//lex文件当前行数信息

vector > nfa;
vector > dfa;
map id2reTable;//存储定义段中标识名到正则式的映射
map nfaTer2Action;//存储NFA终态到action表头对应内容。
map dfaTer2Action;//存储DFA终态到action表头对应内容,其中内容在TODFA()时填充
vector actionTable;//存储action内对应内容
//终结态(接受态)的集合
vector nfaIsTer;
vector dfaIsTer;

map< setint > dfanodetable;

//函数原型
int checkType(char c);//lex文件结构的解析
pairtakeApart(string &str);//规则段re和action

void replaceID(string &re);//lex文件中正规表达式标志id替换成正规表达式re
void generateNFA(const string & revector > &tnfavector &isTerint index);
void modifyTer(vector &is_tunsigned int verticeint edgeValue);
void joinNFA(vector > &nfa1const vector > &nfa2);
void joinIster(vector &is_t1const vector &is_t2);
void TODFA();

void outputNFA_DFA(bool nfaORnot);

void Eclosure(set &T);
set move(const set &Iint edgeValue);
int dfaIsTerminated(set &I);
void genAnalysisCode();
bool cmpFANode(const list &l1const list &l2);
 
void main()
{
cout<<“SeuLex project:“< cout<<“Open the source lex file : lex.l\n\n“;
readfile.open(“lex.l“ios::in);

cout<<“Open the destination files:\n“;
cout<<“1----------The  lexer  program .cpp file : yylex.cpp\n“;
writefile.open(“yylex.cpp“ios::out);
cout<<“2--The relationship of RE-Action-NFA :Re_Act_NFA.txt\n“;
writeReActNFA.open(“Re_Act_NFA.txt“ios::out);
cout<<“3--------------------The join together NFA : NFA.txt\n“;
writeNFA.open(“NFA.txt“ios::out);
cout<<“4--------------Mini the NFA we can get DFA : DFA.txt\n“;
writeDFA.open(“DFA.txt“ios::out);

cout<    //尝试打开文件
if(!readfile)
{
cerr<<“The file can not be open!“< exit(1);
}
//*******
if(!writefile)
{
cerr<<“The file can not be open!“< exit(1);
}
if(!writeReActNFA)
{
cerr<<“The file can not be open!“< exit(1);
}
if(!writeNFA)
{
cerr<<“The file can not be open!“< exit(1);
}
if(!writeDFA)
{
cerr<<“The file can not be open!“< exit(1);
}


//*********************************
//扫描定义段:“%{ ”和 “%}” 之间
char c=readfile.get();
int  type=checkType(c);//定义段?规则段?
if(type!=DEFINE_HEAD)
{
cout<<“Error!The lex.l file dismatch t

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2008-11-20 10:30  SeuLex椤圭洰\
     目录           0  2008-11-20 10:30  SeuLex椤圭洰\debug\
     目录           0  2008-11-20 10:30  SeuLex椤圭洰\SeuLex椤圭洰\
     目录           0  2008-11-20 10:30  SeuLex椤圭洰\SeuLex椤圭洰\Debug\
     文件      198656  2002-12-31 21:02  SeuLex椤圭洰\缂栬瘧鍘熺悊璇剧▼璁捐鎶ュ憡锛圫euLex锛?doc
     文件       24064  2002-12-31 21:07  SeuLex椤圭洰\SeuLex椤圭洰.suo
     文件         901  2002-12-31 16:22  SeuLex椤圭洰\SeuLex椤圭洰.sln
     文件     2608128  2002-12-31 21:07  SeuLex椤圭洰\SeuLex椤圭洰.ncb
     文件     2173952  2002-12-31 21:05  SeuLex椤圭洰\debug\SeuLex椤圭洰.pdb
     文件      998092  2002-12-31 21:05  SeuLex椤圭洰\debug\SeuLex椤圭洰.ilk
     文件      385024  2002-12-31 21:05  SeuLex椤圭洰\debug\SeuLex椤圭洰.exe
     文件       68608  2002-12-31 16:25  SeuLex椤圭洰\SeuLex椤圭洰\~WRL2183.tmp
     文件       68096  2003-01-01 06:54  SeuLex椤圭洰\SeuLex椤圭洰\~WRL1189.tmp
     文件         162  2002-12-31 16:19  SeuLex椤圭洰\SeuLex椤圭洰\~$鍘熺悊璇剧▼璁捐鎶ュ憡锛圫euLex锛?doc
     文件         702  2003-01-01 05:25  SeuLex椤圭洰\SeuLex椤圭洰\yytab.h
     文件       59224  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\yylex.cpp
     文件        1427  2002-12-31 21:07  SeuLex椤圭洰\SeuLex椤圭洰\SeuLex椤圭洰.vcproj.0F9C05CB33D74C5.d4234ggdh.user
     文件        3976  2002-12-31 16:24  SeuLex椤圭洰\SeuLex椤圭洰\SeuLex椤圭洰.vcproj
     文件       23378  2002-12-31 20:58  SeuLex椤圭洰\SeuLex椤圭洰\seulex.cpp
     文件        8199  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Re_Act_NFA.txt
     文件         568  2002-12-31 21:03  SeuLex椤圭洰\SeuLex椤圭洰\ReadMe.txt
     文件        7300  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\NFA.txt
     文件        1816  2003-01-01 05:31  SeuLex椤圭洰\SeuLex椤圭洰\lex.l
     文件       12912  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\DFA.txt
     文件      446464  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\vc80.pdb
     文件      232448  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\vc80.idb
     文件         385  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\SeuLex椤圭洰.exe.intermediate.manifest
     文件         468  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\SeuLex椤圭洰.exe.embed.manifest.res
     文件         403  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\SeuLex椤圭洰.exe.embed.manifest
     文件     2088203  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\seulex.obj
     文件          64  2002-12-31 21:05  SeuLex椤圭洰\SeuLex椤圭洰\Debug\mt.dep
............此处省略1个文件信息

评论

共有 条评论