QT窗口上的算符优先文法

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
 
 
 
 
 
}
 
 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值