资源简介
是使用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\源代码\setli
文件 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
- 上一篇:C语言实现 学生信息管理系统 双链表
- 下一篇:VC调用agilent矢量网络分析仪
评论
共有 条评论