{"id":358,"date":"2013-11-28T23:02:20","date_gmt":"2013-11-28T15:02:20","guid":{"rendered":"http:\/\/blog.sorayuki.net\/?p=358"},"modified":"2013-11-28T23:15:14","modified_gmt":"2013-11-28T15:15:14","slug":"%e8%87%aa%e5%88%b6%e7%bc%96%e8%af%91%e5%9e%8b%e8%a1%a8%e8%be%be%e5%bc%8f%e8%ae%a1%e7%ae%97%e5%99%a8","status":"publish","type":"post","link":"https:\/\/blog.sorayuki.net\/?p=358","title":{"rendered":"\u81ea\u5236\u7f16\u8bd1\u578b\u8868\u8fbe\u5f0f\u8ba1\u7b97\u5668"},"content":{"rendered":"<p>\u8d77\u56e0\u662f\u8fd9\u4e2a\u95ee\u9898<\/p>\n<p><a href=\"http:\/\/zhidao.baidu.com\/question\/1110099820559411499.html\">http:\/\/zhidao.baidu.com\/question\/1110099820559411499.html<\/a> <\/p>\n<p>\u56e0\u4e3a\u5f53\u65f6\u6211\u7f16\u8bd1\u539f\u7406\u8bfe\u6839\u672c\u6ca1\u6709\u597d\u597d\u542c\uff0c\u6240\u4ee5\u5c31\u51b3\u5b9a\u5c1d\u8bd5\u4e00\u4e0b\u81ea\u5df1\u5199\u8fd9\u6837\u7684\u4e1c\u897f\u80fd\u5199\u6210\u4ec0\u4e48\u6837\u3002<\/p>\n<p>\u867d\u7136\u5199\u51fa\u6765\u4e86\uff0c\u4e0d\u8fc7\u8c8c\u4f3c\u6ca1\u6709\u6ee1\u8db3\uff0c\u7136\u540e\u5c31\u8fdb\u884c\u9b54\u6539\u3002<\/p>\n<p>\u4e0b\u9762\u7684\u4ee3\u7801\u662f\u9b54\u6539\u7684\u7ed3\u679c\uff0c\u80fd\u86cb\u75bc\u6210\u8fd9\u6837\uff0c\u6211\u5b9e\u5728\u65e0\u8bdd\u53ef\u8bf4\u4e86\u2026\u2026\uff08\u6b7b\u9c7c\u773c<\/p>\n<p>\u8f93\u5165\u4e00\u4e2a\u8868\u8fbe\u5f0f\uff0c\u7136\u540e\u8fd9\u4e2a\u7a0b\u5e8f\u80fd\u8ba1\u7b97\u5b83\u7684\u503c\u3002\u652f\u6301\u52a0\u51cf\u4e58\u9664\u548c\u62ec\u53f7\uff0c\u53ea\u652f\u6301\u6574\u6570\uff0c<strong><font color=\"#ff0000\">\u8868\u8fbe\u5f0f\u4e2d\u4e0d\u80fd\u542b\u6709\u7a7a\u683c<\/font><\/strong><\/p>\n<p><strong>\u6ce8\u610f\uff1a\u4e0d\u80fd\u5728\u201c\u6570\u636e\u6267\u884c\u4fdd\u62a4\uff08DEP\uff09\u201d\u73af\u5883\u4e0b\u6267\u884c\u3002VC\u94fe\u63a5\u7684\u65f6\u5019\u4e0d\u80fd\u5e26\/NXCOMPAT\u9009\u9879\uff0c\u7cfb\u7edf\u8bbe\u7f6e\u91cc\u4e5f\u4e0d\u80fd\u7528\u201c\u4e3a\u6240\u6709\u7a0b\u5e8f\u542f\u7528\u6570\u636e\u6267\u884c\u4fdd\u62a4\u201d\u3002<\/strong><\/p>\n<p><!--more--><\/p>\n<div id=\"scid:887EC618-8FBE-49a5-A908-2339AF2EC720:ff868f7c-92ca-43a6-ad89-3327f1c14b93\" class=\"wlWriterEditableSmartContent\" style=\"float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px\">         <code><\/p>\n<pre>#define _SCL_SECURE_NO_WARNINGS\n#include &lt;stdio.h&gt;\n#include &lt;vector&gt;\n#include &lt;algorithm&gt;\nusing namespace std;\n\ntypedef unsigned char uchar;\ntypedef vector&lt;uchar&gt; Buf;\ntypedef const Buf CBuf;\n\nvoid App(Buf& b, CBuf& c) {\n    b.insert(b.end(), c.begin(), c.end());\n}\nBuf Eax(int n, CBuf& c = CBuf()) {\n    Buf r(5);\n    r[0] = 0xb8;\n    copy(reinterpret_cast&lt;uchar*&gt;(&n), reinterpret_cast&lt;uchar*&gt;(&n+1), &r[1]);\n    App(r, c);\n    return r;\n}\nBuf Eax2Edx(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x8b;\n    r[1] = 0xd0;\n    App(r, c);\n    return r;\n}\nBuf Edx2Eax(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x8b;\n    r[1] = 0xc2;\n    App(r, c);\n    return r;\n}\nBuf Eax2Ecx(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x8b;\n    r[1] = 0xc8;\n    App(r, c);\n    return r;\n}\nBuf Ecx2Eax(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x8b;\n    r[1] = 0xc1;\n    App(r, c);\n    return r;\n}\nBuf Push(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0xff;\n    r[1] = 0xf0;\n    App(r, c);\n    return r;\n}\nBuf Pop(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x8f;\n    r[1] = 0xc0;\n    App(r, c);\n    return r;\n}\nBuf Add(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x03;\n    r[1] = 0xc2;\n    App(r, Push());\n    App(r, c);\n    return Pop(Eax2Edx(Pop(r)));\n}\nBuf Sub(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0x2b;\n    r[1] = 0xc2;\n    App(r, Push());\n    App(r, c);\n    return Pop(Eax2Edx(Pop(r)));\n}\nBuf Mul(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0xf7;\n    r[1] = 0xe2;\n    App(r, Push());\n    return Pop(Eax2Edx(Pop(r)));\n}\nBuf Div(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0xf7;\n    r[1] = 0xf1;\n    App(r, Push());\n    App(r, c);\n    return Eax(0, Eax2Edx(Pop(Eax2Ecx(Pop(r)))));\n}\nBuf Ret() {\n    Buf r(1);\n    r[0] = 0xc3;\n    return r;\n}\nBuf Neg(CBuf& c = CBuf()) {\n    Buf r(2);\n    r[0] = 0xf7;\n    r[1] = 0xd8;\n    App(r, Push());\n    App(r, c);\n    return Pop(r);\n}\n\nbool parseKakko(const char* &p, Buf& x);\n\nbool parseNumber(const char* &p, Buf& x) {\n    if (parseKakko(p, x)) return true;\n    \n    const char* lp = p;\n    if (*lp == '-') {\n        ++lp;\n        if (parseNumber(lp, x)) {\n            App(x, Neg());\n            p = lp;\n            return true;\n        }\n    }\n    \n    if (*lp &gt;= '0' && *lp &lt;= '9') {\n        int val = 0;\n        while(*lp &gt;= '0' && *lp &lt;= '9') {\n            val = val * 10 + (*lp - '0');\n            ++lp;\n        }\n        p = lp;\n        App(x, Eax(val, Push()));\n        return true;\n    } else {\n        return false;\n    }\n}\n\nbool parseOP1(const char* &p, char &x) {\n    if (*p == '*' || *p == '\/') {\n        x = *p;\n        ++p;\n        return true;\n    } else\n        return false;\n}\n\nbool parseOP2(const char* &p, char &x) {\n    if (*p == '+' || *p == '-') {\n        x = *p;\n        ++p;\n        return true;\n    } else\n        return false;\n}\n\nbool parseFactor(const char* &p, Buf &x) {\n    Buf lhs, rhs;\n    char op;\n    const char* lp = p;\n    if ( parseNumber(lp, lhs) ) {\n        const char* lp2 = lp;\n        while (parseOP1(lp2, op) ) {\n            if (parseNumber(lp2, rhs)) {\n                App(x, lhs);\n                App(x, rhs);\n                if (op == '*') App(x, Mul());\n                if (op == '\/') App(x, Div());\n                lp = lp2;\n                lhs.clear();\n                rhs.clear();\n            } else break;\n        }\n        App(x, lhs);\n        p = lp;\n        return true;\n    } else return false;\n}\n\nbool parseExpr(const char* &p, Buf &x) {\n    Buf lhs, rhs;\n    char op;\n    const char* lp = p;\n    \n    if (parseFactor(lp, lhs)) {\n        const char* lp2 = lp;\n        while (parseOP2(lp2, op)) {\n            if (parseFactor(lp2, rhs)) {\n                App(x, lhs);\n                App(x, rhs);\n                if (op == '+') App(x, Add());\n                if (op == '-') App(x, Sub());\n                lp = lp2;\n                lhs.clear();\n                rhs.clear();\n            } else break;\n        }\n        App(x, lhs);\n        p = lp;\n        return true;\n    } else return false;\n}\n\nbool parseKakko(const char* &p, Buf &x) {\n    const char* lp = p;\n    Buf t;\n    if (*lp == '(') {\n        ++lp;\n        if (parseExpr(lp, t)) {\n            if (*lp == ')') {\n                ++lp;\n                p = lp;\n                App(x, t);\n                return true;\n            } else return false;\n        } else return false;\n    } else return false;\n}\n\n#include &lt;stdio.h&gt;\n\nint main()\n{\n    Buf code;\n    char str[256];\n    gets(str);\n    const char* pstr = str;\n    if (parseExpr(pstr, code)) {\n        int i, l = pstr - str;\n        for(i = 0; i &lt; l; ++i)\n            putchar(' ');\n        puts(\"^ parsed until here\");\n        App(code, Pop(Ret()));\n        int (*run)() = (int (*)()) &code[0];\n        printf(\"%d\\n\", run());\n    }\n    return 0;\n}\n\n\n <\/pre>\n<p><\/code>\n      <\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u8d77\u56e0\u662f\u8fd9\u4e2a\u95ee\u9898 http:\/\/zhidao.baidu.com\/question\/11100998205594 &hellip; <a href=\"https:\/\/blog.sorayuki.net\/?p=358\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u81ea\u5236\u7f16\u8bd1\u578b\u8868\u8fbe\u5f0f\u8ba1\u7b97\u5668<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-358","post","type-post","status-publish","format-standard","hentry","category-6"],"_links":{"self":[{"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=\/wp\/v2\/posts\/358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=358"}],"version-history":[{"count":0,"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=\/wp\/v2\/posts\/358\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sorayuki.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}