?? compiler.cpp
字號:
// compiler.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
//在left為左室的產生式加入first_symbol的符號first集合
void addFirstSymbol(int left, int first_symbol)
{
if(left == first_symbol)
return;
if(first_symbol > NES_ES || first_symbol == -1 )//加入終結符
{
ps.getNes(left)->AddFirstSymbol(first_symbol);
}
else
{
if( ps.getNes(first_symbol)->first_finish == 0 ) //先算出完整的first集合
{
for(int i= 0 ; i < creation_num ; i ++)
{
if(_creation[i].getLeft() == first_symbol)
{
addFirstSymbol(_creation[i].getLeft(), _creation[i].getPosition(0));
}
}
ps.getNes(first_symbol)->first_finish = 1;
}
for(int i = 0 ; i < ps.getNes(first_symbol)->first_num ; i ++)
{
ps.getNes(left)->AddFirstSymbol(ps.getNes(first_symbol)->_first[i]);
}
}
}
int testExist(class LRPrefix *temp, int move_symbol)
{
int src_status = temp->status_in;
for(int i = 0 ;i < status_num ;i ++)
{
if( _status[i].PrefixExist(temp) == 1 )//S[i]狀態中包含temp這個前綴
{
int check_flag = 1;
for( int j = 0 ; j < _status[src_status].prefix_num ; j++)//檢查是否包含所有這個狀態的移進符號
{
if( _status[src_status]._prefix[j]._prefix.getFirstSymbol() == move_symbol )
{
LRPrefix check;
check.setPrefix( &_status[src_status]._prefix[j] );
check._prefix.prefix_pos++;
check_flag = check_flag * _status[i].PrefixExist(&check);
}
}
if( check_flag == 1 )
return i;
}
}
return -1;
}
LRPrintTable_Item * getAction(int status, int forward_symbol)//尋找相應的處理
{
LRPrintTable_Line * temp = _table.findLRStatus(status);
if( temp != NULL)
{
for(int i = 0 ;i < symbol_num ; i ++)
if( temp->_item[i].Symbol_num == forward_symbol)
return &temp->_item[i];
}
return NULL;
}
void creation_init()
{
}
/*-----------------------------*/
/*主函數:
/*-----------------------------*/
int _tmain(int argc, _TCHAR* argv[])
{
int i, j;//用于循環
symbol_num = _sm.sm.size();
/*-----------------------------*/
/*獲得所有creation并輸出
/*-----------------------------*/
FileReader fr;
fr.OpenFile();
while( fr.IsEnd() != 1 )
{
creation *tempCreation = new creation();
fr.ReadLine();
//A[creation_num].analyze( &fr );
tempCreation->analyze( &fr);
tempCreation->setName( creation_num + 1 );
_creation.push_back( *tempCreation );
//A[creation_num].setName(creation_num + 1);
creation_num++;
}
fr.CloseFile();
/*
for(i = 0 ; i < creation_num ;i ++)
{
A[i].output();
}
*/
FileReader fr_table;
fr_table.setFileName("table.txt");
int exist = fr_table.OpenFile();
if( exist == 1 )
{
cout<<"LR1 表已存在,正在讀取。。。。。"<<endl;
_table.readTable(&fr_table);
_table.print();
}
else
{
cout<<"LR1表不存在,正在建立。。。。。"<<endl;
/*-----------------------------*/
/*獲得所有的符號并輸出
/*-----------------------------*/
for( i = 0 ; i < creation_num ; i++)
{
int sss = _creation[i].getLeft();
ps.addSymbol( _creation[i].getLeft() );
for( int j = 0 ; j < _creation[i].getLength() ;j++)
ps.addSymbol( _creation[i].getPosition(j) );
}
creation_init();
//ps.output();
/*-----------------------------*/
/*求first集合并輸出
/*-----------------------------*/
for(i = 0 ;i < ps.nes_num ;i ++)
{
for(j = 0 ; j < creation_num ; j ++)
{
if( _creation[j].getLeft() == ps.nes[i].symbol_name )
{
addFirstSymbol(_creation[j].getLeft(), _creation[j].getPosition(0));
}
}
ps.nes[i].first_finish = 1;
}
//ps.outputFirst();
/*-----------------------------*/
/*產生LR1表
/*-----------------------------*/
LRTable lr;
lr.addItem(status_num);
//設置起始狀態S[0]
status *tempNewStatus = new status();
tempNewStatus->number = status_num;
LRPrefix newPrefix;
newPrefix._prefix.creation_name = 0;
newPrefix._prefix.prefix_pos = 0;
newPrefix.status_in = 0;
newPrefix.addForwardSymbol(2000);
tempNewStatus->addPrefix(&newPrefix);
tempNewStatus->FindClosure();//擴展屬于這個狀態的活前綴
tempNewStatus->output();
_status.push_back(*tempNewStatus);
status_num++;//狀態數增加
lr.addItem(status_num);
//開始求轉移
class convert_queue _convertStack;//轉移隊列
_convertStack.AddStatus(&_status[0]);
class LRPrefix _ondeal;
int symbol, end;
while(_convertStack.IsEmpty() != 1)
{
_convertStack.PushOut(&_ondeal);//退出隊列
end = _ondeal.testEffective();//測試是規約還是移進
if(end == 0)//規約
{
if(_ondeal._prefix.creation_name != 0)
for(int k = 0 ; k < _ondeal.symbol_num ; k++)
{
LRTable_Item *tempItem = lr.findItem(_ondeal.status_in);
if( tempItem != NULL)
tempItem->AddItem(_ondeal._symbol[k], _ondeal._prefix.creation_name , 1);//規約
}
else
{
LRTable_Item *tempItem = lr.findItem(_ondeal.status_in);
if( tempItem != NULL)
tempItem->AddItem(2000, status_num, 4);//接收
}
continue;
}
symbol = _ondeal._prefix.getFirstSymbol();
_ondeal._prefix.prefix_pos++;
int pos = testExist(&_ondeal, symbol);//已存在
if(pos != -1 )//testExist負責檢查在以前的狀態中是否已經出現這個前綴,
{
LRTable_Item *tempItem = lr.findItem(_ondeal.status_in);
if( tempItem != NULL)
{
if(symbol < NES_ES )
tempItem->AddItem(symbol, pos, 3);//非終結符狀態轉移
else
tempItem->AddItem(symbol, pos, 2);//增加移進
}
continue;
}
//建立新的狀態集
tempNewStatus = new status();
tempNewStatus->number = status_num;
LRTable_Item *tempItem = lr.findItem(_ondeal.status_in);
if( tempItem != NULL)
{
if(symbol < NES_ES )
tempItem->AddItem(symbol, status_num, 3);//非終結符狀態轉移
else
tempItem->AddItem(symbol, status_num, 2);//增加移進
}
tempNewStatus->AddPossiblePrefix(&_status[_ondeal.status_in], symbol);
if( status_num == 22)
{
int ss = 0 ;
ss ++;
}
tempNewStatus->FindClosure();
tempNewStatus->output();
_status.push_back(*tempNewStatus);
_convertStack.AddStatus(&_status[status_num]);
status_num++;//狀態數增加
lr.addItem(status_num);
}
//打印lr表
lr.output();
_table.SetTable(&lr);
_table.print();
}
//詞法分析器初始化
// for(i = 0 ; i < 100 ;i ++)
// cout<<_analyze.getNextWord()<<",";
anaStack _as;
//初始化狀態棧
anaStatus * newAnaStatus = new anaStatus();
_as.PopIn(newAnaStatus);
//初始化符號棧
anaSymbol * newAnaSymbol = new anaSymbol();
newAnaSymbol->symbol = 2000;//#
//開始解析
action _act;
string useless;
int forward_symbol;
LRPrintTable_Item *tempItem;
anaStatus * tempStatus;
anaSymbol *tempSymbol;
forward_symbol = _analyze.getNextWord();
cout<<forward_symbol<<endl;
while(1)
{
if( _global.global_type == error )
return 0;
tempItem = getAction(_as.content->status_num, forward_symbol);//尋找相應的處理
if( tempItem->type == 0 )
tempItem = getAction(_as.content->status_num, -1);
if(tempItem->type == 1)//規約
{
int temp_creation = tempItem->status;//規約的產生式
int creation_length = _creation[temp_creation].getLength();//規約的長度
int finish_symbol = _creation[temp_creation].getLeft();//規約后的非終結符
_as.PushOut(NULL, creation_length);//狀態棧規約
if( _creation[temp_creation].getPosition(0) != -1 )
_as.PushSymbolOut(NULL, creation_length);//符號棧規約
_act.take_action(temp_creation);
//cin>>useless;
cout<<"按產生式"<<temp_creation<<"規約到了"<<finish_symbol<<endl;
//移入左式
tempItem = getAction(_as.content->status_num, finish_symbol);//尋找相應的處理
//狀態棧處理
tempStatus = new anaStatus();
tempStatus->status_num = tempItem->status;
_as.PopIn(tempStatus);
//處理符號棧
tempSymbol = new anaSymbol();
tempSymbol->symbol = finish_symbol;
_as.PopSymbolIn(tempSymbol);
cout<<"察看規約后符號";
_as.outputSymbol();
cout<<endl;
cout<<"察看移進后狀態";
_as.outputStatus();
cout<<endl;
}
else if(tempItem->type == 2)//移進
{
cout<<"移進了"<<forward_symbol<<endl;
//添加狀態棧內容
tempStatus = new anaStatus();
tempStatus->status_num = tempItem->status;
_as.PopIn(tempStatus);
//添加符號棧內容
tempSymbol = new anaSymbol();
tempSymbol->symbol = forward_symbol;
_as.PopSymbolIn(tempSymbol);
cout<<"察看移進后符號";
_as.outputSymbol();
cout<<endl;
cout<<"察看移進后狀態";
_as.outputStatus();
cout<<endl;
//繼續獲取符號
forward_symbol = _analyze.getNextWord();
if(forward_symbol == -1)
forward_symbol = 2000;
}
else if(tempItem->type == 3)//非終結符移進,沒有用
{
tempStatus = new anaStatus();
tempStatus->status_num = tempItem->status;
_as.PopIn(tempStatus);
cout<<"察看移進后符號";
_as.outputSymbol();
cout<<endl;
cout<<"察看移進后狀態";
_as.outputStatus();
cout<<endl;
}
else if(tempItem->type == 4)//結束
{
cout<<"finish"<<endl;
break;
// return 1;
}
else
{
cout<<"error!!"<<endl;
break;
// return 1;
}
}
//_act._code.output();
_act._code.output_C();
//_global.printVTable();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -