三目表达式

const char* content = R"(
    void Fubame(){
//int a = (3>4) ? 200:100;
    int a = ((3>4)? 200:100)    ?(3>4? 300:100):3400;
    int b = 3>4 ? 400:100;
    }
)";

    std::string dd = content;
    int iPos = 0;
    int length = dd.length();
    auto data = dd.c_str();

    std::stack<SAN_MU> sanmuStack;
    do {
        if (dd[iPos] == '/' && dd[iPos + 1] == '/') {
            while (iPos < length) {
                if (dd[iPos] == '\n') {
                    iPos++;
                    break;
                }
                iPos++;
            }
        }
        else if (dd[iPos] == '/' && dd[iPos + 1] == '*') {
            while (iPos < length) {
                if (dd[iPos] == '*' && dd[iPos + 1] == '/') {
                    iPos += 2;
                    break;
                }
                iPos++;
            }
        }
        if (dd[iPos] == '=') {
            SAN_MU san_mu;
            san_mu.iPosStart = iPos;
            std::stack<SAN_MU> emptyTemp;
            emptyTemp.push(san_mu);
            sanmuStack.swap(emptyTemp);
        }
        else if (dd[iPos] == '\n') {
            if (sanmuStack.size() > 0) {
                std::stack<SAN_MU> emptyTemp;
                sanmuStack.swap(emptyTemp);
            }
        }
        else if (dd[iPos] == '(') {
            SAN_MU san_mu;
            san_mu.iPosStart = iPos;
            sanmuStack.push(san_mu);
        }
        if (sanmuStack.size() > 0) {
            auto& san_mu = sanmuStack.top();
            if (dd[iPos] == '?') {
                san_mu.iPosQuestion = iPos;
            }
            else if (dd[iPos] == ':') {
                san_mu.iPosMaohao = iPos;
            }
            else if (dd[iPos] == ';' || dd[iPos] == ')') {
                san_mu.iPosEnd = iPos;
            }

            if (san_mu.iPosStart >= 0 && san_mu.iPosQuestion >= 0 && san_mu.iPosMaohao >= 0 && san_mu.iPosEnd >= 0) {
                auto& iPosStart = san_mu.iPosStart;
                auto& iPosQuestion = san_mu.iPosQuestion;
                auto& iPosMaohao = san_mu.iPosMaohao;
                auto& iPosEnd = san_mu.iPosEnd;
                std::string str = dd.substr(iPosStart + 1, iPosEnd - iPosStart - 1);
                std::string startStr = str.substr(0, iPosQuestion - iPosStart - 1);
                std::string midStr = str.substr(iPosQuestion - iPosStart, iPosMaohao - iPosQuestion - 1);
                std::string endStr = str.substr(iPosMaohao - iPosStart, iPosEnd - iPosQuestion - 1);

                str = "(" + startStr + ")?(" + midStr + "):(" + endStr + ")";

                dd.replace(iPosStart + 1, iPosEnd - iPosStart - 1, str);
                length = dd.length();
                data = dd.c_str();
                iPos = iPosStart + 1 + str.length();
                iPosStart = -1;
                iPosQuestion = -1;
                iPosMaohao = -1;
                iPosEnd = -1;
            }

            if (dd[iPos] == ')') {
                sanmuStack.pop();
            }
        }
        iPos++;
    } while (iPos < length);
    content = data;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值