?? ll1_judge.cpp
字號:
#include ".\ll1_judge.h"
LL1_judge::LL1_judge(void)
{
for(int i=0;i<26;i++)
{
m_temp_nt.push_back(char(65+i));
}
m_temp_nt_pointer=0;
m_str_compare="A->a|@";
for(int j=0;j<(int)m_str_compare.size();j++)
{
m_compare.push_back(m_str_compare[j]);
}
m_terminal.push_back(m_str_compare[5]);
}
LL1_judge::~LL1_judge(void)
{
}
bool LL1_judge::in_type(string str)
{
if(str.find("->"))
{
vector<char> type;
for(int i=0;i<(int)str.size();i++)
{
type.push_back(str.at(i));
}
m_creation.push_back(type);
cout<<"產生式現有個數"<<(int)m_creation.size()<<endl;
return true;
}
else
return false;
}
void LL1_judge::cancel_directly(void) ///************************8沒有分解
{
for(int i=0;i<(int)m_creation.size();i++)
{
if(judge_directly(m_creation[i]))//如果有直接左遞歸,就消除
{
cout<<"第"<<i<<"個產生式有直接左遞歸,現在消除"<<endl;
string t_a,t_b;
bool is_nt;//1為是終結符
is_nt=false;
bool is_next;
is_next=false;
for(int j=3;j<(int)m_creation[i].size();j++)
{
if(m_creation[i][j]==m_compare[4])//問題: 不識別|;
{
is_next=true;
is_nt=false;
}
else if(m_creation[i][j]==m_creation[i][0])
is_nt=true;
else if(is_nt==true)
{
if(is_next==true&&t_a.size()>0) t_a+=m_str_compare[4];
t_a+=m_creation[i][j];
is_next=false;
}
else
{
if(is_next==true&&t_b.size()>0) t_b+=m_str_compare[4];
t_b+=m_creation[i][j];
is_next=false;
}
}
for(int w1=0;w1<(int)t_b.size();w1++)
{
if(t_b[w1]==m_str_compare[4])
{
t_b.insert(w1,1,m_temp_nt[m_temp_nt_pointer]);//####################
w1+=1;
}
}
t_b+=m_temp_nt[m_temp_nt_pointer];//bp' 完成了產生式的右部
m_creation[i].erase(m_creation[i].begin()+3,m_creation[i].end());
for(int t=0;t<(int)t_b.size();t++)
{
m_creation[i].push_back(t_b[t]);
}//產生式P->BP'完成
//此步成功完成,
for(int yy=0;yy<(int)m_creation[i].size();yy++)
{
cout<<"#######"<<m_creation[i][yy];
}
for(int w2=0;w2<(int)t_a.size();w2++)
{
if(t_a[w2]==m_str_compare[4])
{
t_a.insert(w2,1,m_temp_nt[m_temp_nt_pointer]);
w2+=1;
}
}
t_a+=m_temp_nt[m_temp_nt_pointer];
t_a+=m_str_compare[4];
t_a+=m_str_compare[5];//完成產生式的右部P'->aP'|@
vector<char> t_vec;
t_vec.push_back(m_temp_nt[m_temp_nt_pointer]);
t_vec.push_back(m_str_compare[1]);
t_vec.push_back(m_str_compare[2]);
m_non_terminal.push_back(m_temp_nt[m_temp_nt_pointer]);
m_temp_nt_pointer++;
for(int r=0;r<(int)t_a.size();r++)
{
t_vec.push_back(t_a[r]);
}
m_creation.insert(m_creation.begin()+i+1,1,t_vec);
i++;
}
}
}
int LL1_judge::in_terminal_sign(string str)
{
for(int i=0;i<(int)str.size();i++)
{
m_terminal.push_back(str.at(i));
}
return 0;
}
void LL1_judge::in_non_terminal_sign(string str)//非終結符的輸入
{
for(int i=0;i<(int)str.size();i++)
{
m_non_terminal.push_back(str.at(i));
for(int j=0;j<(int)m_temp_nt.size();j++)
{
if(m_temp_nt[j]==str.at(i))
{
m_temp_nt.erase(m_temp_nt.begin()+j);
}
}
}
cout<<"非終結符:";
for(int t=0;t<(int)m_non_terminal.size();t++)
{
cout<<m_non_terminal[t];
}
}
bool LL1_judge::judge_directly(vector<char> vec)
{
cout<<"到了判斷直接左遞歸了 "<<endl;
int is_true=0;
if(vec[0]==vec[3]) is_true=1;
for(int i=4;i<(int)vec.size();i++)
{
if(vec[i]==char("|"))
{
if(vec[i+1]==vec[0]){is_true=1;break;}
}
}
if(is_true==1)
{
cout<<"發(fā)現直接左遞歸:";
for(int p=0;p<(int)vec.size();p++)
{
cout<<vec[p];
}
return true;
}
else
return false;
}
bool LL1_judge::judge_indirectly()
{
vector<judge_nt> vec;
bool is_end=false;
for(int i=0;i<(int)m_creation.size();i++)
{
if(is_end==false)// --->>>>>
{
vec.clear();
for(int r1=0;r1<(int)m_non_terminal.size();r1++)//第一個產生式
{
if(m_creation[i][3]==m_non_terminal[r1])
help_j_ind(vec,m_creation[i][0],m_creation[i][3],is_end);
}
if(is_end==false)// 盡量減少遞歸的次數
{
for(int r2=0;r2<(int)m_creation[i].size();r2++)//以后的產生式
{
if(m_creation[i][r2]==char("|"))
{
for(int r3=0;r3<(int)m_non_terminal.size();r3++)
{
if(m_creation[i][r2+1]==m_non_terminal[r3])
help_j_ind(vec,m_creation[i][0],m_creation[i][r2+1 ],is_end);
}
}
}
}
}//if(is_end)
}
return is_end;
}
void LL1_judge::help_j_ind(vector<judge_nt> &vec, char zuo,char you,bool &is_end)
//函數是一第一個生成式的,第一個產生式開始的, //需在調用函數里 根據產生式個數調用此函數
{
judge_nt temp;
temp.zuo=zuo;
temp.you=you;
vec.push_back(temp);
int find_pointer;
for(int t=0;t<(int)m_creation.size();t++)
{
if(m_creation[t][0]==you)find_pointer=t;
}
for(int t4=0;t4<(int)vec.size();t4++)//判斷第一個產生式是不是是間接左遞歸成立
{
if(m_creation[find_pointer][3]==vec[t4].zuo)
{
is_end=true;
break;
}
}
if(is_end==false)//第一次判斷結果
{
for(int t1=0;t1<(int)m_non_terminal.size();t1++)//第一個產生式的遞歸
{
if(m_creation[find_pointer][3]==m_non_terminal[t1])
{
help_j_ind(vec,you,m_creation[find_pointer][3],is_end);
}
}
for(int t2=3;t2<(int)m_creation[find_pointer].size();t2++)//‘|’以后的產生式的遞歸
{
if(is_end==false)
{//////////////////////////
if(m_creation[find_pointer][t2]==m_compare[4])
{
for(int t5=0;t5<(int)vec.size();t5++)
{
if(m_creation[find_pointer][t2+1]==vec[t5].zuo)
{
is_end=true;
break;
}
}//判斷這個產生式是不是使間接作遞歸成立
//如果不成立,第一個符號是不是非終結符,是則進入下一次左遞歸
if(is_end==false)
{
for(int t3=0;t3<(int)m_non_terminal.size();t3++)
{
if(m_creation[find_pointer][t2+1]==m_non_terminal[t3])
{
help_j_ind(vec,you,m_creation[find_pointer][t2+1],is_end);//&&&&&&&&&&&&&&&&&&&&7
}
}
}
}
}//////////////////////////////////////////////////////////////////////////////////////////////////////////
}
}
//好像是每次都要刪除了
vec.erase(vec.end()-1);
}
void LL1_judge::cancel_indirectly(void)
{
if(judge_indirectly())
{
for(int i=0;i<(int)m_creation.size();i++)
{
bool is_first=true;
for(int t=3;t<(int)m_creation[i].size();t++)
{
if(is_first==true)//如果是表達式的第一個符號
{
is_first=false;
for(int t2=0;t2<i;t2++)
{
if(m_creation[i][t]==m_creation[t2][0])//到達了替換的條件
{
//所有操作在這個條件以內
string str1,str2;
for(int t3=3;t3<(int)m_creation[t2].size();t3++)
{
str1+=m_creation[t2][t3];
}
for(int t4=t+1;t4<(int)m_creation[i].size();t4++)
{
if(m_creation[i][t4]==m_compare[4])break;
else
{
str2+=m_creation[i][t4];
}
}
for(int t5=0;t5<(int)str1.size();t5++)
{
if(str1[t5]==m_str_compare[4])
{
cout<<"到達了串的插入了"<<endl;
str1.insert(str1.begin()+t5,str2.begin(),str2.end());//問題:關于插入,不成功了
t5+=(int)str2.length();
}
}
m_creation[i].erase(m_creation[i].begin()+t);
m_creation[i].insert(m_creation[i].begin()+t,str1.begin(),str1.end());
//這里先將所有的間接遞歸替換完后,
//才判斷這句有沒有直接遞歸,不知道有沒有射門么問題
i--;//在每替換一個非終結符的時候,回退一位,看有沒有替換完全
is_first=true;
}
}
}
else if(m_creation[i][t]==m_compare[4]) is_first=true;
else
is_first=false;
}
if(judge_directly(m_creation[i]))
{
cancel_directly();
}
}
}
}
void LL1_judge::display_all(void)
{
cout<<"產生式顯示:"<<endl;
for(int i=0;i<(int)m_creation.size();i++)
{
cout<<" ";
for(int j=0;j<(int)m_creation[i].size();j++)
{
cout<<m_creation[i][j];
}
cout<<endl;
}
cout<<"首符集顯示:"<<endl;
for(int a1=0;a1<(int)m_first.size();a1++)
{
cout<<" ";
for(int a2=0;a2<(int)m_first[a1].size();a2++)
{
cout<<m_first[a1][a2];
}
cout<<endl;
}
}
void LL1_judge::find_first()
{
for(int i=0;i<(int)m_creation.size();i++)
{
bool is_first=true;
vector<char> temp;
temp.push_back(m_creation[i][0]);
for(int j=3;j<(int)m_creation[i].size();j++)
{
if(is_first==true)
{
is_first=false;
for(int t1=0;t1<(int)m_terminal.size();t1++)
{
if(m_creation[i][j]==m_terminal[t1])
{
push_back(temp,m_creation[i][j]);
}
}
}
else if(m_creation[i][j]==m_compare[4])
{
is_first=true;
}
else
{
is_first=false;
}
}
m_first.push_back(temp);
}//到這里完成第一遍的終結符掃描
for(int a1=0;a1<(int)m_creation.size();a1++)
{
bool first=true;
bool is_continue;
is_continue=false;
bool nt_t=true;//1-nt,a-t
for(int a2=3;a2<(int)m_creation[a1].size();a2++)
{
if(first==true||is_continue==true)
{
//非終結符情況
for(int a3=0;a3<(int)m_non_terminal.size();a3++)
{
if(m_creation[a1][a2]==m_non_terminal[a3])
{
nt_t=true;
push_back(m_first[a1],m_creation[a1][a2]);
for(int a4=0;a4<(int)m_first.size();a4++)
{
if(m_first[a4][0]==m_creation[a1][a2])
{
for(int a5=1;a5<(int)m_first[a4].size();a5++)
{
if(m_first[a4][a5]==m_compare[5])
{
is_continue=true;
}//有空串就使is_continue=ture
}
}
}//非終結符
}
}
//終結符情況
if(nt_t==false)
{
if(m_creation[a1][a2]==m_compare[4])
{
push_back(m_first[a1],m_str_compare[5]);
first=true;//在最后一個非終結符都有空串的時候,我們加了空串到非終結符集合
}
else
{
push_back(m_first[a1],m_creation[a1][a2]);
}
is_continue=false;
nt_t=false;
}
}
else if(m_creation[a1][a2]==m_compare[4])
{
first=true;
}
else
{
first=false;
}
}
}//到這里完成了第二遍的非終結符的掃描,下一步是完成替換規(guī)則
for(int b1=0;b1<(int)m_first.size();b1++)
{
vector<char> temp_nt;
temp_nt.push_back(m_first[b1][0]);
bool is_deal=false;
for(int b2=1;b2<(int)m_first[b1].size();b2++)
{
for(int b3=0;b3<(int)m_non_terminal.size();b3++)
{
if(m_first[b1][b2]==m_non_terminal[b3])
{
for(int b6=0;b6<(int)temp_nt.size();b6++)
{
if(m_first[b1][b2]==temp_nt[b6])
{
m_first[b1].erase(m_first[b1].begin()+b2);
b2--;
is_deal=true;
}
}
if(is_deal==false)
{
is_deal=false;
for(int b4=0;b4<(int)m_first.size();b4++)
{
if(m_first[b4][0]==m_first[b1][b2])
{
for(int b5=1;b5<(int)m_first[b4].size();b5++)
{
push_back(m_first[b1],m_first[b4][b5]);
}
}
}
m_first[b1].erase(m_first[b1].begin()+b2);
b2--;
}
}
is_deal=false;
}
}
}
}
void LL1_judge::push_back(vector<char> &vec, char ch)
{
bool is_include;
is_include=false;
for(int i=0;i<(int)vec.size();i++)
{
if(vec[i]==ch)is_include=true;
}
if(is_include==false)
{
vec.push_back(ch);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -