• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            程序讓生活更美好

            半畝方塘 天光云影

              C++博客 ::  :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
              55 隨筆 :: 4 文章 :: 202 評論 :: 0 Trackbacks

            Lex和Yacc真不錯

            這兩天一直在忙著寫論文,論文中需要用到Lex和Yacc的一些東西,看了一些相關(guān)的資料,發(fā)現(xiàn)Lex和Yacc兩個工具還真是非常有意思的東西,有了它們做一些此法語法方面的東西還真是不錯,可以用來幫助設(shè)計編譯器了。等忙玩這一陣子之后,如果有空再上來寫一點相關(guān)的東西。

            posted on 2007-04-13 21:47 北風之神007 閱讀(5970) 評論(3)  編輯 收藏 引用 所屬分類: Other

            評論

            # re: Lex和Yacc真不錯 2007-06-14 01:40 fny
            我正在編寫一個語法分析器。目的是把像a[]c[f[]n[]]這樣的數(shù)據(jù)變換成[‘TREE',[],a] ['TREE',[ ['TREE",[],f] ['TREE',[],n] ], c]這樣的數(shù)據(jù)。也就是任意個樹形數(shù)據(jù)結(jié)構(gòu)的形式變換。目前對于只有嵌套的數(shù)據(jù)可以成功的變換,既a[], a[b[c[]]]這樣的數(shù)據(jù)。可是對于并列的數(shù)據(jù)卻無法變換,即a[]b[], a[b[]c[]]這樣的數(shù)據(jù)。請教,有沒有好的主意?  回復  更多評論
              

            # re: Lex和Yacc真不錯 2008-03-14 17:34 暗金裝備
            難度還可以,呵呵,編譯原理的時候?qū)W過,用棧可以實現(xiàn)此功能:
            第一次要先判斷整個表達的正確性,
            在此基礎(chǔ)上開始進行轉(zhuǎn)換:
            如a[b[]c[]]:
            讀入字符,壓入棧,直到遇到 [(也壓入棧),這時開始構(gòu)造:['TREE', [
            再次讀入,壓入棧,當遇到 ](不壓入棧),彈出棧頂,如果是 ],則構(gòu)造成: 
            ['TREE', [], 再次彈出棧頂,直到棧頂是[或者棧空,構(gòu)造成['TREE', [],b]

            以此類推即可,權(quán)當參考  回復  更多評論
              

            # re: Lex和Yacc真不錯 2008-03-14 17:59 暗金裝備
            #include <iostream>
            #include <cstdlib>
            #include <stack>

            /**
            * Application entry
            */
            int main(int argc, char *argv[]) {
            std::string str = "a[]b[c[f[]]d[]]";
            std::string result; // 保存結(jié)果
            std::stack<char> stack;

            stack.push('$'); // 開始的標志,可用可不用
            size_t index = 0;
            size_t length = str.size();
            for (index = 0; index < length; ++index) {
            // 如果不是],則壓入棧中
            if (str.at(index) != ']') {
            stack.push(str.at(index));

            if ('[' == str.at(index)) {
            result += "['TREE', ["; // 樹結(jié)構(gòu)的前半部分
            }
            } else { // 是],說明一個樹或者一個子樹已經(jīng)結(jié)束,那么構(gòu)造完這棵樹
            if ('$' == stack.top()) {
            break;
            }

            // 處理[時的構(gòu)造結(jié)構(gòu)
            if ('[' == stack.top()) {
            result += "], ";
            stack.pop();
            }

            // 片面是處理樹的名字,在這里用了最簡單的處理,只處理了一個字母的
            // 其實名字應(yīng)該是可以有多個字母,這時,用一個循環(huán)來解決,而且要注意
            // 的是壓入棧的,所以讀出來的時候名字是反的,所以再反過來就好了.
            result.append(1, stack.top());
            result += "]";
            stack.pop();
            }
            }

            std::cout << result << std::endl;

            return EXIT_SUCCESS;
            }

            輸出結(jié)果:
            ['TREE', [], a]['TREE', [['TREE', [['TREE', [], f]], c]['TREE', [], d]], b]  回復  更多評論
              

            久久精品视频网| 婷婷综合久久中文字幕蜜桃三电影| 久久午夜无码鲁丝片秋霞 | 国产欧美久久久精品影院| 亚洲国产成人乱码精品女人久久久不卡| 国产Av激情久久无码天堂| 99久久国产综合精品成人影院| 久久久久国产精品麻豆AR影院 | 久久精品国产99久久香蕉| 亚洲精品国产第一综合99久久| 久久综合狠狠综合久久| 国产亚洲美女精品久久久| 国产精品青草久久久久婷婷| 久久综合九色综合欧美就去吻| 热久久国产欧美一区二区精品| 精品乱码久久久久久久| 久久国产精品77777| 久久久久女人精品毛片| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲午夜精品久久久久久app| 免费精品99久久国产综合精品| 久久人人爽人人爽人人片av麻烦| 国产成人无码精品久久久免费 | 久久久久国产精品| 丰满少妇高潮惨叫久久久| 亚洲精品高清久久| 久久人人爽人人澡人人高潮AV| 午夜精品久久影院蜜桃| 国产精品99久久久精品无码| 国产成人精品综合久久久久| 999久久久免费精品国产| 国内精品久久久久影院日本| 久久国产精品久久| 伊人久久大香线蕉AV色婷婷色| 久久精品国产精品亚洲精品 | 国产成人精品三上悠亚久久| yy6080久久| 久久亚洲国产精品123区| 日本欧美久久久久免费播放网| 久久久九九有精品国产| 日韩欧美亚洲综合久久|