亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美视频在线一区| 中文在线一区二区| 2020国产精品| 亚洲欧美另类小说视频| 日本午夜一本久久久综合| 国产69精品久久久久毛片| 欧美丰满美乳xxx高潮www| 欧美韩国日本不卡| 精品在线亚洲视频| 国产欧美日韩综合精品一区二区| 亚洲欧洲av一区二区三区久久| 日韩中文字幕亚洲一区二区va在线 | 美女视频免费一区| 91蜜桃在线观看| 国产丝袜美腿一区二区三区| 亚洲va韩国va欧美va精品| 成人黄色网址在线观看| 久久久久久免费网| 麻豆精品一区二区综合av| 欧美三级在线播放| 亚洲精品视频一区二区| 99这里只有精品| 国产精品色哟哟网站| 国产美女精品人人做人人爽| 666欧美在线视频| 午夜激情久久久| 欧美三级韩国三级日本三斤| 亚洲乱码精品一二三四区日韩在线 | 色综合天天综合| 国产精品剧情在线亚洲| 懂色av中文字幕一区二区三区 | 欧美一区二区三区免费视频| 亚洲成a人在线观看| 色偷偷久久人人79超碰人人澡| 亚洲欧洲日产国产综合网| 91小视频在线免费看| 亚洲精品综合在线| 欧美性一二三区| 日韩电影在线观看电影| 91精品国产欧美一区二区成人| 石原莉奈在线亚洲二区| 日韩午夜中文字幕| 精品一区二区在线视频| 久久精品在这里| 成人av在线一区二区| 1区2区3区精品视频| 色天天综合久久久久综合片| 亚洲精品老司机| 91精选在线观看| 久久91精品国产91久久小草| 亚洲第一狼人社区| 9191国产精品| 国内精品视频666| 国产精品美女一区二区三区| 91女人视频在线观看| 亚洲成a人片在线不卡一二三区| 这里只有精品电影| 精品系列免费在线观看| 国产精品久久久久久一区二区三区| 91亚洲精品乱码久久久久久蜜桃| 亚洲综合一二区| 日韩网站在线看片你懂的| 国产超碰在线一区| 亚洲国产你懂的| 欧美精品一区二区三区一线天视频| 成人激情午夜影院| 三级精品在线观看| 国产农村妇女精品| 欧美日韩美女一区二区| 韩国精品久久久| 亚洲精品一二三| 日韩欧美国产系列| 97久久超碰国产精品| 日韩国产欧美在线播放| 国产精品入口麻豆原神| 欧美人xxxx| 成人黄色777网| 久久精品国产亚洲a| **性色生活片久久毛片| 欧美大片日本大片免费观看| 99久免费精品视频在线观看| 麻豆91在线播放| 亚洲精品免费一二三区| 久久久久国产精品麻豆| 欧美综合天天夜夜久久| 国产精品18久久久久久久网站| 亚洲国产美女搞黄色| 蜜桃久久av一区| 亚洲欧美经典视频| 久久亚洲二区三区| 91精品国产免费| 色乱码一区二区三区88| 成人丝袜18视频在线观看| 久久精品国产精品亚洲红杏| 亚洲一级二级在线| 亚洲视频每日更新| 国产精品五月天| 久久麻豆一区二区| 日韩限制级电影在线观看| 在线视频观看一区| 波多野洁衣一区| 丁香亚洲综合激情啪啪综合| 久久99精品久久久久久国产越南 | 精品国一区二区三区| 欧美精品第1页| 欧美在线高清视频| 色综合中文字幕国产| 国产酒店精品激情| 精东粉嫩av免费一区二区三区| 亚洲电影一区二区| 一区二区三区日韩欧美精品| 亚洲日本护士毛茸茸| 中文字幕一区二区不卡| 中文字幕精品三区| 国产精品高潮久久久久无| 亚洲国产精品av| 国产精品三级电影| 中文字幕一区av| 国产精品看片你懂得| 亚洲欧美在线观看| 亚洲蜜臀av乱码久久精品| 亚洲精品日产精品乱码不卡| 亚洲精品国久久99热| 亚洲美女电影在线| 亚洲小少妇裸体bbw| 亚洲成人精品在线观看| 日韩经典一区二区| 久久成人免费日本黄色| 国产一区二区免费视频| 成人教育av在线| 91在线视频播放地址| 欧美综合天天夜夜久久| 欧美电影一区二区| 久久亚洲一区二区三区四区| 亚洲国产精品ⅴa在线观看| 亚洲色图欧美偷拍| 亚洲成av人片一区二区梦乃| 蜜臀99久久精品久久久久久软件| 韩国欧美国产1区| 99r国产精品| 久久久www免费人成精品| 国产精品久久福利| 亚洲123区在线观看| 另类综合日韩欧美亚洲| 成人自拍视频在线观看| 91久久精品午夜一区二区| 91麻豆精品国产91久久久久久| 精品国产在天天线2019| 亚洲日本在线看| 秋霞国产午夜精品免费视频| 国产精品一二三区在线| 欧美在线观看一区| 精品区一区二区| 一区二区三区中文免费| 久久精品国产精品亚洲综合| 一本一道久久a久久精品综合蜜臀| 欧美久久久影院| 日本一区二区三区久久久久久久久不 | 亚洲欧洲韩国日本视频| 丝袜亚洲另类欧美| 成人丝袜视频网| 91精品国产全国免费观看 | 久久先锋影音av鲁色资源网| 1区2区3区欧美| 韩国一区二区在线观看| 欧洲精品一区二区| 国产精品污污网站在线观看| 日本麻豆一区二区三区视频| 99久免费精品视频在线观看| 精品欧美黑人一区二区三区| 一区二区三区四区不卡在线| 国产精品资源在线| 欧美一区二区免费观在线| 中文字幕制服丝袜成人av| 精品制服美女久久| 欧美日韩不卡一区二区| 亚洲婷婷在线视频| 国产一区二区成人久久免费影院| 6080亚洲精品一区二区| 一区二区三区在线观看视频| 成人国产精品免费观看视频| 欧美精品一区二区三区视频| 日韩和的一区二区| 欧洲精品一区二区三区在线观看| 国产精品色眯眯| 国产精品香蕉一区二区三区| 欧美一区二区三区性视频| 亚洲一线二线三线久久久| 成人高清免费观看| 国产亚洲精品bt天堂精选| 蜜臀久久99精品久久久久久9| 欧美日韩另类一区| 亚洲影院理伦片| 在线免费亚洲电影| 亚洲美女免费在线| 91国在线观看| 亚洲自拍偷拍麻豆| 91无套直看片红桃| 亚洲毛片av在线| 欧美午夜在线观看|