亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 新建 文本文檔.txt

?? 從文法文件中讀入終結符、非終結符、開始符、文法
?? TXT
字號:
/*描述: 從文法文件中讀入終結符、非終結符、開始符、文法,輸出FIRSTVT集,LASTVT集和算符優先矩陣

注釋都沒寫,看以后有必要了再寫吧;)不好的編程習慣,該打#¥…—
這是〈編譯原理〉課的一道作業,已交予老師, 切莫COPY去唬弄老師哦;)
*/


#include <iostream>
#include <string>
#include <fstream>
using namespace std;

const int VN_SIZE = 10;
const int MATIX_SIZE = 80;
struct VnNode {
        char vnName;
        string firstVtSet,nextVnFirst;
        string lastVtSet,nextVnLast;
        bool hasFinded;
} Vn[ VN_SIZE ] ;

void Debug( int vnNum )
{
        cout << endl << "Debuging..." << endl;
        for ( int i=0; i<vnNum; i++ ) {
                cout << "name:" << Vn[i].vnName << "  firstVtSet:" << Vn[i].firstVtSet << "  nextVnFirst:" << Vn[i].nextVnFirst  
                         << "   lastVtSet:" << Vn[i].lastVtSet << "   nextVnLast:" << Vn[i].nextVnLast << endl;
        }
        cout << "Debug ends" << endl;
        getchar();
}
void DoWithOneLine( string & nextVn, string & vtSet,string temp )
{
        bool flag = true;
        for ( int j=3; j<temp.length(); j++ ) {
                if ( isupper(temp[j]) ) {
                        nextVn += temp[j];
                        if ( j+1 >= temp.length() ) break;
                        if ( temp[j+1] != '|' ) 
                                vtSet += temp[j+1];
                        while ( true ) {
                                if ( temp[j] == '|' ) {
                                        flag = false;
                                        break;
                                }
                                if ( j >= temp.length() ) {
                                        flag = true;
                                        break;
                                }
                                j++;
                        }
                        if (flag) break;
                        else continue;
                } else {
                        vtSet += temp[j];
                        while ( true ) {
                                if ( temp[j] == '|' || j >= temp.length() ) break;
                                j++;
                        }
                }
        }
}
void Reverse( string & s )
{
        int n = s.length();
        char t;
        for( int i=0; i<n/2; i++ ) {
                t = s[i];
                s[i] = s[n-i-1];
                s[n-i-1] = t;
        }
}
bool GetDirectSet( int & vnNum, string & vnSet, string & vtSet, char & startN, string & precept )
{
        void DoWithOneLine( string & nextVn, string & vtSet,string temp);
        void Reverse( string & s ); 
        ifstream inFile;
        string temp;
        int i;
        
        inFile.open("opg_test.txt");
        getline(inFile,temp);
        if ( temp != ";Vn" ) {
                return false;
        }
        getline(inFile,temp);
        while ( !temp.empty() ) {
                vnSet += temp;
                getline(inFile,temp);
        }
        getline(inFile,temp);
        if ( temp != ";Vt" ) {
                return false;
        }
        getline(inFile,temp);
        while ( !temp.empty() ) {
                vtSet += temp;
                getline(inFile,temp);
        }
        getline(inFile,temp);
        if ( temp != ";S" ) {
                return false;
        }
        getline(inFile, temp);
        startN = temp[0];
        inFile >> temp;
        if ( temp != ";P" ) {
                return false;
        }
        i=-1;
        while ( inFile >> temp ) {
                if ( !isupper(temp[0]) ) {
                        return false;
                }
                i++;
                Vn[i].vnName = temp[0];
                if ( temp[1] != '-' || temp[2] != '>' ) {
                        return false;
                }
                precept += temp.substr(3)+"|";
                DoWithOneLine( Vn[i].nextVnFirst,Vn[i].firstVtSet,temp );//Get directed firstvt set
                Reverse( temp=temp.substr(3) );
                temp = "   " + temp;
                DoWithOneLine( Vn[i].nextVnLast,Vn[i].lastVtSet,temp );//Get directed lastvt set
                
        }
        inFile.close();
        vnNum = i+1;
        return true;
}

