?? ll1_recognizer.cpp
字號:
//LL1_Recognizer.cpp
#include "stdafx.h"
#include "LL1_Recognizer.h"
void LL1_Recognizer::lldriver()
{
sym_stack.push(g->start_symbol);
cout<<"Push: "<<g->GetStr(g->start_symbol)<<endl;
list<TOKEN>::iterator pos=tlist->begin(); //裝入開始符
terminal a; //TOKEN中的終極符信息
nonterminal X; //產生式中的相應符號
pair<nonterminal,terminal> p_temp;
int j;
vector<symbol>::reverse_iterator v_it;
if(pos == tlist->end()) return;
while( !sym_stack.empty() ) //表不空時工作
{
a=pos->value;
X=sym_stack.top();
//當X是非終極符,通過LL1表找到(X,a)對應的產生式并彈出X,壓入產生式右部.
if( g->is_nonterminal(X) )
{
if(a.first == Id || a.first == Intc) a=make_pair(a.first,-1);
p_temp=make_pair(X,a);
if( LL_Table.find(p_temp) == LL_Table.end() ) error(pos,X);
else
{
cout<<"Pop: "<<g->GetStr(X)<<endl;
sym_stack.pop();
j=LL_Table[p_temp];
for(v_it=g->productions[j].rhs.rbegin();v_it != g->productions[j].rhs.rend(); v_it++)
{ sym_stack.push(*v_it); cout<<"Push: "<<g->GetStr(*v_it)<<endl; }
}
}
//當X是終極符,如果非空則檢查匹配并彈出,如果是空則直接彈出
else if (g->is_terminal(X) && (g->match(X,a) || X.first == $) )
{
if (X.first == $) cout<<"Pop: $"<<endl;
else cout<<"Match: "<<g->GetStr(X)<<" , "<<g->GetStr(a)<<endl;
sym_stack.pop();
token_pos = pos;
if( X.first != $ ) pos++;
}
//如果X是動作符號,則運行相應的動作函數.
else if ( g->is_action_symbol(X) )
{
cout<<"Call: "<<g->GetStr(X)<<endl;
sym_stack.pop();
//Call Semantic Routine corresponding to X;
act.call_action(X,token_pos);
}
else error(pos,X);
}
//當TOKEN指針指向文件尾,說明語法分析成功.
if(pos == tlist->end()) cout<<"Cheer! Accept!"<<endl<<endl;
else error(pos,X);
}
void LL1_Recognizer::error(list<TOKEN>::iterator pos,nonterminal X)
{
//如果TOKEN序列結束而分析未結束,則顯示少的部分,即產生式中的X
if(pos == tlist->end())
cerr<<"Maybe lose "<<g->GetStr(X)<<endl;
else
//如果TOKEN序列未結束,說明不匹配,將不匹配的(X,a)顯示.
cerr<<"There's an error here: ("<<pos->line<<") "<<g->GetStr(pos->value)<<' '<<g->GetStr(X)<<endl;
exit(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -