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

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

?? parse.cpp

?? 編譯原理中的First集與 Follow集生成程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
            match(Lex::TOKEN);

            index=symtype();

            nlist(index,0,0);
            break;

        case Lex::LEFT:
        case Lex::RIGHT:
        case Lex::NONASSOC:
            ++curPrec;          // current precedence.
            match(lookahead);

            index=symtype();

            nlist(index,lookahead,curPrec);
            break;

        case Lex::TYPE:
            match(Lex::TYPE);
            index=symtype();

            nlist2(index);
            break;

        case Lex::START:
            match(Lex::START);
            if(Lex::ID == lookahead)
            {
                index=isinVns(lex.strval);
                
                if(index == -1)
                { // 如果開始符號沒有事先定義.
                    S=insert_Vns(lex.strval,-1);
                    //nontUnion.push_back(-1);
                }
                else
                {
                    S=index;
                }

                match(Lex::ID);
            }
            else
            {//error
                err_msg<<"\"%start\"后缺少標識符.";
                fatal();
            }
            //defines();
            break;

        case Lex::UNION:
            eat_up_union();
            Continue=True;
            match(Lex::UNION);
            break;

        default:
            Continue=False;
            break;
        }//switch(lookahead)
    }// while(Continue)
}

//symtype:  /* empty */
//    |   '<' eat_up_symtype '>'
//    ;
sint32
Parse::symtype()
{ // 返回值為 -1 表明不存在 <xxx>定義.
    if('<'==lookahead)
    {// 將 "<xx>" 中的全部內容讀入stype中.
        string sval;
        sint32 index;

        register c=lex.pf.get();
        sval.clear();
        while('>'!=c && Lex::ENDOFFILE!=c)
        {
            sval+=c;
            c=lex.pf.get();
        }
        if(Lex::ENDOFFILE==c)
        {
            err_msg<<"非正常的文件結束.";
            fatal();
        }
//        if( !sval.empty() )
        // 不管 “<xx>”中是否有內容均將其插入sUnion中。
        // 因此注釋 if  判斷語句。
        { 
            vector<string>::const_iterator iter =
                 std::find(sUnion.begin(),sUnion.end(),sval);
            if( iter==sUnion.end() )
            {
                sUnion.push_back(sval);
                index=sUnion.size()-1;
            }
            else
                index=iter - sUnion.begin();
        }
        //else
        //{
        //    index = -1;
        //}
        match('<');
        return index;
    }// if
    else
        return -1;
}

//nlist : factor
//    |   factor nlist
//    |   factor ',' nlist
//    ;
//factor: ID
//    |   ID NUM       /* there has a error for TYPE */
//    |   ASC
//    |   ASC NUM
//    ;

Void
Parse::nlist(const sint32 stype , sint32 cur_assoc ,sint32 cur_prec)
{ // assoc=0 表示未指定結合率.prec=0 表示未指定優先級.
    register sint32 index;
    while(Lex::ID == lookahead || Lex::ASC == lookahead)
    {
        index=isinVts(lex.strval);
        if(-1 == index)
        {
            index = insert_Vts(lex.strval,cur_assoc,cur_prec,
                               stype,lex.numval);

            //tPrec.push_back(cur_prec);
            //tAssoc.push_back(cur_assoc);
            //tNumVal.push_back(-1); // -1 表示未指定值.
            //tUnion.push_back(stype);
        }
        else
        { // 符號重定義.
            tPrec[index]=cur_prec;
            tAssoc[index]=cur_assoc;
            //tNumVal[index]= -1;
            tUnion[index]=stype;
        }

        match(lookahead);
        if(Lex::NUM == lookahead)
        {
            tNumVal[index]=lex.numval;
            match(Lex::NUM);
        }
        if(',' == lookahead)
            match(',');

    }// while()
}

//nlist2 : factor2
//    |    factor2 nlist2
//    |    factor2 ',' nlist2
//    ;
//factor2: ID
//    |    ASC
//    ;
Void
Parse::nlist2(const sint32 stype)
{// 在%type定義中,如果出現終結符則僅給其 union值域賦值,否則作為非終結符處理.
    register sint32 index;
    if( -1 == stype )
    {
        err_msg<<"關鍵字 '%type' 后必須包含 '<xxx>' 說明.";
        showErr();
    }
    while( Lex::ID == lookahead || Lex::ASC==lookahead )
    {
        if ( Lex::ASC==lookahead )
        {
            if( (index=isinVts(lex.strval)) == -1)
                insert_Vts(lex.strval,0,0,stype,lex.numval);
            else
                tUnion[index] = stype;
        }
        else
        {
            if((index=isinVts(lex.strval)) != -1)
            { // 已定義的終結符 ID
                tUnion[index] = stype;
            }
            else
            { // 未定義的非終結符ID
                index=isinVns(lex.strval);
                if( -1 == index )
                {
                    index=insert_Vns(lex.strval,stype);
                // nontUnion.push_back(stype);
                }
                else
                {
                    nontUnion[index-STARTNONT]=stype;
                }         
            }
        }
        match(Lex::ID);
    }// while()
}

//rules : ID ':' rbodys ';' rules
//    | /* empty */
//    ;
Void
Parse::rules()
{
    register sint32 index;
    string rlval;   // the rule's left value.
    while( Lex::ID == lookahead )
    {
        rlval=lex.strval;

        match(Lex::ID);
        if( ':' == lookahead )
        {
        /* 檢查 ID 是否屬于終結符集,是則錯誤
         */
            if (isinVts(rlval)!=-1)
            {
                err_msg<<"終結符\""<<rlval<<"\"不能作為產生式左部.";
                showErr();
            }
            index = isinVns(rlval);
            if ( -1 == index )
                index = insert_Vns(rlval,-1);

            /****/
            if ( S < STARTNONT )
                S=index;
            /****/

            match(':');

            assert ( index >= STARTNONT );

            rbodys(index);

            if(';'==lookahead)
                match(';');
            else
            {
                err_msg<<"規則定義缺少 ';' .";
                showErr();
            }

        }
        else
        {   // 如果不匹配,則忽略剩余的符號直到下一個 ';'
            err_msg<<"規則定義缺少 ':' .";
            showErr();
            while( ';' != lookahead &&
                   Lex::ENDOFFILE != lookahead)
            {
                match(lookahead);
            }
            if(Lex::ENDOFFILE == lookahead)
            {
                err_msg<<"非正常的文件結束.";
                fatal();
            }
            match(';');   // read next symbol.
        }// else
    }// while
}

//rbodys: '|' rbody prec rbodys
//    |   ID  rbody prec rbodys
//    |   ASC rbody prec rbodys
//    |   '{' rbody prec rbodys
//    |   PREC      prec rbodys /* 處理由 %prec 指定優先級的空產生式.*/
//    |   ';'                   /* 處理分號前邊可能產生的空產生式*/
//    ;
Void
Parse::rbodys(const sint32 rl_ID)
{
    register Bool   Continue=True;
    register sint32 tLast;  // 每個產生式的最后一個終結符.
    register sint32 tPrecedence;  // 通過 %prec 關鍵字指定的終結符.
             sint32 thisruleno;  // 產生式所在行.
             sint32 assoc,precedence;
             Bool   FirstTime=True;

             // 是否已經存在了動作.主要用于處理 %prec ID 前邊同時
             // 進行動作說明時的沖突處理.
             Bool   IsHaveAct=False;
    while(Continue)
    {
        vector<sint32>  rule;   //識別出的規則.
        rule.push_back(rl_ID);
        thisruleno = lex.lineno;
        IsHaveAct  = False ;
        tLast      = -1;

        switch(lookahead)
        {
        case '|':

            if(True==FirstTime)
            { // expr : | ;
                insert_ruler(rule,0,0,thisruleno);
            }

            match('|');
            thisruleno=lex.lineno;
            //break;
        case Lex::ID:
        case Lex::ASC:
        case '{':

            tLast=rbody(rule,IsHaveAct);

        case Lex::PREC:

            FirstTime=False;

            tPrecedence=prec(rule,IsHaveAct);
            if( -1 == tLast )
            { // 
                assoc=0;
                precedence=0;
            }
            else
            { // 將終結符 tLast 的優先級與結合率轉移給產生式.
                assoc=tAssoc[tLast];
                precedence =tPrec [tLast];
            }
            if( -1 != tPrecedence )
            { // 如果存在 %prec 指定產生的優先級.
                // assoc=tAssoc[tPrecedence];
                precedence =tPrec [tPrecedence];
            }

            if( !IsHaveAct )
            {
                /*
                 *	如果產生沒有定義動作,在這里進行相應的處理.
                 */
            }

            insert_ruler(rule,precedence,assoc,thisruleno);
            if( ';'==lookahead )
                return;
            break;

        case ';': // 正常結束.
            
            assert(rule.size()==1);

            // 插入此空產生式.
            insert_ruler(rule,0,0,thisruleno);
            //Continue=False;
            return ;

        default:
            //err_msg<<"在規則定義中使用了不正確的符號 "<<lex.strval.c_str()<<" .";
            //fatal();

            //match(lookahead);// read next token.
            Continue=False;
            break;
        }// switch
    }// while
}

//rbody : /* empty */
//    |   ID  rbody
//    |   ASC rbody
//    |   '{' eat_act '}'           /* common action*/
//    |   '{' eat_act '}' ID  rbody /* panel action */
//    |   '{' eat_act '}' ASC rbody /* panel action */
//    |   '{' eat_act '}' '{' rbody /* panel action */
//    ;
sint32
Parse::rbody(vector<sint32> &cur_rule,Bool &IsHaveAct)
{ // 如果不存在終結符則返回 -1.
    static sint32 panel_act_num=1;
    sint32   index;
    sint32   tLast=-1;
    register Bool   Continue=True;
    
//    cur_rule.resize(1); // cur_rule[0] 已經存放產生式的左部.
    IsHaveAct=False;
    while(Continue)
    {
        switch(lookahead)
        {
        case Lex::ID:

            index=isinVts(lex.strval);
            if(-1 == index )
            {// 如果不是終結符.
                index=isinVns(lex.strval);
                if(-1 == index) // 并且不在非終結符集中.
                    index=insert_Vns(lex.strval,-1); // 則插入.
            }
            else
            {
                tLast=index;
            }
            cur_rule.push_back(index);

            match(Lex::ID);
            break;

        case Lex::ASC: // !!!! '\188' '\295' '\x33' 等進行check.
            index=isinVts(lex.strval);
            if( -1 == index )
            {
                //index=insert_Vts(lex.strval,0,0,-1,-1);
                index=insert_Vts(lex.strval,0,0,-1,lex.numval);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区一区三区| 麻豆专区一区二区三区四区五区| 在线观看成人免费视频| 免费在线看一区| 亚洲欧洲另类国产综合| 日韩亚洲欧美高清| 在线观看亚洲一区| 国产成人免费在线视频| 日本亚洲三级在线| 亚洲一区免费在线观看| 国产女同性恋一区二区| 日韩精品一区国产麻豆| 在线免费观看日韩欧美| www.日韩在线| 国产精品99久久久久久似苏梦涵| 日韩国产欧美三级| 一区二区在线观看视频在线观看| 视频一区二区三区中文字幕| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 成人av资源网站| 老司机精品视频在线| 亚洲一区二区成人在线观看| 国产精品久久久久久久久免费相片 | 亚洲欧美日韩人成在线播放| 2023国产精品视频| 欧美岛国在线观看| 91麻豆精品国产91久久久使用方法| 99久久综合精品| 成人av在线一区二区三区| 国产一区二区伦理| 精品在线播放午夜| 麻豆精品在线视频| 美女一区二区三区在线观看| 亚洲国产欧美在线| 亚洲一区二区三区中文字幕在线| 亚洲免费高清视频在线| 亚洲男人的天堂在线观看| 国产精品福利一区| 亚洲色图制服诱惑| 亚洲欧美日韩国产另类专区| 亚洲婷婷综合久久一本伊一区| 国产精品久久久一区麻豆最新章节| 国产日产欧美一区| 中文乱码免费一区二区| 亚洲国产岛国毛片在线| 国产精品久久久久久户外露出 | 成人99免费视频| 99久久免费视频.com| proumb性欧美在线观看| 97se亚洲国产综合自在线不卡| 波多野洁衣一区| 色先锋aa成人| 欧美自拍丝袜亚洲| 制服丝袜中文字幕一区| 91精品免费观看| 久久影院午夜论| 国产精品你懂的| 尤物视频一区二区| 无吗不卡中文字幕| 久久99精品视频| 国产不卡视频一区| 91麻豆免费观看| 欧美日韩久久一区二区| 欧美一区二区三区成人| 久久久无码精品亚洲日韩按摩| 中文字幕欧美三区| 有码一区二区三区| 日本不卡一二三| 国产成人av电影在线| 91丨porny丨户外露出| 91九色最新地址| 91精品国产欧美日韩| 国产欧美一区二区三区沐欲| 亚洲日韩欧美一区二区在线| 丝袜美腿亚洲综合| 91精品欧美福利在线观看| 久久精品一区四区| 亚洲另类春色国产| 日本美女视频一区二区| 国产不卡一区视频| 欧美色图激情小说| 精品噜噜噜噜久久久久久久久试看 | 天天综合色天天综合| 国产精品亚洲视频| 欧美专区日韩专区| 精品欧美一区二区在线观看| 成人欧美一区二区三区在线播放| 丝袜美腿亚洲一区| jlzzjlzz亚洲日本少妇| 欧美日韩成人激情| 中文字幕在线一区免费| 日本成人在线电影网| 成人国产精品视频| 日韩视频一区在线观看| 亚洲欧美一区二区三区极速播放| 日韩av一级片| 一本色道综合亚洲| 久久亚洲影视婷婷| 亚洲国产一区视频| 成人动漫一区二区| 精品国产网站在线观看| 一区二区三区在线播| 国产高清不卡二三区| 91精品一区二区三区久久久久久| 中文字幕一区二区三区不卡 | 亚洲国产精品嫩草影院| 高清久久久久久| 日韩欧美在线1卡| 国产98色在线|日韩| 欧美一区二区三区白人| 亚洲激情自拍偷拍| 成人免费av在线| 2023国产一二三区日本精品2022| 日韩在线一二三区| 在线精品视频一区二区三四| 国产精品理论在线观看| 国产一区二区三区av电影| 9191国产精品| 亚洲第一av色| 色先锋aa成人| 亚洲欧美日韩国产另类专区| 成人黄色片在线观看| 久久午夜羞羞影院免费观看| 奇米色777欧美一区二区| 欧美视频一区在线观看| 亚洲欧美福利一区二区| yourporn久久国产精品| 亚洲国产激情av| 福利视频网站一区二区三区| 精品精品国产高清一毛片一天堂| 奇米综合一区二区三区精品视频| 欧美影片第一页| 亚洲综合男人的天堂| 欧美在线一区二区三区| 亚洲精品国产a| 欧美羞羞免费网站| 亚洲国产美女搞黄色| 在线精品国精品国产尤物884a| 亚洲精品日日夜夜| 91官网在线免费观看| 亚洲人精品午夜| 91黄色免费看| 亚洲高清视频在线| 8v天堂国产在线一区二区| 天天综合天天做天天综合| 日韩视频免费观看高清完整版在线观看 | 国产精品免费人成网站| 成人高清伦理免费影院在线观看| 国产精品无圣光一区二区| 白白色 亚洲乱淫| 一区二区三区精品在线| 欧美日韩另类一区| 久久精品国内一区二区三区| 精品国产乱码久久久久久老虎| 国产综合色视频| 国产精品女人毛片| 色香蕉成人二区免费| 视频一区视频二区中文| 精品国产91乱码一区二区三区 | 欧美在线不卡视频| 日产国产欧美视频一区精品| 精品国产不卡一区二区三区| 成人午夜短视频| 一区二区理论电影在线观看| 91麻豆精品久久久久蜜臀| 国内精品久久久久影院色| 国产精品天美传媒沈樵| 色婷婷久久99综合精品jk白丝| 午夜精品免费在线观看| 日韩精品一区二区三区四区 | 欧美一区二区福利在线| 韩国av一区二区三区四区| 最新国产精品久久精品| 欧美精品在欧美一区二区少妇| 久久99精品久久久久婷婷| 中文字幕视频一区二区三区久| 欧美日韩一区二区在线观看| 国内精品自线一区二区三区视频| 中文字幕在线不卡一区| 91精品国产综合久久久久久久 | 午夜免费久久看| 久久久精品蜜桃| 在线精品视频免费播放| 精品一区二区在线视频| 亚洲精品美腿丝袜| 2019国产精品| 欧美日韩在线不卡| 国产在线播精品第三| 国产在线播精品第三| 洋洋av久久久久久久一区| 久久这里只有精品视频网| 欧美图片一区二区三区| 国产高清成人在线| 奇米亚洲午夜久久精品| 亚洲欧美另类图片小说| 久久久久久一二三区| 欧美老肥妇做.爰bbww视频| 不卡av电影在线播放| 久久99久久99| 舔着乳尖日韩一区|