• 大小: 12KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-09-11
  • 语言: C/C++
  • 标签: Lexc++  

资源简介

是使用C++书写的Lex工具,通过了基本的测试。

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include

#include “source1.h“

ifstream fin;
ofstream fout;


main()
{


char action[100][100];//用于记录规则段动作部分

////////////////////////////////////////////////////////定义段扫描,分析
fin.open(“test.l“ios::out);//打开输入文件
fout.open(“Seu_Lex.cpp“ios::out);//打凯输出文件
char c;
if(fin.get()!=‘%‘||fin.get()!=‘{‘){
cerr<<“Wrong fileerror 1“< exit(0);
}
fin.get();
c=fin.get();
while(c!=‘%‘){
fout.put(c);
c=fin.get();
}
fin.get();
fin.get();
List trans;//用于记录定义段RE
char* temp=new char[100];
fin.getline(temp100);
while(temp[0]!=‘%‘||temp[1]!=‘%‘){
trans.AddTail(temp);
fin.getline(temp100);
}
// trans.print();




////////////////////////////////////////////////////////规则段扫描,分析
string s;
stack st; 
NFA nfa1nfa2;
int pos=0;

List workl;//结果DFA

fin.getline(temp100‘ ‘);
while(temp[0]!=‘%‘||temp[1]!=‘%‘){
s=string(temp);
RE re(s);
bool flag=true;
if(re.re[0]==‘{‘){//RE的替换(对{num}等形式,用定义段RE替换)
for(ListNode* p=trans.first;p!=NULL;p=p->link){
int i=1;
flag=true;
while(re.re[i]!=‘}‘){
if(p->data[i-1]!=re.re[i]){
flag=false;
break;
}
i++;
}
if(flag){
re.re.erase(0i+1);
while(1){
if(p->data[0]!=‘:‘){
p->data.erase(01);
}
else{
p->data.erase(01);
break;
}
}


re.re.insert(0p->data);

}
}
if(re.re[0]==‘{‘){
cerr<<“Error2!!!“< exit(0);
}
}


re.extend();//扩展
re.toPostOrder();//转为后缀
for(int i=0;i if(!re.isOp(re.re[i]))
st.push(NFA(re.re[i]));//不是运算符 进栈
else if(re.re[i]==‘*‘){//‘*’运算,出栈一个,运算后入栈
nfa1.copy(st.top());
nfa1.copy(nfa1.operate(nfa1STAR));
st.pop();
st.push(nfa1);
}
else if(re.re[i]==‘~‘){//‘~’运算,出栈两个,运算后入栈
nfa1.copy(st.top());
st.pop();
nfa2.copy(st.top());
st.pop();
nfa1.copy(nfa2.operate(nfa1CONCAT));
st.push(nfa1);
}
else{//‘|’运算,出栈两个,运算后入栈
nfa1.copy(st.top());
st.pop();
nfa2.copy(st.top());
st.pop();
nfa1.copy(nfa2.operate(nfa1UNION));
st.push(nfa1);
}
}
nfa1.copy(st.top());

// nfa1.view();
DFA dfa(nfa1);//转DFA
// dfa.view();
dfa.minDFA();//最小化DFA
// dfa.view();

workl.AddTail(dfa);//DFA加入工作链表
st.pop();

fin.getline(action[pos]100);//记录相应动作
fin.getline(temp100‘ ‘);

pos++;
}


///////////////////////////////////////////////////////////转换为代码
string code;
DFA workdfa;

int flag=0;
code=“int analysis(string s)\n{\n\tint state=0;\n\tbool match=false;\n\tint i;\n\t“;
for(int i=0;i fout.put(code[i]);

}


for(ListNode* p=workl.first;p!=NULL;p=p->link)//对工作链表中每一个DFA
{
workdfa.copy(p->data);
code=workdfa.toCode();
for(i=0;i

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

     文件       3400  2008-05-08 00:02  Lex\源代码\setlink.h

     文件       3873  2008-05-08 08:53  Lex\源代码\SeuLex.cpp

     文件      14957  2008-05-08 00:45  Lex\源代码\source1.cpp

     文件       2536  2008-05-08 00:28  Lex\源代码\source1.h

     文件       2400  2008-05-08 08:40  Lex\源代码\test.l

     文件        141  2009-04-02 19:17  Lex\源代码\说明.txt

     文件       1193  2008-05-08 08:57  Lex\生成代码\matchtab.h

     文件      32059  2008-05-08 08:53  Lex\生成代码\Seu_Lex.cpp

     文件         63  2008-05-08 09:01  Lex\生成代码\说明.txt

     目录          0  2009-04-02 19:17  Lex\源代码

     目录          0  2009-04-02 19:16  Lex\生成代码

     目录          0  2009-03-14 02:38  Lex

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

                60622                    12


评论

共有 条评论

相关资源