📄 lrprinttable.cpp
字号:
#include "StdAfx.h"
#include ".\lrprinttable.h"
LRPrintTable_Line::LRPrintTable_Line()
{
this->line_num = -1;
for(int i = 0 ; i < symbol_num ; i ++)
{
_item[i].Symbol_num = _sm.sm[i].num;
_item[i].type = 0;
_item[i].status = -1;
}
}
void LRPrintTable_Line::print()
{
for(int i = 0 ; i < symbol_num ;i ++)
{
switch( _item[i].type )
{
case 1:{lrTable_output<<"r"<<_item[i].status<<"\t";break;}
case 2:{lrTable_output<<"s"<<_item[i].status<<"\t";break;}
case 3:{lrTable_output<<_item[i].status<<"\t";break;}
case 4:{lrTable_output<<"acc"<<"\t";break;}
default:{lrTable_output<<"-1"<<"\t";break;}
}
}
}
LRPrintTable_Item * LRPrintTable_Line::findSymbol(int symbol)
{
for(int i = 0 ;i < symbol_num ;i ++)
{
if( _item[i].Symbol_num == symbol )
return &_item[i];
}
return NULL;
}
void LRPrintTable_Line::SetLine(FileReader *fr)
{
char content[10];
int i = 0 ;
fr->getFirstString(content);
this->line_num = atoi(content);//获得行号
while( fr->IsLineEnd() != 1 )
{
fr->getFirstString(content);
if( atoi(content) == -1 )
{
_item[i].type = 0;
}
else
{
if(content[0] == 's')
{
_item[i].type = 2;
_item[i].status = atoi(&content[1]);
}
else if( content[0] == 'r')
{
_item[i].type = 1;
_item[i].status = atoi(&content[1]);
}
else if( content[0] == 'a')
{
_item[i].type = 4;
}
else
{
_item[i].type = 3;
_item[i].status = atoi(content);
}
}
i++;
}
}
void LRPrintTable_Line::SetLine(LRTable_Item *src, int l_n)
{
this->line_num = l_n;
for( int i = 0 ; i < src->aag_num ; i++)
{
int symbol = src->_aag[i].symbol;
LRPrintTable_Item * temp = findSymbol(symbol);//在一行中找到这个符号的位置
temp->status = src->_aag[i].status_convert;
temp->type = src->_aag[i].type;
}
}
/* ---------------------------------------------------- */
/* ---------------------------------------------------- */
/* ---------------------------------------------------- */
LRPrintTable::LRPrintTable(void)
{
_line.clear();
line_num = 0;
}
void LRPrintTable::printHead()
{
lrTable_output<<"status"<<"\t";
for(int i= 0 ;i < symbol_num ; i++)
lrTable_output<<_sm.sm[i].name<<"\t";
lrTable_output<<endl;
}
void LRPrintTable::readTable(FileReader *fr)
{
fr->ReadLine();//跳过第一行
while( fr->IsEnd() != 1 )
{
fr->ReadLine();
LRPrintTable_Line *point = new LRPrintTable_Line();
point->SetLine(fr);
line_num++;
_line.push_back(*point);
}
}
void LRPrintTable::SetTable(LRTable *lr)
{
line_num = lr->item_num;
for( int i = 0 ; i < lr->item_num-1 ; i++)
{
LRPrintTable_Line * point = new LRPrintTable_Line();
point->SetLine( &lr->_item[i], i );
_line.push_back( *point );
}
}
LRPrintTable_Line * LRPrintTable::findLRStatus(int status_num)//在LR1分析表中找到对应的行
{
for( int i = 0 ; i < line_num ; i++)
if( _line[i].line_num == status_num )
return &_line[i];
return NULL;
}
void LRPrintTable::print()
{
lrTable_output.open("table.txt");
printHead();
for( int i = 0 ; i < line_num-1 ; i++)
{
lrTable_output<<_line[i].line_num<<"\t";
_line[i].print();
lrTable_output<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -