?? grammar.cpp
字號:
//Grammar.cpp
#include "stdafx.h"
#include "Grammar.h"
#include "Initializtion.h"
Grammar::Grammar()
{
cout<<"Initializing the grammer..."<<endl<<endl;
//initialize terminals
int i;
//把關鍵字,符號都加入到終極符映射中,并建立它們的內部表示symbol
for (i=0; i<keynum; i++)
terminals[key[i]]=make_pair(Key,i); //填入關鍵字
for (i=0; i<bordernum; i++)
terminals[border[i]]=make_pair(Border,i); //填入特殊符號
for (i=0; i<arithnum; i++)
terminals[arithmetic[i]]=make_pair(Arithmetic,i); //填入數學符號
for (i=0; i<relnum; i++)
terminals[relation[i]]=make_pair(Relation,i); //填入聯系符號
terminals["INTC"]=make_pair(Intc,-1); //為INTC建立內部表示
terminals["CHAR"]=make_pair(Charc,-1);//為CHAR建立內部表示
terminals["ID"]=make_pair(Id,-1); //為ID建立內部表示
terminals["$"]=make_pair($,0); //"$" means null,為NULL建立內部表示
terminals["EOF"]=make_pair(Eof,0);//為文件結束符建立內部表示
//initialize nonterminals
start_symbol=make_pair(Vn,0);
for (i=0; i<Vnum; i++)
nonterminals[vn[i]]=make_pair(Vn,i);
//initialize actions
for (i=0; i<actionum; i++)
actions[action[i]]=make_pair(Action,i);
//initialize productions
symbol sym;
production temp;
int t;
for(i=0; i<num_prods; i++)
{
sym=Static_Search(ProdStr[i][0]);
if (sym.first == Vn) temp.lhs=sym; //產生式的左部必須是非終極符
else
{
cerr<<"the left of production isn't nontermial!"<<endl;
cerr<<ProdStr[i][0]<<endl;
exit(1);
}
for (t=1; ProdStr[i][t].compare("\n") ; t++)
{
sym=Static_Search(ProdStr[i][t]);
if (sym.first == Default)
{
cerr<<"this word is error: "<<ProdStr[i][t]<<endl;
exit(1);
}
else temp.rhs.push_back(sym);
}
productions.push_back(temp);
temp.rhs.clear();
}
Show_Productions();
}
void Grammar::Show_Productions()
{
cout<<"The productions:"<<endl;
vector<production>::iterator pos=productions.begin();
vector<symbol>::iterator tp;
while(pos != productions.end())
{
cout<<distance(productions.begin(),pos)+1;
cout.width(20);
cout<<GetStr(pos->lhs)<<" -> ";
tp=pos->rhs.begin();
while (tp != pos->rhs.end())
{
cout<<GetStr(*tp)<<' ';
tp++;
}
cout<<endl;
pos++;
}
cout<<endl;
}
symbol Grammar::Static_Search(const string& search)
{
symbols::iterator pos=nonterminals.find(search);
if ( pos != nonterminals.end() ) return pos->second;
else
{
pos=terminals.find(search);
if ( pos != terminals.end() ) return pos->second;
else
{
pos=actions.find(search);
if ( pos != terminals.end() ) return pos->second;
else return make_pair(Default,0);
}
}
return make_pair(Default,0);
}
bool Grammar::is_nonterminal(const symbol &X)
{
if( X.first == Vn ) return true;
else return false;
}
bool Grammar::is_terminal(const symbol &X)
{
switch(X.first)
{
case Key:
case Border:
case Arithmetic:
case Relation:
case Intc:
case Id:
case $:
case Charc:
case Eof:
return true;
case Vn:
case Action:
case Default:
default:
return false;
};
}
bool Grammar::is_action_symbol(const symbol &X)
{
if (X.first == Action) return true;
else return false;
}
bool Grammar::match(const terminal &X, const terminal &Y)
{
if(X.first != Y.first) return false; //匹配類型必須相同
else if( X.second == Y.second) return true; //而且偏移必須相同
//但標識符和整型常量例外,它們只要類型分別和"ID","INTC"相同即可.
else if( ((X.first == Id) || (X.first == Intc)) ) return true;
else return false;
}
symbol Grammar::Search(const string& search,symbol_type wordtype)
{
symbols::iterator pos;
int i=0;
switch (wordtype)
{
case Vn:
{
pos=nonterminals.find(search);
if ( pos != nonterminals.end() ) return pos->second;
else return make_pair(Default,0);
};
case Key: //查找關鍵字
case Border:
case Arithmetic:
case Relation:
{
pos=terminals.find(search);
if ( pos != terminals.end() ) return pos->second;
else return make_pair(Default,0);
};
case Intc: //查找常數表
{
pos=terminals.find(search);
if ( pos != terminals.end() ) return pos->second;
else
{
terminals[search]=make_pair(Intc,Intcnum);
Intliterals.push_back(search);
return make_pair(Intc,Intcnum++);
}
};
case Charc: //查找字符表
{
pos=terminals.find(search);
if ( pos != terminals.end() ) return pos->second;
else
{
terminals[search]=make_pair(Charc,Charcnum);
Intliterals.push_back(search);
return make_pair(Charc,Charcnum++);
}
};
case Id: //查找標識符表
{
pos=terminals.find(search);
if ( pos != terminals.end() ) return pos->second;
else
{
terminals[search]=make_pair(Id,idnum);
id.push_back(search);
return make_pair(Id,idnum++);
}
};
default:
return make_pair(Default,0);
}
}
string Grammar::GetStr(const symbol &sym)
{
if (sym.second == -1) return name[(int)sym.first];
else
switch(sym.first)
{
case Vn:
return vn[sym.second];
case Key:
return key[sym.second];
case Border:
return border[sym.second];
case Arithmetic:
return arithmetic[sym.second];
case Relation:
return relation[sym.second];
case Intc:
return Intliterals[sym.second];
case Charc:
return Chars[sym.second];
case Id:
return id[sym.second];
case $:
return "$";
case Action:
return action[sym.second];
case Eof:
return "EOF";
case Default:
return "Sorry,it's Fail!";
default:
return NULL;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -