📄 analysis.cpp
字号:
#include"analysis.h"
#include <iostream>
#include <fstream>
#include <algorithm>
analyse::analyse()
{
begin=0;end=0; text=" ";
keys[0]="t0";keys[1]="t1";keys[2]="t2";keys[3]="t3";
keys[4]="t4";keys[5]="t5";keys[6]="t6";keys[7]="t7";
keys[8]="t8";keys[9]="t9";keys[10]="t10";keys[11]="t11";
keys[12]="t12";keys[13]="t13";keys[14]="t14";keys[15]="t15";
}
void analyse::Get_text(){
string name;
p: cout<<"输入文件名(含路径): ";
cin>>name;
ifstream file(name.c_str (),ios::in );
if(!file){
cerr<<"文件"<<name<<"无法打开!!"<<endl;
goto p;
}
cout<<endl;
string str=" ";
while(getline(file,str))
text+=str;
file.close ();
}
bool analyse::Is_boundary(string str){
char boundry[]={',',';','{','}','(',')','\"'};
for(int i=0;i<7;i++)
if(str[0]==boundry[i])
return true;
return false;
}
bool analyse::Is_macthsign(string str){
char sign[7]={'+','-','*','/','=','<','>'};
for (int i=0;i<7;i++)
if(str[0]==sign[i])
return true;
return false;
}
void analyse::find_key(){
string p[]={"char","double","int","long","double","float","for","while","do","break","continue","switch","short","case","return","if"};
for(int i=0;i<16;i++)
key.push_back (p[i]);
}
bool analyse::Is_key(string str){
for(string::size_type i=0;i<key.size ();i++)
if(!str.compare (key[i]))
return true;
return false;
}
string analyse::get_word(){
string word;
string str("()!{},; \n+-*/=<>\"");
end=(int)text.find_first_of(str,begin);
if(end==-1) return " ";
if(begin!=end) end--;
word=text.substr (begin,end-begin+1);
return word;
}
void analyse::Get_word(){
do{
for( ; ;begin++) {
if(text[begin]!=' '&&text[begin]!='\n')
break;
}
string word=get_word();
if(end==-1) break;
if(word!=" "&&word!="\n")
s_word.push_back (word);
begin=end+1;
}while(true);
}
void analyse::display( ){
cout<<" "<<endl;
cout<<"********** 程序已完成词法分析,分析结果显示如下 ****************\n";
cout<<"********** O-运算符 K-关键字 N-常数 B-界符 S-标志符 ****************\n";
cout<<" "<<endl;
for(string::size_type i=0;i< str_word.size();i++)
cout<<"<"<<str_word[i].type <<" , "<<str_word[i].word <<" >"<<endl;
}
void analyse::text_analysis( ){
team p;
for(string:: size_type i=0;i<s_word.size ();i++){
if(s_word[i].size()==1)
{
if((s_word[i]==">"||s_word[i]=="<"||s_word[i]=="!"||s_word[i]=="-"||s_word[i]=="+")&&s_word[i+1]=="=")
{
p.type ="O";
p.word =s_word[i]+s_word[i+1];
i++;
str_word.push_back(p);
continue;
}
if((s_word[i]=="+"&&s_word[i+1]=="+")||(s_word[i]=="-"&&s_word[i+1]=="-"))
{
p.type ="O";
p.word =s_word[i]+s_word[i+1];
i++;
str_word.push_back(p);
continue;
}
if(Is_boundary(s_word[i]))
{
p.type ="B";
p.word =s_word[i];
str_word.push_back(p);
}
else if(Is_macthsign(s_word[i]))
{
p.type ="O";
p.word =s_word[i];
str_word.push_back(p);
}
else if(s_word[i][0]<='9'&&s_word[i][0]>='0')
{
p.type ="N";
p.word =s_word[i];
str_word.push_back(p);
}
else
{
p.type ="S";
p.word =s_word[i];
str_word.push_back(p);
}
}
else if(s_word[i][0]<='9'&&s_word[i][0]>='0')
{
p.type ="N";
p.word =s_word[i];
str_word.push_back(p);
}
else if(Is_key(s_word[i]))
{
p.type ="K";
p.word =s_word[i];
str_word.push_back(p);
}
else
{
p.type ="S";
p.word =s_word[i];
str_word.push_back(p);
}
}
}
//================================================================================
void analyse::find_Expression(){
string::size_type i,j,index;
for( i=0;i<str_word.size ();i++)
if(!str_word[i].word.compare ("=")||!str_word[i].word.compare ("+=") ||!str_word[i].word.compare ("-="))
{
index=i-1;
for(j=i;j<str_word.size ();j++)
if(!str_word[j].word.compare (";"))
{
//for( ;index<j;index++)
// expression=expression+s_word[index];
if(str_word[index].type=="S") ana_Expression(index,j,0);
else ana_Expression(index,j,-1);
//cout<<str_word[i].word<<endl;
i=j+1;
// cout<<str_word[index].word<<endl;
// cout<<str_word[i].word<<endl;
// cout<<str_word[j-1].word<<endl;
break;
}
// expressions.push_back (expression);
// expression=" ";
}
//for(string::size_type m=0;m<expressions.size ();m++)
// cout<<expressions[m]<<endl;
}
void analyse::ana_Expression(string::size_type index,string::size_type i,int j){
// int flag;
string::size_type m;
string expression;
expression=" " ;
for( m=index;m<i;m++)
expression=expression+str_word[m].word ;
if(j==-1) expression=expression+" ERROR!";
else if(str_word[index+2].type=="O"&&str_word[index+2].word !="(")
{
expression=expression+" ERROR!";
j=-1;
}
cout<<"赋值表达式:"<<expression<<endl;
expressions.push_back (expression);
node *p,*q,*head;
head=NULL;
if(j==0)
{ cout<<"翻译成的四元式为:"<<endl;
/*for(m=index;m<i;m++)
{
if(str_word[m].type =="O")
{
if(str_word[m].word =="+"||str_word[m].word =="-") flag=1;
else if(str_word[m].word =="*"||str_word[m].word =="/") flag=2;
else if(str_word[m].word =="("||str_word[m].word ==")") flag=3;
else if(str_word[m].word =="="||str_word[m].word =="-="||str_word[m].word =="+=") flag=0;
else flag=-1;
}
}*/
for(m=index;m<i;m++)
{
p=new node;
p->words=str_word[m].word ;
p->next =NULL;
p->up =NULL;
p->flag =0;
if(p->words=="+"||p->words=="-") p->flag =2;
else if(p->words=="*"||p->words=="/") p->flag =3;
else if(p->words=="("||p->words==")") p->flag =4;
else if(p->words=="="||p->words=="-="||p->words=="+=")p->flag =1;
if(head==NULL) head=p;
else { q->next=p;p->up =q;}
q=p;
}
q=NULL;int k=0;
while(head!=NULL) {Get_first_sign(head,q,k);cout<<endl;}
}
//q=NULL;
}
void analyse::Get_first_sign(node * &head,node * q1,int &k){
node *p,*q; //if(q1) cout<<q1->words <<endl;
do{
q=NULL;
for(p=head;p!=NULL;p=p->next){
if(p->flag >0){
if(q==NULL) q=p;
else if((p->flag >q->flag || p->words =="(")&&p->words !=")") q=p;
}
if(p==q1) break;
}
// cout<<q->words<<q->up->words<<" " <<endl;
// cout<<"余飞"<<endl;cout<<q->words <<endl;
if(q && q->words ==")"){
q->up ->next = q->next ;
if(q->next) q->next ->up =q->up ;
q=NULL ;return;
}
if(q->words =="(") {
q->up ->next =q->next ;
q->next ->up =q->up ;
p=q->next ;q=q->next ;
while(p->words !=")") p=p->next ;
/*if(p->words ==")"){
p->up ->next =p->next ;
p->next ->up =p->up ;
p=p->up ;
}*/
// cout<<p->words <<endl;
Get_first_sign(q,NULL,k);
}
// cout<<"余飞"<<endl;
if(q!=NULL&&(q->flag) >0) get_result(head,q,k);
}while(head);
}
void analyse::get_result(node * &head,node * &q,int &k){
four_node four;
node * q1,* q2;
if(q->flag ==1){
if(q->words =="+=" || q->words =="-="){
four.opt=q->words ;
four.arg1 =q->up ->words ;
four.arg2 =q->next ->words ;
four.result =q->up ->words ;
}
else{
four.opt=":=" ;
four.arg1 =q->next ->words ;
four.arg2 ="-" ;
four.result =q->up ->words ;
}
head=NULL;
}
else if(q->flag ==2||q->flag ==3){
four.opt=q->words ;
four.arg1 =q->up ->words ;
four.arg2 =q->next ->words ;
four.result =keys[k] ;
k=k+1;
// cout<<"余飞"<<endl;cout<<q->words <<endl;
node *temp;temp=new node;
temp->words =four.result ;
temp->flag =0;
q1=q->next ;
temp->next =q1->next;
if(q1->next) q1->next->up =temp;
q2=q->up ;
temp->up =q2->up;
q2->up ->next =temp;
if(q2==head) head=temp;
q=temp;
// cout<<q->up->words<<" "<<q->words <<endl;
}
four_node_expr.push_back (four);
cout<<"<"<<four.opt <<","<<four.arg1<<","<<four.arg2 <<","<<four.result <<">" <<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -