⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lrprinttable.cpp

📁 一门课程的proj
💻 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 + -