📄 maketable.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 + -