📄 mylex.cpp
字号:
}
void toMinDFA()
{
vector< vector<int> >AP;
vector< vector<int> >nAP;
vector<string>ac;
vector<int>v1;
int ls=(int)DFAVector.size();
for(int i=0;i<ls;i++)
{
if(!DFAVector[i]->accept)
{
DFAVector[i]->at=0;
v1.push_back(i);
}
else
{
int j=0,l=(int)ac.size(),l1=(int)nAP.size();
for(j=0;j<l;j++)
if(ac[j]==DFAVector[i]->ID) break;
if(j==l)
{
ac.push_back(DFAVector[i]->ID);
DFAVector[i]->at=l1+1;
vector<int>v2;
v2.push_back(i);
nAP.push_back(v2);
}
else
{
DFAVector[i]->at=j+1;
nAP[j].push_back(i);
}
}
}
ls=(int)nAP.size();
AP.push_back(v1);
for(int i=0;i<ls;i++)
{
vector<int> v2=nAP[i];
AP.push_back(v2);
}
nAP.clear();
int lss=(int)AP.size();
bool getNew=true;
while(getNew)
{
getNew=false;
nAP.clear();
int l=(int)AP.size();
vector<int>newv;
for(int i=0;i<l;i++)
{
vector<int>v=AP[i];
int li=(int)v.size();
if(li==1||getNew)
{
nAP.push_back(v);
continue;
}
int lj=(int)dataVector.size(),j=0;
for(j=0;j<lj;j++)
{
int k=0,q=move(DFAVector[v[0]],dataVector[j]);
for(k=1;k<li;k++)
{
int p=move(DFAVector[v[k]],dataVector[j]);
if(p!=q)
{
DFAVector[v[k]]->at=l;
newv.push_back(v[k]);
v.erase(v.begin()+k);
k--;
li--;
getNew=true;
}
if(li==1) break;
}
if(li==1) break;
}
nAP.push_back(v);
}
if(!newv.empty()) nAP.push_back(newv);
AP=nAP;
lss=(int)AP.size();
}
lss=(int)AP.size();
int enter=0;
for(int i=0;i<lss;i++)
{
Node* node=new Node;
node->id='A'+i;
node->accept=false;
int ls=(int)AP[i].size();
for(int j=0;j<ls;j++)
{
DFANode* q=DFAVector[AP[i][j]];
if(q->id=='A')
{
enter = i;
}
if(q->accept)
{
node->accept=true;
node->ID=q->ID;
}
int sls =(int) q->next.size();
for(int k=0;k<sls;k++)
{
int p=move(q,q->toNext[k]);
if(!include(node->toNext,q->toNext[k]))
{
node->next.push_back(p);
node->toNext.push_back(q->toNext[k]);
}
}
}
MDFA.push_back(node);
}
cou<<" minDFA:"<<endl;
for(int i=0;i<lss;i++)
{
int ssls=(int)MDFA[i]->toNext.size();
for(int j=0;j<ssls;j++)
{
int p=MDFA[i]->next[j];
cou<<" ";
if(i==enter) cou<<"入口";
else cou<<" ";
cou<<MDFA[i]->id<<"-"<<MDFA[i]->toNext[j]<<"->"<<MDFA[p]->id;
if(MDFA[p]->accept)
{
cou<<" -> 可被接受为 "<<MDFA[p]->ID;
}
cou<<endl;
}
}
cou<<endl<<" - - - - - - - - - - minDFA - END - - - - - - - - - "<<endl<<endl;
Begin = MDFA[enter];
return ;
}
void toDFA()
{
char sign='A';
Dbegin = new DFANode;
DFAVector.push_back(Dbegin);
Dbegin->states = E_closure(0);
getAccept(Dbegin);
Dbegin->id=sign;sign++;
int l=(int)dataVector.size();
stack<DFANode*>s;
s.push(Dbegin);
while(!s.empty())
{
DFANode* top=s.top();s.pop();
for(int i=0;i<l;i++)
{
vector<int> temp=move(top->states,dataVector[i]);
if(temp.empty()) continue;
int ls=(int)DFAVector.size(),k=0;
for(int j=0;j<ls;j++)
{
if(equal(temp,DFAVector[j]->states))
{
top->next.push_back(DFAVector[j]);
top->toNext.push_back(dataVector[i]);
k++;
break;
}
}
if(k==0)
{
DFANode* newNode = new DFANode;
newNode->states=temp;
newNode->id=sign;sign++;
getAccept(newNode);
DFAVector.push_back(newNode);
s.push(newNode);
top->next.push_back(newNode);
top->toNext.push_back(dataVector[i]);
}
}
}
showDFA();
toMinDFA();
return ;
}
string getString(char s)
{
if(isDigit(s)) return "digit";
if(isLetter(s)) return "letter";
string ss="";
ss+=s;
return ss;
}
int Move(Node* q,char ss)
{
string s=getString(ss);
int l=(int)q->next.size();
for(int i=0;i<l;i++)
{
if(q->toNext[i]==s)
{
Node* p = MDFA[q->next[i]];
return q->next[i];;
}
}
return -1;
}
string opWord(string s)
{
if(include(keyWord,s))
return s;
int l=s.length(),i=0;
Node* here=Begin;
for(i=0;i<l;i++)
{
int p=Move(here,s[i]);
if(p<0)
{
return "ERROR";
}
here=MDFA[p];
}
if(i==l)
{
if(here->accept)
return here->ID;
else return "ERROR";
}
}
void opFile()
{
ifstream in("system\\inFile.txt");
ofstream out("system\\tokens.txt");
char s[1000];
int sum=0;
while(in)
{
int l=0;
in.getline(s,1000);
l=(int)strlen(s);
if(l==0) continue;
string ss="";
for(int i=0;i<l;i++)
{
if(isLetter(s[i])||isDigit(s[i])||s[i]=='.')
ss+=s[i];
else
{
if(ss!="")
{
out<<" "<<opWord(ss)<<" "<<ss;
if(opWord(ss)=="ERROR")
{
errors.push_back(ss);
errorline.push_back(sum);
}
}
ss="";
if(s[i]==' '||s[i]==' ') continue;
ss+=s[i];
if(i<l-1)
{
ss+=s[i+1];
if(opWord(ss)!="ERROR")
{
string last=ss;
while(opWord(ss)!="ERROR")
{i++;last=ss;ss+=s[i+1];}
ss=last;
{
out<<" "<<opWord(ss)<<" "<<ss;
if(opWord(ss)=="ERROR")
{
errors.push_back(ss);
errorline.push_back(sum);
}
}
}
else
{
ss="";ss+=s[i];
out<<" "<<opWord(ss)<<" "<<ss;
if(opWord(ss)=="ERROR")
{
errors.push_back(ss);
errorline.push_back(sum);
}
}
}
else{
out<<" "<<opWord(ss)<<" "<<ss;
if(opWord(ss)=="ERROR")
{
errors.push_back(ss);
errorline.push_back(sum);
}
}
ss="";
}
}
}
in.close();
out<<" ";
out.close();
}
void readKeyWord()
{
ifstream in("system\\keyWord.txt");
string word="";
while(in>>word)
{
if(word=="ENDed")
break;
if(!include(keyWord,word))
keyWord.push_back(word);
}
in.close();
return ;
}
int main()
{
dataStack.push(0);
string s1="",s2="";
begin = new Node;
begin->accept=false;
nodeVector.push_back(begin);
end = new Node;
end->accept=true;
nodeVector.push_back(end);
ifstream in("system\\ZhengFile.txt");
while(in>>s1)
{
if(s1=="END") break;
in>>s2;
opStack.push('#');
toNFA(s2);
int y=dataStack.top();dataStack.pop();
int x=dataStack.top();dataStack.pop();
nodeVector[y]->accept=true;
nodeVector[y]->ID=s1;
nodeVector[y]->next.push_back(1);
nodeVector[y]->toNext.push_back("");
begin->next.push_back(x);
begin->toNext.push_back("");
}
in.close();
showNFA();
toDFA();
readKeyWord();
opFile();
ofstream err("system\\error.txt");
if(!errorline.size()==0)
{
err<<"共有"<<errorline.size()<<"处词法错误"<<endl;
for(int i=0;i<errorline.size();i++)
err<<" 第"<<errorline[i]<<"行: "<<errors[i]<<endl;
err.close();
}
else{
err<<"分析成功";
err.close();
system("system\\compile3.exe");
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -