• 大小: 23KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-07-19
  • 语言: 其他
  • 标签: Lex,编译  

资源简介

seuLex Lex输入文件的解析 正规表达式的解析 一个正规表达式到NFA的转换算法实现 多个NFA的合并 NFA的确定化和最小化算法实现 返回状态与返回内容的对应 SeuLex应用

资源截图

代码片段和文件信息

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

#define DEFINE_HEAD 41//定义段开始标识“%{”
#define DEFINE_END 42//定义段结束标识“%}”
#define RULE_ID 43//规则段标识“%%”

#define ERROR -11//错误
#define EPSLONG -1//????????????????


ifstream readfile;

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


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


struct  node
{
int label;
int acceptstatetag;
multimap next;
};


map id2reTable; //存储定义段中标识名到正则式的映射
map precedence;//存储操作符的优先级

vector actionTable;//存储action内对应内容

list  nfas;//存储每个正则式的NFA;
list finalNFA;//最终的nfa
list DFA;

vector nfa;
vector dfa;
map< setint > dfanodetable;
map nfaTer2Action;
map dfaTer2Action;

int checkType(char c);//lex文件结构的解析
pairtakeApart(string &str);//规则段re和action
void replaceID(string &re);//lex文件中正规表达式标志id替换成正规表达式re
void Change(char *char *);//将中缀表达式变成后缀表达式
void Initprecedence();//初始化中缀表达式中操作符的优先级
void generateNFA(char *relist  nodes); //由re产生NFA
void joinNFA(list  onenfalist finalnfa);
bool isLetter (char);//判断是否是字母
void NFA2DFA(list bignfa);
void Eclosure(set &t);//求E闭包
set move(const set &Ichar onesymbol);
void genAnalysisCode();//生成条件控制表示的DFA的代码


void main(){
Initprecedence();//给操作符初始化优先级
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<
//*********************************
//扫描定义段:“%{ ”和 “%}” 之间
char c=readfile.get();
int  type=checkType(c);//定义段?规则段?
if(type!=DEFINE_HEAD)
{
cout<<“Error!The lex.l file dismatch the lex grammar !\n“;//不符合lex文件语法
return;
}

    writefile<<“//lex文件定义段直接拷贝开始:“;
while(!readfile.eof()&&type!=DEFINE_END)//扫描过程
{
c=readfile.get();
if(c==‘\t‘) continue;
if(c==‘\n‘) lineno++;//lineno:lex文件当前行数
if(c==‘%‘) {type=checkType(c);continue;}//结尾DEFINE_END %}吗

writefile.put(c);//逐个字符的写入目标文件
}
writefile<<“//lex文件定义段拷贝结束:“<


//*********************************************************
//扫描正规表达式:该部分由用户自定义标示id和正规表达式re组成


pair userDefineID;//〈idre〉
type=0;

//开始识别正规表达式对〈idre〉
c=readfile.get();

while(!readfile.eof()&&type!=R

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      39424  2010-05-18 22:24  09007412LEX.doc

     文件      16343  2010-05-06 22:53  DFA.txt

     文件       1422  2010-05-06 23:08  lex.l

     文件      13511  2010-05-06 22:53  NFA.txt

     文件      11992  2010-05-06 22:53  Re_Act_NFA.txt

     文件      23344  2010-05-06 23:04  SeuLex.cpp

     文件      48576  2010-05-06 22:53  yylex.cpp

     文件        702  2003-01-01 13:25  yytab.h

----------- ---------  ---------- -----  ----

               155314                    8


评论

共有 条评论

相关资源