QT窗口实现的算符优先文法展示
roninwz的代码为基础修改的,自身仅仅加了QT的图形化界面
写的不好请多担待,如有侵权立刻删除
ui界面建一个窗口和四个tablewight
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include<string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <cctype>
#define MAX 507
using namespace std;
QString ssss[10];
class WF
{
public:
string left;
vector<string> right;
WF ( const string& str )
{
left = str;
}
void insert ( char str[] )
{
right.push_back(str);
}
void print (int i )
{
printf ( "%s->%s" , left.c_str() , right[0].c_str() );
for ( int i = 1 ; i < right.size() ; i++ )
printf ( "|%s" , right[i].c_str() );
puts("");
ssss[i]=QString(left.c_str())+"->"+QString(right[0].c_str())+"|";
// printf ( "%s->%s" , left.c_str() , right[0].c_str() );
string s="";
for ( int i = 1 ; i < right.size() ; i++ )
{
s=s+right[i].c_str();
}
// printf ( "|%s" , right[i].c_str() );
// puts("");
ssss[i]=ssss[i]+QString::fromStdString(s);
}
};
char relation[MAX][MAX];
vector<char> VT;
vector<WF> VN_set;
map<string,int> VN_dic;
set<char> first[MAX];
set<char> last[MAX];
int used[MAX];
int vis[MAX];
int n=8;
char k[MAX][MAX];
//k[3][]={"F->R*T","F->R-T","F->R+T"};
void dfs ( int x )
{
if ( vis[x] ) return;
vis[x] = 1;
string& left = VN_set[x].left;
for ( int i = 0 ; i < VN_set[x].right.size() ; i++ )
{
string& str = VN_set[x].right[i];
if ( isupper(str[0]) )
{
int y = VN_dic[str.substr(0,1)]-1;
if ( str.length() > 1 && !isupper(str[1] ) )
first[x].insert ( str[1] );
dfs ( y );
set<char>::iterator it = first[y].begin();
for ( ; it!= first[y].end() ; it++ )
first[x].insert ( *it );
}
else
first[x].insert ( str[0] );
}
}
void make_first ( )
{
memset ( vis , 0 , sizeof ( vis ) );
for ( int i = 0 ; i < VN_set.size() ; i++ )
if ( vis[i] ) continue;
else dfs ( i );
#define DEBUG
#ifdef DEBUG
puts("------------FIRSTVT集-------------------");
for ( int i = 0 ; i < VN_set.size() ; i++ )
{
printf ( "%s : " , VN_set[i].left.c_str() );
set<char>::iterator it = first[i].begin();
for ( ; it!= first[i].end() ; it++ )
printf ( "%c " , *it );
puts ("" );
}
#endif
}
void dfs1 ( int x )
{
if ( vis[x] ) return;
vis[x] = 1;
string& left = VN_set[x].left;
for ( int i = 0 ; i < VN_set[x].right.size() ; i++ )
{
string& str = VN_set[x].right[i];
int n = str.length() -1;
if ( isupper(str[n] ) )
{
int y = VN_dic[str.substr(n,1)]-1;
if ( str.length() > 1 && !isupper(str[n-1]) )
last[x].insert ( str[1] );
dfs1 ( y );
set<char>::iterator it = last[y].begin();
for ( ; it != last[y].end() ; it++ )
last[x].insert ( *it );
}
else
last[x].insert ( str[n] );
}
}
void make_last ( )
{
memset ( vis , 0 , sizeof ( vis ) );
for ( int i = 0 ; i < VN_set.size() ; i++ )
if ( vis[i] ) continue;
else dfs1 ( i );
#define DEBUG
#ifdef DEBUG
puts("--------------LASTVT集---------------------");
for ( int i = 0 ; i < VN_set.size() ; i++ )
{
printf ( "%s : " , VN_set[i].left.c_str() );
set<char>::iterator it = last[i].begin();
for ( ; it!= last[i].end() ; it++ )
printf ( "%c " , *it );
puts ("" );
}
#endif
}
void make_table ( )
{
for ( int i = 0 ; i < MAX ; i++ )
for ( int j = 0 ; j < MAX ; j++ )
relation[i][j] = ' ';
for ( int i = 0 ; i < VN_set.size() ; i++ )
for ( int j = 0 ; j < VN_set[i].right.size() ; j++ )
{
string& str = VN_set[i].right[j];
for ( int k = 0 ; k < str.length()-1 ; k++ )
{
if ( !isupper(str[k]) && !isupper(str[k+1]) )
relation[str[k]][str[k+1]] = '=';
if ( !isupper(str[k]) && isupper(str[k+1]) )
{
int x = VN_dic[str.substr(k+1,1)]-1;
set<char>::iterator it = first[x].begin();
for ( ; it != first[x].end() ; it++ )
relation[str[k]][*it] = '<';
}
if ( isupper(str[k]) && !isupper(str[k+1]) )
{
int x = VN_dic[str.substr(k,1)]-1;
set<char>::iterator it = last[x].begin();
for ( ; it != last[x].end() ; it++ )
relation[*it][str[k+1]] = '>';
}
if ( k > str.length()-2 ) continue;
if ( !isupper(str[k]) && !isupper(str[k+2]) && isupper(str[k+1]) )
relation[str[k]][str[k+2]] = '=';
}
}
#define DEBUG
#ifdef DEBUG
puts("");
printf ( "|%8s|" , "" );
for ( int i = 0 ; i < VT.size() ; i++ )
printf ( "%5c%5s" , VT[i] , "|" );
puts ("");
for ( int i = 0 ; i < (VT.size()+1)*10 ; i++ )
printf ("-");
puts("");
for ( int i = 0 ; i < VT.size() ; i++ )
{
printf ( "|%4c%5s" , VT[i] , "|");
for ( int j = 0 ; j < VT.size() ; j++ )
printf ( "%5c%5s" , relation[VT[i]][VT[j]] , "|" );
puts ("");
for ( int i = 0 ; i < (VT.size()+1)*10 ; i++ )
printf ("-");
puts("");
}
#endif
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
ui->tableWidget_4->setColumnCount(10);
ui->tableWidget_3->setColumnCount(4);
ui->tableWidget->setColumnCount(6);
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"文法");
char s[MAX];
strcpy(k[0],"E->E+T");
strcpy(k[1],"E->T");
strcpy(k[2],"T->T*F");
strcpy(k[3],"T->F");
strcpy(k[4],"F->P^F");
strcpy(k[5],"F->P");
strcpy(k[6],"P->(E)");
strcpy(k[7],"P->i");
memset ( used , 0 , sizeof ( used ) );
for ( int i = 0 ; i < n ; i++ )
{
for(int o=0;o<MAX;o++)
{
if(k[i][o]!='/0')
s[o]=k[i][o];
}
int len = strlen(s),j;
for ( j = 0 ; j < len ; j++ )
if ( s[j] == '-' )
break;
s[j] = 0;
if ( !VN_dic[s] )
{
VN_set.push_back ( WF(s) );
VN_dic[s] = VN_set.size();
}
int x = VN_dic[s]-1;
VN_set[x].insert ( s+j+2 );
for ( int k = 0 ; k < j; k++ )
if ( !isupper(s[k] ) )
{
if ( used[s[k]] ) continue;
used[s[k]] = 1;
VT.push_back ( s[k] );
}
for ( int k = j+2 ; k < len; k++ )
if ( !isupper(s[k] ) )
{
if ( used[s[k]] ) continue;
VT.push_back ( s[k] );
used[s[k]] = VT.size();
}
}
#define DEBUG
#ifdef DEBUG
ui->tableWidget_2->setColumnCount(8);
ui->tableWidget_2->setHorizontalHeaderLabels(QStringList()<<"终结符"<<"FIRSTVT集");
ui->tableWidget_3->setHorizontalHeaderLabels(QStringList()<<"终结符"<<"LASTVT集");
int RowCont;
RowCont=ui->tableWidget->rowCount();
ui->tableWidget->insertRow(RowCont);//增加一行
// puts ("************VT集*******************");
string ss1="2";
for ( int i = 0 ; i < VT.size() ; i++ )
{
ss1=ss1+VT[i];
ss1=ss1+" ";
// printf ( "%c " , VT[i] );
}
RowCont=ui->tableWidget->rowCount();
ui->tableWidget->setItem(RowCont,1,new QTableWidgetItem(QString::fromStdString(ss1)));
// puts ("");
// puts("*************产生式*****************");
for ( int i = 0 ; i < VN_set.size() ; i++ )
{
// VN_set[i].print();
// ss=VN_set[i].print();
//printf ( "%c " , VT[i] );
VN_set[i].print(i);
int RowCont;
RowCont=ui->tableWidget->rowCount();
ui->tableWidget->insertRow(RowCont);//增加一行
ui->tableWidget->setItem(RowCont,1,new QTableWidgetItem(ssss[i]));
}
// #endif
//puts("************************************");
#endif
memset ( vis , 0 , sizeof ( vis ) );
for ( int i = 0 ; i < VN_set.size() ; i++ )
if ( vis[i] ) continue;
else dfs ( i );
#define DEBUG
#ifdef DEBUG
// puts("------------FIRSTVT集-------------------");
RowCont=ui->tableWidget_2->rowCount();
for ( int i = 0 ; i < VN_set.size() ; i++ )
{
printf ( "%s : " , VN_set[i].left.c_str() );
RowCont=ui->tableWidget_2->rowCount();
ui->tableWidget_2->insertRow(RowCont);//增加一行
ui->tableWidget_2->setItem(RowCont,0,new QTableWidgetItem(QString(VN_set[i].left.c_str())));
set<char>::iterator it = first[i].begin();
string s1="";
for ( ; it!= first[i].end() ; it++ )
// printf ( "%c " , *it );
{
s1=s1+*it;
s1=s1+" ";
}
ui->tableWidget_2->setItem(RowCont,1,new QTableWidgetItem(QString::fromStdString(s1)));
}
#endif
memset ( vis , 0 , sizeof ( vis ) );
for ( int i = 0 ; i < VN_set.size() ; i++ )
if ( vis[i] ) continue;
else dfs1 ( i );
#define DEBUG
#ifdef DEBUG
// puts("--------------LASTVT集---------------------");
for ( int i = 0 ; i < VN_set.size() ; i++ )
{
/* printf ( "%s : " , VN_set[i].left.c_str() );
set<char>::iterator it = last[i].begin();
for ( ; it!= last[i].end() ; it++ )
printf ( "%c " , *it );
puts ("" );*/
printf ( "%s : " , VN_set[i].left.c_str() );
RowCont=ui->tableWidget_3->rowCount();
ui->tableWidget_3->insertRow(RowCont);//增加一行
ui->tableWidget_3->setItem(RowCont,0,new QTableWidgetItem(QString(VN_set[i].left.c_str())));
set<char>::iterator it = last[i].begin();
string s1="";
for ( ; it!= last[i].end() ; it++ )
// printf ( "%c " , *it );
{
s1=s1+*it;
s1=s1+" ";
}
ui->tableWidget_3->setItem(RowCont,1,new QTableWidgetItem(QString::fromStdString(s1)));
}
#endif
for ( int i = 0 ; i < MAX ; i++ )
for ( int j = 0 ; j < MAX ; j++ )
relation[i][j] = ' ';
for ( int i = 0 ; i < VN_set.size() ; i++ )
for ( int j = 0 ; j < VN_set[i].right.size() ; j++ )
{
string& str = VN_set[i].right[j];
for ( int k = 0 ; k < str.length()-1 ; k++ )
{
if ( !isupper(str[k]) && !isupper(str[k+1]) )
relation[str[k]][str[k+1]] = '=';
if ( !isupper(str[k]) && isupper(str[k+1]) )
{
int x = VN_dic[str.substr(k+1,1)]-1;
set<char>::iterator it = first[x].begin();
for ( ; it != first[x].end() ; it++ )
relation[str[k]][*it] = '<';
}
if ( isupper(str[k]) && !isupper(str[k+1]) )
{
int x = VN_dic[str.substr(k,1)]-1;
set<char>::iterator it = last[x].begin();
for ( ; it != last[x].end() ; it++ )
relation[*it][str[k+1]] = '>';
}
if ( k > str.length()-2 ) continue;
if ( !isupper(str[k]) && !isupper(str[k+2]) && isupper(str[k+1]) )
relation[str[k]][str[k+2]] = '=';
}
}
#define DEBUG
#ifdef DEBUG
puts("");
printf ( "|%8s|" , "" );
int RowCont1;
RowCont1=ui->tableWidget_4->rowCount();
ui->tableWidget_4->insertRow(RowCont1);//增加一行
ui->tableWidget_4->setItem(RowCont1,0,new QTableWidgetItem(" "));
for ( int i = 0 ; i < VT.size() ; i++ )
// printf ( "%5c%5s" , VT[i] , "|" );
{
string s1="";
s1=s1+VT[i];
ui->tableWidget_4->setItem(RowCont1,i+1,new QTableWidgetItem(QString::fromStdString(s1)));
}
puts ("");
puts("");
for ( int i = 0 ; i < VT.size() ; i++ )
{
int RowCont;
string s1="";
s1=s1+VT[i];
RowCont=ui->tableWidget_4->rowCount();
ui->tableWidget_4->insertRow(RowCont);//增加一行
ui->tableWidget_4->setItem(RowCont,0,new QTableWidgetItem(QString::fromStdString(s1)));
//printf ( "|%4c%5s" , VT[i] , "|");
for ( int j = 0 ; j < VT.size() ; j++ )
// printf ( "%5c%5s" , relation[VT[i]][VT[j]] , "|" );
{
string s1="";
s1=s1+ relation[VT[i]][VT[j]];
ui->tableWidget_4->setItem(RowCont,j+1,new QTableWidgetItem(QString::fromStdString(s1)));
}
}
#endif
}