void BufSort( string & a )
{
        int i,j,flag,t;
        int n = a.length();
        for ( i=0; i<n-1; i++ ) {
                flag = 0;
                for( j=0; j<n-1-i; j++ )
                        if( a[j]>a[j+1] ) {
                                t = a[j];
                                a[j] = a[j+1];
                                a[j+1] = t;
                                flag = 1;
                        }
                if ( !flag )
                        return;
        }
}

int AddVt( string & iVtSet, string jVtSet ) 
{
        bool same,hasAdd;
        int i,j;
        hasAdd = false;
        for( i=0; i<jVtSet.length(); i++ ) {
                same = false;
                for( j=0; j<iVtSet.length(); j++ ) {
                        if( iVtSet[j] == jVtSet[i] ) { same = true; break; }
                }
                if( !same ) {
                        iVtSet += jVtSet[i];
                        hasAdd = true;
                }
        }
        if( hasAdd ) return 1;
    return 0;
}
void CalculateFirstVtSet( int vnNum )
{
        int onceMore ;
        int cycleTime;
        int i,j,k;

        cycleTime = 1;
        while( cycleTime!=2 ) {
                cycleTime = 0;
                onceMore = 1;
                while( onceMore || cycleTime!=2 ) {
                        onceMore = 0;
                        for( i=0; i<vnNum; i++ ) {
                                for( j=0; j<Vn[i].nextVnFirst.length(); j++ ) {
                                        for( k=0; k<vnNum; k++ ) {
                                                if ( Vn[k].vnName == Vn[i].nextVnFirst[j] )
                                                        onceMore += AddVt( Vn[i].firstVtSet,Vn[k].firstVtSet );
                                        }
                                }
                        }
                        if( onceMore == 0 ) {
                                cycleTime++ ; 
                                //Debug( vnNum );
                        } else {
                                cycleTime = 0;
                        }
                }
        }
}
void CalculateLastVtSet( int vnNum )
{
        int onceMore ;
        int cycleTime;
        int i,j,k;

        cycleTime = 1;
        while( cycleTime!=2 ) {
                cycleTime = 0;
                onceMore = 1;
                while( onceMore || cycleTime!=2 ) {
                        onceMore = 0;
                        for( i=0; i<vnNum; i++ ) {
                                for( j=0; j<Vn[i].nextVnLast.length(); j++ ) {
                                        for( k=0; k<vnNum; k++ ) {
                                                if ( Vn[k].vnName == Vn[i].nextVnLast[j] )
                                                        onceMore += AddVt( Vn[i].lastVtSet,Vn[k].lastVtSet );
                                        }
                                }
                        }
                        if( onceMore == 0 ) {
                                cycleTime++ ; 
                                //Debug( vnNum );
                        } else {
                                cycleTime = 0;
                        }
                }
        }
}
void PrintFirstVtSet( int vnNum ) 
{
        void BufSort( string & );
        cout << endl << "該文法的FirstVtSet為:" << endl;
        for ( int i=0; i<vnNum; i++ ) {
                BufSort( Vn[i].firstVtSet ); 
                cout << Vn[i].vnName << " : " << Vn[i].firstVtSet << endl;
        }
}
void PrintLastVtSet( int vnNum ) 
{
        void BufSort( string & );
        cout << endl << "該文法的LastVtSet為:" << endl;
        for ( int i=0; i<vnNum; i++ ) {
                BufSort( Vn[i].lastVtSet ); 
                cout << Vn[i].vnName << " : " << Vn[i].lastVtSet << endl;
        }
}
int fVnPos( char vn, int vnNum ) {
        for( int i=0; i<vnNum; i++ ) {
                if ( vn == Vn[i].vnName )
                        return i;
        }
        return -1;
}
bool AnalyzeThisPiecePrecept( string pP, string vtSet, int vnNum, char matix[MATIX_SIZE][MATIX_SIZE] ) 
{
        int fVnPos( char, int );

        int i = -1 ;
        int pos;
        int vnPos;
        for(;;) {
                i++;
                if ( i+1 >= pP.length() ) break;
                if ( isupper(pP[i]) ) {
                        if ( isupper(pP[i+1]) ) return false;
                        pos = vtSet.find(pP[i+1]);
                        if ( (vnPos = fVnPos(pP[i],vnNum)) == -1 )  return false;
                        for ( int k=0; k<Vn[vnPos].lastVtSet.length(); k++ ) {
                                if ( matix[ vtSet.find( Vn[vnPos].lastVtSet[k] ) ][pos] == ' ' || matix[ vtSet.find( Vn[vnPos].lastVtSet[k] ) ][pos] == 'G'  )
                                        matix[ vtSet.find( Vn[vnPos].lastVtSet[k] ) ][pos] = 'G';
                                else return false;
                        }
                } else {
                        pos = vtSet.find(pP[i]);
                        if ( isupper( pP[i+1] ) ) {                                
                                if ( (vnPos = fVnPos(pP[i+1],vnNum)) == -1 )  return false;
                                for ( int k=0; k<Vn[vnPos].firstVtSet.length(); k++ ) {
                                        if ( matix[pos][ vtSet.find( Vn[vnPos].firstVtSet[k] ) ] == ' ' || matix[pos][ vtSet.find( Vn[vnPos].firstVtSet[k] ) ] =='L' )
                                                matix[pos][ vtSet.find( Vn[vnPos].firstVtSet[k] ) ] = 'L';
                                        else return false;
                                }
                        } else {
                                if ( matix[pos][vtSet.find(pP[i+1])] == ' ' || matix[pos][vtSet.find(pP[i+1])] == 'E' )
                                        matix[vtSet.find(pP[i])][vtSet.find(pP[i+1])] = 'E';
                                else return false;
                        }
                        if ( i+2 < pP.length() && !isupper(pP[i+2]) ) {
                                if ( matix[pos][vtSet.find(pP[i+2])] == ' ' || matix[pos][vtSet.find(pP[i+2])] == 'E' )
                                        matix[pos][vtSet.find(pP[i+2])] = 'E';
                                else return false;
                        }

                }
                
        }
        return true;
}
bool MakePriorityMatrix( string precept,  string vtSet, int vnNum, char matix[MATIX_SIZE][MATIX_SIZE] ) 
{
        bool AnalyzeThisPiecePrecept( string pP, string vtSet, int vnNum, char matix[MATIX_SIZE][MATIX_SIZE] );
        int i,j;
        for ( i=0, j=0; i<precept.length(); i++ ) {
                if ( precept[i] == '|' ) {
                        if ( i-j>1 ) {
                                if ( !AnalyzeThisPiecePrecept( precept.substr(j,i-j), vtSet, vnNum, matix ) )
                                        return false;
                        }
                        j = i+1;
                }
        }
        if ( i-j>1 ) {
                if ( !AnalyzeThisPiecePrecept( precept.substr(j,i-j), vtSet, vnNum, matix ) )
                        return false;
        }
        return true;
}
void PrintPriorityMatix( string vtSet, char matix[MATIX_SIZE][MATIX_SIZE] ) 
{
        cout << "\n★:優于 ☆:低于 ◎:同級" << endl << "  | ";
        for( int m=0; m<vtSet.length() ; m++ ) {
                cout << vtSet[m] << "   " ;
        }
        for( m=0; m<vtSet.length(); m++ ) {
                cout << endl << vtSet[m] << " | ";
                for( int n=0; n<vtSet.length(); n++ ) {
                        switch ( matix[m][n] ) {//★◎☆
                        case 'G': cout << "★  "; break;
                        case 'L': cout << "☆  "; break;
                        case 'E': cout << "◎  "; break;
                        default:  cout << "    ";  
                        }
                }

        }
}
int main()
{
        bool GetDirectSet( int &, string &, string &, char &, string & precept );
        void Debug( int );
        void CalculateFirstVtSet( int );
        void CalculateLastVtSet( int );
        void PrintFirstVtSet( int vnNum );
        void PrintLastVtSet( int vnNum );
        bool MakePriorityMatix( string , string, int, char matix[MATIX_SIZE][MATIX_SIZE] );
        void PrintPriorityMatix( string vtSet, char matix[MATIX_SIZE][MATIX_SIZE] ) ;

        int vnNum = 0;
        string vnSet,vtSet;
        string precept;
        char startN;

        char matix[MATIX_SIZE][MATIX_SIZE];
        for( int mm = 0; mm < MATIX_SIZE; mm ++ ) {
                for ( int nn = 0; nn < MATIX_SIZE; nn ++ ) {
                        matix[ mm ][ nn ] = ' ';
                }                        
        }


        if ( !GetDirectSet( vnNum, vnSet, vtSet, startN, precept ) ) {
                cerr << endl << "文法文件出錯!程序退出!" << endl;
                return -1;
        }
        CalculateFirstVtSet( vnNum );
        CalculateLastVtSet( vnNum );
        PrintFirstVtSet( vnNum );
        PrintLastVtSet( vnNum );

        getchar();
        
        //cout << vnSet << endl << vtSet << endl << startN << endl << precept << endl;
        BufSort ( vtSet );
        vtSet += '#';
        precept += '#';
        precept += startN;
        precept += '#';
        
        if ( !MakePriorityMatrix( precept, vtSet, vnNum, matix ) ) {
                cerr << endl << "該文法非算符優先文法,不能生成算符優先矩陣!" ;
                getchar();
                return -1;
        }

        PrintPriorityMatix( vtSet, matix ) ;
        
        getchar();
                
        return 0;
}

