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

📄 maketable.cpp

📁 这是编译原理编译器中的一部分
💻 CPP
字号:
#include <stack>

#include "parse.h"
#include "read.h"
#include "make.h"

extern DVec_str productions;
extern vecStr terminals;
extern vecNter nonterminals;
extern DVec_int table;
extern vecStr vec ;

void makeTable()
{
	
	for(int i = 0, j = 0;j < (int)terminals.size();j++ )
	{
		if( terminals[j] != "ε" )
		{
			vec.push_back(terminals[j]);
			i++;
		}
	}
	vec.push_back("$");

	table.resize( nonterminals.size() );
	vector<int> v(vec.size() ,-1 );
	for( int i = 0;i < (int)table.size() ;i++ )
		table[i] = v;

	for(int i = 0;i < (int)productions.size();i++ )
	{
		bool flag = false;                         //测试ε 是否在First(A)中
		int nterIndex = findIndex( productions[i][0] );
		string token;

		//----------------------------------------------------------------------------------------------------------------
		vecStr pro(productions[i].begin() + 1,productions[i].end() );
		vecStr first = makeFirst(pro);
		for( int j = 0;j < (int)first.size();j++ )
		{
			token = first[j];//cout<<token;
			int terIndex = findTerIndex( vec,token );//cout<<terIndex;
			if( terIndex != -1)	table[nterIndex][terIndex] = i;

			else flag = true;
		}
		if( flag )
		{
			for(size_t j = 0;j <nonterminals[nterIndex].follow.size();j++)
			{
				token = nonterminals[nterIndex].follow[j];
				int terIndex = findTerIndex( vec,token );
				if( table[nterIndex][terIndex] == -1 )    
			        table[nterIndex][terIndex] = i;							
			}
		}//if
	}//for--->i
}//makeTable

int findTerIndex( vecStr vec,string str )
{
	for( int i = 0;i <(int) vec.size();i++ )
		if( vec[i] == str )
			return i;
	return -1;                           //when str == "ε" 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -