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

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

?? parse.cpp

?? 編譯原理中的First集與 Follow集生成程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*
 *	file:  parse.cpp
 */
#include <cassert>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include "Parse.h"

#define match(x) lookahead=lex.gettoken()

Parse::Parse(Lex &L,Cmd &C):lex(L),cmd(C)
      ,STARTNONT(10000),Null(-100),SHARP(0)
{
    nVns=STARTNONT;
    nVts=0;
    nRules=0;
    nSymbols=0;
    nerror=0;

    S=-1;

    insert_Vts(string("@sharp"),0,0,-1,-1);
    //Vts.push_back("@sharp");

    insert_ruler(vector<sint32>(),0,0,1);
    //P.resize(1);

    /*************/
    //of_cpp.open( (cmd.get_ifname()+"_out.cpp").c_str() );
    //if(!of_cpp)
    //{
    //    err_msg<<"打開文件 _out.cpp 錯誤.";
    //    fatal();
    //}
    //fdefine.open( "fdefine.cpp" );
    //if(!fdefine)
    //{
    //    err_msg<<"打開文件 fdefine.cpp 錯誤.";
    //    fatal();
    //}
    //faction.open( "faction.cpp" );
    //if( !faction )
    //{
    //    err_msg<<"打開文件 faction.cpp 錯誤.";
    //    fatal();
    //}


    string output(cmd.get_ifname()+".out.txt");
    foutput.open( output.c_str() );
    if(!foutput)
    {
        err_msg<<"打開文件 "<< output <<" 錯誤!請檢查錯誤原因,然后重試.";
        fatal();
    }

}

//返回非 -1 表示 str不存在于Vns中,否則返回其所在的下標
inline sint32 
Parse::isinVns(const string& str)
{   
    std::vector<std::string>::const_iterator row
        = std::find(Vns.begin(),Vns.end(),str);
    return row==Vns.end() ? -1 : ( (sint32)(row - Vns.begin())+STARTNONT );
}

inline sint32
Parse::isinVts(const string& str)
{
    std::vector<std::string>::const_iterator row
        = std::find(Vts.begin(),Vts.end(),str);
    return row==Vts.end() ? -1 : (sint32)(row - Vts.begin());
}


inline sint32
Parse::insert_Vts(const string &val, const sint32 cur_assoc,
                  const sint32 cur_prec,const sint32 unionval,
                  const sint32 number)
{
    nVts++;
    nSymbols++;
    Vts.push_back(val);
    tUnion.push_back(unionval);
    tPrec.push_back(cur_prec);
    tAssoc.push_back(cur_assoc);
    tNumVal.push_back(number);
     
    return nVts-1;
}

inline sint32
Parse::insert_Vns(const string &val,const sint32 unionval)
{
    /*
     *	檢查當前符號是否已經存在.
     */
    nVns++;
    nSymbols++;
    Vns.push_back(val);
    nontUnion.push_back(unionval);
    // 
    return nVns-1;
}

inline sint32
Parse::insert_ruler(const vector<sint32> &rule,const sint32 prec,
                    const sint32 assoc , const sint32 lineno)
{// 返回當前產生式在P中的位置.
    /*
     *	檢查當前產生式是否已經存在,如果已經存在則提示錯誤信息.
         ...沒做...
     */
    // check ...

    nRules++;
    P.push_back(rule);
    rAssoc.push_back(assoc);
    rPrec .push_back(prec);
    rline .push_back(lineno);
    return nRules - 1;
}


//spec  : defines MARK rules tail
//            ;
Void
Parse::spec()
{
    lookahead=lex.gettoken();
    defines();
    if(Lex::MARK==lookahead)
    {
        match(Lex::MARK);
        rules();
        tail();
    }
    else
    {// do errors.
        err_msg<<"規則定義缺少 '%%' 標記.";
        showErr();
    }
    if(Lex::END!=lookahead || lex.nerror+nerror > 0)
    {
        //err_msg<<"共有 "<< lex.nerror+nerror <<" 個錯誤,語法分析失敗.";
        //fatal();
        cout<<"共有 "<< lex.nerror+nerror <<" 個錯誤,語法分析失敗.";
        exit(1);
    }
}

/*
tail  : MARK eat_up_rest
| // empty (檢測,如果不是文件末尾則出錯)
;
*/
Void
Parse::tail()
{
    if(Lex::MARK==lookahead)
    {// 將剩余的部分輸出到 of_cpp 文件中.
        eat_up_rest();
    }
    else if(Lex::END!=lookahead)
    {
        err_msg<<"缺少 '%%' 標記.";
        showErr();
    }
}

Void
Parse::eat_up_rest()
{// 將文法文件的剩余部分寫入 of_cpp 的尾部.
    of_cpp<<"\n#line "<<lex.lineno<<" \""<<cmd.get_ifname()<<"\"\n";
    char buf[101];
    register uint32 count=0;
    do{
        lex.pf.get(buf,sizeof(buf)/sizeof(buf[0]),Lex::ENDOFFILE);
        count=lex.pf.gcount();
        of_cpp.write(buf,count);
    }while(sizeof(buf)/sizeof(buf[0])-1 == count);

    lookahead=0;
}

Void
Parse::eat_up_union()
{//將union的定義拷貝到變量 union_define 中 .
    static Bool once=True;
    if (!once)
    {
        err_msg<<"'%union' 多重定義.";
        showErr();
    }
    else
        once=False;

    sint32 count=0;
    sint32 c;
    while((c=lex.pf.get())!='{')
        if('\n'==c)
            lex.lineno;

    lex.pf.unget();
    union_define="";
    do{
        c=lex.pf.get();
        if('{'==c)
            ++count;
        else if('}'==c)
            --count;
        else if('\n'==c)
            ++lex.lineno;
        else if(Lex::ENDOFFILE==c)
        {
            err_msg<<"未終結的 '%union' 定義.";
            fatal();
        }
        union_define+=(char)c;
    }while(count!=0);
}

Bool
eat_up_comment(ostream & out,istream &in,uint32 &lineno, 
               const sint32 Eof=-1)
{ // 假定已經是以 '/*' 或 '//' 開頭的注釋,從下一個字符開始讀取 直到 '*/'.
    register sint32 c;

    out.put(in.get());
    c=in.get();
    out.put(c);

    if('*'==c)
    {// c's comment.
        register Bool Continue=True;
        do
        {
            while((c=in.get()) != '*' && '\n' != c
                    && Eof !=c )
                out.put(c);

            if('*'==c && (in.peek()=='/'))
                Continue=False;

            else if('\n'==c)
                ++ lineno;
            
            else if('*'==c && (in.peek()!='/'))
                ;

            else // if( Eof == c )
                return False;

            out.put(c);
            if(!Continue)
                out.put(in.get());//寫入 '/'.
        } while(Continue);
    }
    else
    {// c++'s comment. 不考慮'\' 續行.
        while( '\n'!=(c=in.get()) && Eof != c )
            out.put(c);
        if('\n'==c)
            ++ lineno;
        else
            return False;
        out.put('\n');
    }
    return True;
}

/**************************************************
*從輸入 in 中讀取從 " 到下一個 " 的內容到 out 中, *
*如果遇到行尾的 '\'續行符,則行號加1,下一行繼續當作*
*字符串處理,如果遇到 Eof 則返回 False,否則返回True*/
Bool
eat_up_string(ostream & out,istream &in,uint32 &lineno, 
              const sint32 Eof=-1)
{
    register Bool instring=True;
    register sint32 c;

    out.put(in.get()); // write '\"'

    while(instring)
    {
        while( '\"'!=(c=in.get()) && '\\'!= c 
           && '\n'!=c && Eof != c )
        {
            out.put(c);
        }
        out.put(c);

        if('\"'==c)
            instring=False;

        else if('\\'==c)
        {
            c=in.get();
            if('\"' == c || '\\'==c)    // 轉義
                out.put(c);

            else if('\n'==c) // 續行
                out.put('\n'),
                ++ lineno;

            else             // 其它
                in.unget();
        }

        else if('\n'==c)
            ++ lineno,
            instring=False;

        else // if(Eof == c)
            return False;
    } // while(instring)
    return True;
}

Void
Parse::eat_up_defs()
{// read lex.pf until '%}'
    /** 注意 字符串及注釋中的內容應該忽略 **/
    register Bool incomment=False,
             instring=False,
             Continue=True;
    ofstream &file=fdefine;
    register sint32 c;
    file<<"\n#line "<<lex.lineno<<" \""<<cmd.get_ifname()<<"\"\n";
    while(Continue)
    {
        c=lex.pf.get();
        if('/'==c)
        {
            if('/'==lex.pf.peek() || '*'==lex.pf.peek())
            {
                lex.pf.unget();
                if (!eat_up_comment(fdefine,lex.pf,lex.lineno,Lex::ENDOFFILE))
                {
                    err_msg<<"在注釋中出現錯誤.";
                    fatal();
                }
            }
            else
                fdefine.put(c);


        }
        else if('%'==c)
        {
            //file.put(c);
            if('}'!=lex.pf.peek())
                continue;
            else
                lex.pf.get(),//file.put(lex.pf.get()),
                Continue=False;
        }
        else if('\"'==c)
        { // string.
            lex.pf.unget();
            if(!eat_up_string(fdefine,lex.pf,lex.lineno,Lex::ENDOFFILE))
            {
                err_msg<<"文件非法終止.";
                fatal();
                Continue=False;
            }

        }
        else if('\n'==c)
            file.put(c),
            ++lex.lineno;
        else if(Lex::ENDOFFILE==c)
        {
            err_msg<<"未終結的 '%{' 定義.";
            fatal();
        }
        else
            file.put(c);
    }// while(Continue)
    lookahead=Lex::RCURL;
}

/*
defines: // empty
|   START    ID                 defines
|   UNION    eat_up_union       defines
|   LCURL    eat_up_defs RCURL  defines
|   TOKEN    symtype            nlist
|   LEFT     symtype            nlist
|   RIGHT    symtype            nlist
|   NANASSOC symtype            nlist
|   TYPE     symtype            nlist2
;
*/
Void
Parse::defines()
{
    register sint32 curPrec=0;  //優先級(0表示未指定優先級)
    register sint32 index;
    register Bool   Continue=True;
    string stype;               // 

    while(Continue)
    {
        Continue=True;

        switch(lookahead)
        {
        case Lex::LCURL:
            eat_up_defs();
            //Continue=True;
            match(Lex::RCURL);
            break;

        case Lex::TOKEN:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久国产一区二区三区四区小说 | 亚洲国产一区二区a毛片| 久久在线免费观看| 欧美成人一区二区三区在线观看| 4438x亚洲最大成人网| 欧美性生活大片视频| 在线看日本不卡| 色哟哟一区二区三区| 色悠久久久久综合欧美99| 91麻豆国产香蕉久久精品| 91在线精品秘密一区二区| av在线一区二区| 91黄色免费网站| 欧美日韩高清在线播放| 欧美一区二区福利在线| 久久人人爽爽爽人久久久| 国产色91在线| 亚洲女子a中天字幕| 五月天亚洲婷婷| 国产一区二区三区久久久| 国产成人免费在线观看| 99视频一区二区三区| 欧美影院一区二区| 日韩一区二区在线看片| 国产欧美日本一区视频| 亚洲三级视频在线观看| 日韩中文字幕麻豆| 国产精品91一区二区| 色欧美乱欧美15图片| 日韩西西人体444www| 国产精品久久免费看| 亚洲成人av一区| 国产精品影视在线| 在线观看91视频| 久久精品综合网| 夜夜亚洲天天久久| 国产综合色视频| 色欧美88888久久久久久影院| 欧美大片免费久久精品三p| 国产精品美女久久久久久久久 | 一本一道久久a久久精品| 欧美精品乱码久久久久久 | 97国产精品videossex| 欧美一区二区视频在线观看| 国产女主播一区| 日本午夜精品视频在线观看| 99精品欧美一区二区三区小说| 日韩免费高清av| 一区二区三区 在线观看视频| 国产麻豆午夜三级精品| 欧美色综合网站| 国产精品电影一区二区| 久久爱www久久做| 欧美视频精品在线| 一区在线观看视频| 国产激情视频一区二区三区欧美| 在线不卡的av| 亚洲一区二区三区视频在线播放| 国产成人99久久亚洲综合精品| 91精品福利在线一区二区三区| 亚洲欧洲精品天堂一级| 国产盗摄精品一区二区三区在线| 欧美日韩一区二区三区视频| 亚洲蜜臀av乱码久久精品| 不卡一区二区三区四区| 欧美精品一区二区三区在线| 日韩成人免费看| 欧美另类一区二区三区| 亚洲一区二区在线视频| 一本到高清视频免费精品| 亚洲国产精品成人综合| 国产高清在线观看免费不卡| 久久综合色婷婷| 国产一区在线观看视频| 日韩你懂的在线观看| 久热成人在线视频| 日韩欧美国产电影| 老司机一区二区| 久久综合狠狠综合久久激情| 激情国产一区二区| 精品国产乱码久久久久久免费| 久久er精品视频| 久久久亚洲欧洲日产国码αv| 久久精品久久精品| 久久免费偷拍视频| 国产盗摄女厕一区二区三区| 国产精品拍天天在线| 色综合久久天天| 午夜精品久久久久久久99樱桃| 欧美日韩高清一区二区三区| 强制捆绑调教一区二区| 欧美精品一区视频| 不卡在线观看av| 一区二区三区精品久久久| 欧美日韩不卡视频| 久久电影国产免费久久电影| 久久午夜免费电影| 色综合咪咪久久| 免费观看成人鲁鲁鲁鲁鲁视频| 久久丝袜美腿综合| 色综合久久久久综合99| 日韩福利电影在线观看| 国产日韩欧美一区二区三区乱码| 成人avav影音| 免费av成人在线| 国产精品国产三级国产普通话三级| 91国在线观看| 国产精品一品二品| 一区二区三区在线免费视频| 日韩精品一区二区三区蜜臀 | 91国偷自产一区二区开放时间| 日本一不卡视频| 国产精品久久久久久亚洲毛片 | 欧美色电影在线| 免费人成黄页网站在线一区二区| 国产精品激情偷乱一区二区∴| 欧美性一区二区| 国产一二三精品| 午夜精品爽啪视频| 国产精品久久久久精k8| 欧美成人一区二区三区| 日本黄色一区二区| 国产成人在线免费观看| 午夜激情久久久| 亚洲欧美日韩国产中文在线| 欧美白人最猛性xxxxx69交| 欧美图片一区二区三区| 国产成人三级在线观看| 久久国产精品区| 亚洲成人1区2区| 亚洲欧美另类久久久精品| 久久夜色精品一区| 欧美一区二区免费| 欧洲生活片亚洲生活在线观看| 国产成a人亚洲| 裸体歌舞表演一区二区| 亚洲成人综合在线| 亚洲女与黑人做爰| 一区二区中文字幕在线| 久久久国产精品不卡| 欧美一级日韩不卡播放免费| 欧美日韩综合不卡| 97se亚洲国产综合在线| 成人看片黄a免费看在线| 国产精品自拍在线| 国产麻豆9l精品三级站| 免费在线观看一区| 日本vs亚洲vs韩国一区三区 | 不卡一区二区在线| 国产精品影视网| 国产精品一区二区你懂的| 黄色日韩三级电影| 韩国女主播一区二区三区| 韩日精品视频一区| 国产乱色国产精品免费视频| 韩国精品免费视频| 国产成人午夜电影网| 床上的激情91.| a4yy欧美一区二区三区| 波多野结衣中文字幕一区| 99国产欧美久久久精品| 波多野结衣的一区二区三区| proumb性欧美在线观看| 91在线免费播放| 日本道免费精品一区二区三区| 91成人在线免费观看| 欧美撒尿777hd撒尿| 欧美久久一区二区| 欧美一二三区在线观看| 欧美精品一区二区三区一线天视频| 久久久99免费| 综合婷婷亚洲小说| 亚洲风情在线资源站| 久久国产三级精品| 丁香天五香天堂综合| 色综合久久99| 欧美一区二区三级| 欧美高清在线精品一区| 亚洲人成网站影音先锋播放| 亚洲va韩国va欧美va| 激情另类小说区图片区视频区| 成人美女视频在线观看| 欧美影片第一页| 精品剧情v国产在线观看在线| 国产精品免费aⅴ片在线观看| 一区二区三区在线视频观看58 | 久久精品国产久精国产爱| 国产呦萝稀缺另类资源| 在线一区二区三区四区五区| 日韩一区二区三| 亚洲欧洲成人自拍| 蜜臀久久99精品久久久久宅男| 99视频超级精品| 日韩你懂的在线播放| 亚洲色图在线播放| 国产一区二区三区日韩| 欧美午夜精品免费| 国产精品视频线看| 久久99最新地址| 91久久香蕉国产日韩欧美9色|