還須在相同文件夾下建立文件:opg_test.txt
內容為:(例)
;Vn
R
S
P
D

;Vt
(
)
;
i

;S
S

;P
S->D(R)
R->R;P|P
P->S|i
D->i

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品影视av免费| 日韩精品乱码免费| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 成人看片黄a免费看在线| 蜜臀精品一区二区三区在线观看| 亚洲国产精品欧美一二99| 亚洲欧洲日韩综合一区二区| 国产精品久久久久aaaa樱花 | 亚洲成人黄色小说| 亚洲一区二区av电影| 亚洲午夜视频在线| 日韩电影一区二区三区四区| 日本在线不卡视频| 精品一区二区免费视频| 成人天堂资源www在线| 粉嫩绯色av一区二区在线观看| 国产a视频精品免费观看| 成人国产精品免费网站| 91麻豆国产福利精品| 欧美在线不卡一区| 日韩视频一区二区三区| 国产日产精品一区| 一区二区激情小说| 日本不卡视频一二三区| 国产麻豆精品久久一二三| 成人免费看黄yyy456| 欧美性受xxxx黑人xyx| 日韩西西人体444www| 国产欧美一区二区精品仙草咪| 国产精品福利在线播放| 亚洲国产sm捆绑调教视频| 久久不见久久见免费视频1| 国产精品 欧美精品| 欧美伊人精品成人久久综合97| 日韩欧美亚洲国产另类| 中文字幕亚洲综合久久菠萝蜜| 亚洲夂夂婷婷色拍ww47| 国产一区二区三区黄视频| 99国产欧美久久久精品| 日韩一区和二区| 中文字幕一区不卡| 国产一区二区三区最好精华液| 色哟哟国产精品| 精品美女在线观看| 一级日本不卡的影视| 国产在线视频不卡二| 欧美日韩一卡二卡| 亚洲国产精品精华液2区45| 亚洲不卡av一区二区三区| 国产v综合v亚洲欧| 日韩久久久精品| 亚洲国产日韩a在线播放性色| 国产不卡视频在线观看| 日韩欧美第一区| 亚洲高清免费观看高清完整版在线观看| 激情深爱一区二区| 91精品国产品国语在线不卡| 亚洲天堂精品在线观看| 丁香天五香天堂综合| 26uuu另类欧美| 另类小说视频一区二区| 91精品国产综合久久蜜臀| 一区二区三区波多野结衣在线观看| 国产91精品久久久久久久网曝门| 欧美一个色资源| 日本不卡一区二区| 91麻豆精品国产无毒不卡在线观看| 亚洲视频网在线直播| 成人av集中营| 国产精品丝袜黑色高跟| 国产成人免费9x9x人网站视频| 日韩欧美色电影| 捆绑调教美女网站视频一区| 欧美日韩mp4| 性感美女久久精品| 欧美区视频在线观看| 午夜影视日本亚洲欧洲精品| 欧洲精品视频在线观看| 亚洲欧美福利一区二区| 一本到一区二区三区| 亚洲精品伦理在线| 色成人在线视频| 亚洲图片一区二区| 欧美日韩高清影院| 麻豆久久久久久久| 精品国产免费一区二区三区四区 | 国产91精品一区二区麻豆网站| 国产亚洲人成网站| av高清不卡在线| 亚洲色图在线视频| 欧美日韩在线播放| 蜜桃精品在线观看| 国产欧美日韩在线| 色噜噜久久综合| 亚洲va韩国va欧美va| 精品久久久久久久久久久久久久久久久 | 久久综合色婷婷| 不卡的av中国片| 一区二区三区国产精华| 日韩一区二区精品在线观看| 国产一区亚洲一区| 亚洲色图都市小说| 555www色欧美视频| 国产精品自产自拍| 亚洲精品福利视频网站| 日韩一区二区三区四区| 国产69精品久久久久毛片| 最新久久zyz资源站| 欧美日产在线观看| 国产mv日韩mv欧美| 性做久久久久久久久| 国产日韩综合av| 欧美日韩国产大片| 国产+成+人+亚洲欧洲自线| 亚洲综合av网| 久久一留热品黄| 在线观看91视频| 国产麻豆精品theporn| 亚洲一线二线三线视频| 久久久美女艺术照精彩视频福利播放| 91在线视频官网| 蜜臀久久99精品久久久画质超高清 | 亚洲激情在线播放| 久久夜色精品国产欧美乱极品| 欧美日韩综合色| 成人av中文字幕| 九色|91porny| 午夜伊人狠狠久久| 亚洲视频 欧洲视频| 久久青草欧美一区二区三区| 欧美日韩色综合| 91免费版pro下载短视频| 狠狠色丁香久久婷婷综| 天天综合网 天天综合色| 国产精品激情偷乱一区二区∴| 精品国产乱码久久久久久1区2区 | 亚洲午夜三级在线| 日韩毛片在线免费观看| 久久精品日韩一区二区三区| 91精品在线观看入口| 欧美在线观看视频一区二区三区| 成人动漫av在线| 国产成人免费9x9x人网站视频| 美女一区二区三区| 香蕉av福利精品导航| 亚洲国产日韩在线一区模特| 一区二区三区在线视频免费| 欧美日韩亚洲综合| 欧美日韩高清一区二区| 欧美日韩国产中文| 欧美日韩午夜在线视频| 欧美日韩你懂得| 欧美色成人综合| 欧美亚一区二区| 欧美精品自拍偷拍动漫精品| 欧美日韩精品一区视频| 欧美日韩精品欧美日韩精品| 日本丰满少妇一区二区三区| 日本韩国欧美一区| 欧美色窝79yyyycom| 欧美男女性生活在线直播观看| 欧美日韩三级一区二区| 日韩一区二区在线看片| 久久婷婷综合激情| 欧美国产精品专区| 亚洲日本成人在线观看| 亚洲免费观看高清完整| 亚洲网友自拍偷拍| 日本大胆欧美人术艺术动态| 精品无人码麻豆乱码1区2区| 国产一区二区在线电影| zzijzzij亚洲日本少妇熟睡| 色拍拍在线精品视频8848| 欧美日韩一级二级| 久久人人97超碰com| 国产精品视频免费看| 亚洲色图视频网站| 免费精品视频在线| 国产激情视频一区二区在线观看| aaa欧美日韩| 欧美精选一区二区| 国产日韩欧美综合在线| 亚洲激情综合网| 国产呦萝稀缺另类资源| 一本色道久久综合亚洲91| 日韩一区二区三| 日韩码欧中文字| 秋霞av亚洲一区二区三| 国产一区二区视频在线| 色狠狠色狠狠综合| 日韩欧美一区二区视频| 中文子幕无线码一区tr| 一区二区三区欧美激情| 激情图区综合网| 欧美性三三影院| 国产日韩欧美a| 三级久久三级久久久| 北岛玲一区二区三区四区| 日韩视频免费观看高清完整版在线观看 | 国产亚洲美州欧州综合国|