女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

定義數(shù)據(jù)類(lèi)型

汽車(chē)電子技術(shù) ? 來(lái)源:程序猿搬磚 ? 作者:壞人 ? 2023-03-03 10:10 ? 次閱讀

上一節(jié)我們從模型上重建了AST節(jié)點(diǎn),將antlr生成的表達(dá)式AST抽象成可直接運(yùn)算的AST節(jié)點(diǎn)。

在運(yùn)算之前我們必須首先定義出數(shù)據(jù)類(lèi)型,定義出腳本支持的數(shù)據(jù)類(lèi)型,這是運(yùn)算的基礎(chǔ)。

這一小節(jié)我們將定義出數(shù)據(jù)類(lèi)型,在這里我們暫時(shí)定義四個(gè)數(shù)據(jù)類(lèi)型:

enum Type { String, Number, Bool, Object, None };

完整的數(shù)據(jù)類(lèi)型定義如下:

/// .h
typedef double number;

namespace DynamicDSL {
    enum Type { String, Number, Bool, Object, None };
    struct SemaASTNodeObject {
    private:
        any value;
    public:
        SemaASTNodeObject() {}
        SemaASTNodeObject(any value) {
            this->value = value;
        }
        ~SemaASTNodeObject() { }
    public:
        const Type getType();
        const string getTypeText();
        const any getRawValue() { return this->value; }
        void setValue(any v) { this->value = v; }
        /// 獲取數(shù)據(jù)的字符串描述
        const string getText();
        template

這里我們使用了any來(lái)包裝我們具體的數(shù)據(jù),所以我們的C++編譯器需要設(shè)置成C++ 17

String類(lèi)型我們使用的是std::string來(lái)實(shí)現(xiàn)。

Number類(lèi)型則是上面提到的使用double來(lái)實(shí)現(xiàn)的。

Bool類(lèi)型則是使用bool實(shí)現(xiàn)。

Object類(lèi)型是單獨(dú)定義的一個(gè)C++類(lèi)型或者本身就是一個(gè)SemaASTNodeObject,后面單獨(dú)說(shuō)明。

通過(guò)std::any中的type()函數(shù)獲取放置的數(shù)據(jù)信息來(lái)判斷放置的數(shù)據(jù)的類(lèi)型:

const DynamicDSL::Type DynamicDSL::SemaASTNodeObject::getType() {
    string clsName = this->value.type().name();
    if(clsName == "i" || clsName == "d") return Number;
    else if(clsName.find("string") != string::npos) return String;
    else if(clsName == "b") return Bool;
    else if(clsName.find("SemaASTNodeObject") != string::npos ||
            clsName.find("SemaContext") != string::npos)
        return Object;
    else if(clsName == "v") return None;
    else {
        return None;
    }
}

解包的時(shí)候判斷再轉(zhuǎn)換成具體的數(shù)據(jù)類(lèi)即可,它的實(shí)現(xiàn)如下:

const string DynamicDSL::SemaASTNodeObject::getText() {
    if(this->value.has_value()) {
        if(getType() == String) {
            return any_cast<string>(this->value);
        } else if(getType() == Number) {
            ostringstream oss;
            oss << any_cast<double>(this->value);
            return oss.str();
        } else if(getType() == Bool) {
            if(any_cast<bool>(this->value)) return "true";
            else return "false";
        } else if(getType() == Object) {
            string clsName = this->value.type().name();
            if(clsName.find("SemaASTNodeObject") != string::npos) {
                return getValue

為里需要特別說(shuō)明一下Object這個(gè)類(lèi)型中的另外一個(gè)自定義數(shù)據(jù)類(lèi)型SemaContext。

它的完整定義如下:

namespace DynamicDSL {
    enum JSONType {
        JSONType_String,
        JSONType_Number,
        JSONType_Bool,
        JSONType_Object,
        JSONType_None
    };
}

namespace DynamicDSL {
    class SemaContext {
    private:
        /// 本地變量
        map<string, SemaASTNodeObject> variable;
        /// JSON注入
        Json json;
    public:
        SemaContext(Json json) {
            this->json = json;
        }
        SemaContext(Json json, map<string, SemaASTNodeObject> variable) {
            this->json = json;
            this->variable = variable;
        }
        static SemaContext *copy(SemaContext *context) {
            return new SemaContext(context->getJSON(), context->getVariable());
        }
    public:
        map<string, SemaASTNodeObject> getVariable() { return variable; }
        Json getJSON() { return json; }
        void putVariable(string key, SemaASTNodeObject val) {
            variable[key] = val;
        }
        SemaASTNodeObject getVariableValue(string key) {
            if(variable.count(key) > 0) return variable[key];
            DynamicDSL::SemaASTNodeObject object;
            if(!json[key].is_null()) {
                Json jsonValue = json[key];
                JSONType type = SemaContext::getValueType(jsonValue);
                if(type == DynamicDSL::JSONType_Bool) {
                    object.setValue(jsonValue.bool_value());
                } else if(type == DynamicDSL::JSONType_Number) {
                    object.setValue(jsonValue.number_value());
                } else if(type == DynamicDSL::JSONType_String) {
                    object.setValue(jsonValue.string_value());
                } else if(type == DynamicDSL::JSONType_Object) {
                    auto context = SemaContext(jsonValue);
                    object.setValue(context);
                }
            }
            return object;
        }
        static JSONType getValueType(Json jsonObject) {
            if(jsonObject.is_string()) return DynamicDSL::JSONType_String;
            else if(jsonObject.is_number()) return DynamicDSL::JSONType_Number;
            else if(jsonObject.is_bool()) return DynamicDSL::JSONType_Bool;
            else if(jsonObject.is_object()) return DynamicDSL::JSONType_Object;
            return DynamicDSL::JSONType_None;
        }
    };
};

這個(gè)類(lèi)定義了棧幀執(zhí)行時(shí)的變量上下文環(huán)境,由于特殊的使用場(chǎng)景,還多定義了一個(gè)注入的Json對(duì)象,這個(gè)Json對(duì)象在使用模板一開(kāi)始的時(shí)候就注入了。

棧運(yùn)行過(guò)程中產(chǎn)生的臨時(shí)變量放入variable容器中,目前執(zhí)行環(huán)境都是單獨(dú)的一個(gè)表達(dá)式樹(shù),在沒(méi)有對(duì)象與函數(shù)實(shí)現(xiàn)之前,這個(gè)執(zhí)行環(huán)境比較單純,這里只是提前考慮到執(zhí)行環(huán)境這個(gè)問(wèn)題,后期加入類(lèi)與函數(shù)實(shí)現(xiàn)的時(shí)候可以更方便改造。

后面我們?cè)谙庾兞康臅r(shí)候就需要從當(dāng)前這個(gè)環(huán)境中查找對(duì)應(yīng)的數(shù)據(jù),找到后打包成一個(gè)SemaASTNodeObject對(duì)象,他的具體執(zhí)行邏輯是這樣的:

SemaASTNodeObject getVariableValue(string key) {
            if(variable.count(key) > 0) return variable[key];
            DynamicDSL::SemaASTNodeObject object;
            if(!json[key].is_null()) {
                Json jsonValue = json[key];
                JSONType type = SemaContext::getValueType(jsonValue);
                if(type == DynamicDSL::JSONType_Bool) {
                    object.setValue(jsonValue.bool_value());
                } else if(type == DynamicDSL::JSONType_Number) {
                    object.setValue(jsonValue.number_value());
                } else if(type == DynamicDSL::JSONType_String) {
                    object.setValue(jsonValue.string_value());
                } else if(type == DynamicDSL::JSONType_Object) {
                    auto context = SemaContext(jsonValue);
                    object.setValue(context);
                }
            }
            return object;
        }

首先從臨時(shí)變量中查找,如果找到了就直接返回,如果沒(méi)找到就從注入的Json對(duì)象就查找。

到此,我們的類(lèi)型系統(tǒng)就實(shí)現(xiàn)完成了, 我們還實(shí)現(xiàn)了棧幀執(zhí)行的環(huán)境上下文。

下一節(jié)我們將在此基礎(chǔ)上實(shí)現(xiàn)簡(jiǎn)最單純的棧幀

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 運(yùn)算
    +關(guān)注

    關(guān)注

    0

    文章

    132

    瀏覽量

    26144
  • 數(shù)據(jù)類(lèi)型

    關(guān)注

    0

    文章

    237

    瀏覽量

    13853
  • 定義
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    14434
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    一個(gè)定時(shí)器設(shè)計(jì)的脈沖發(fā)生器?

    定義數(shù)據(jù)類(lèi)型為布爾型的輸入變量start作為脈沖發(fā)生器的啟動(dòng)輸入,置位有效。定義數(shù)據(jù)類(lèi)型為時(shí)間類(lèi)型的輸入變量onTime作為脈沖發(fā)生器的接通
    的頭像 發(fā)表于 02-07 10:45 ?2795次閱讀
    一個(gè)定時(shí)器設(shè)計(jì)的脈沖發(fā)生器?

    EDA技術(shù):預(yù)定義數(shù)據(jù)類(lèi)型(1)#EDA技術(shù)

    edaEDA技術(shù)
    jf_49750429
    發(fā)布于 :2023年04月11日 23:40:51

    EDA技術(shù):預(yù)定義數(shù)據(jù)類(lèi)型(2)#EDA技術(shù)

    edaEDA技術(shù)
    jf_49750429
    發(fā)布于 :2023年04月11日 23:41:25

    單片機(jī)中宏定義與重新定義數(shù)據(jù)類(lèi)型(typedef)區(qū)別

    單片機(jī)中宏定義與重新定義數(shù)據(jù)類(lèi)型(typedef)區(qū)別,并且各自的優(yōu)勢(shì)(初學(xué)單片機(jī))eg:#define SKY unsigned chartypedef unsigned char SKY
    發(fā)表于 08-27 20:21

    求助,插補(bǔ)判別F 怎樣定義數(shù)據(jù)類(lèi)型

    插補(bǔ)程序,x1 y1 x2 y2分別為起終點(diǎn)坐標(biāo);Xe Ye是起終點(diǎn)之間的橫縱坐標(biāo)差;N為插補(bǔ)步數(shù)F是判別結(jié)果,默認(rèn)為0關(guān)于F,Xe,Ye,N;該怎么定義數(shù)據(jù)類(lèi)型尤其是F,我試了char int
    發(fā)表于 02-25 18:25

    LabVIEW自定義數(shù)據(jù)類(lèi)型

    一直只知道自定義控件,不知道自定義數(shù)據(jù)類(lèi)型,直到有一天看到別人的后面板某控件左上角有個(gè)黑色小三角形,像這樣,才知道有自定義數(shù)據(jù)類(lèi)型,類(lèi)似于C
    發(fā)表于 03-24 17:24

    請(qǐng)問(wèn)如何自定義128位數(shù)據(jù)類(lèi)型

    編程中有項(xiàng)目需要經(jīng)常用到一百個(gè)左右的二級(jí)制數(shù)移位比較等操作,KEIL中數(shù)據(jù)類(lèi)型最多的也就是32位或64位吧,能不能自己定義數(shù)據(jù)類(lèi)型呢?比如定義一個(gè) XXlong關(guān)鍵字,使用此關(guān)鍵字
    發(fā)表于 08-20 21:58

    嵌入式ARM開(kāi)發(fā)之自定義數(shù)據(jù)類(lèi)型相關(guān)資料推薦

    定義數(shù)據(jù)類(lèi)型變量集合常量集合重命名struct(結(jié)構(gòu)體)元素地址連續(xù)排列union(共用體)元素共用起始地址enum(枚舉)被命名的整型常數(shù)集合typedef(聲明類(lèi)型)聲明一個(gè)新的類(lèi)型
    發(fā)表于 12-14 07:19

    C++程序設(shè)計(jì)教程之自定義數(shù)據(jù)類(lèi)型的詳細(xì)資料說(shuō)明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之自定義數(shù)據(jù)類(lèi)型的詳細(xì)資料說(shuō)明主要內(nèi)容包括了:1. 結(jié)構(gòu)體類(lèi)型,2. 共用體,3. 枚舉類(lèi)型,4. 用typedef聲明
    發(fā)表于 03-14 16:04 ?1次下載
    C++程序設(shè)計(jì)教程之自<b class='flag-5'>定義</b><b class='flag-5'>數(shù)據(jù)類(lèi)型</b>的詳細(xì)資料說(shuō)明

    SystemVerilog為工程師定義新的數(shù)據(jù)類(lèi)型提供了一種機(jī)制

    為了使源代碼更易于閱讀和維護(hù),typedef名稱(chēng)應(yīng)該使用一種命名約定,使名稱(chēng)明顯代表用戶(hù)自定義類(lèi)型。兩種常見(jiàn)的命名約定是在用戶(hù)自定義類(lèi)型名稱(chēng)中添加“_t”后綴或“t_”前綴。本文系列文
    的頭像 發(fā)表于 06-09 09:45 ?1120次閱讀

    用戶(hù)定義數(shù)據(jù)類(lèi)型的結(jié)構(gòu)

    用戶(hù)定義數(shù)據(jù)類(lèi)型(UDTs)是你自己創(chuàng)建的特殊數(shù)據(jù)結(jié)構(gòu)。因用戶(hù)數(shù)據(jù)類(lèi)型指派了名字,他們可以用很多次。一旦他們被定義,就可在CPU程序的任意點(diǎn)
    的頭像 發(fā)表于 08-19 10:06 ?1816次閱讀

    KUKA ENUM定義計(jì)數(shù)類(lèi)型簡(jiǎn)析

    在 $CONFIG.DAT 中不允許使用用關(guān)鍵詞 GLOBAL 在數(shù)據(jù)列表中定義數(shù)據(jù)類(lèi)型
    的頭像 發(fā)表于 01-16 10:28 ?1867次閱讀
    KUKA ENUM<b class='flag-5'>定義</b>計(jì)數(shù)<b class='flag-5'>類(lèi)型</b>簡(jiǎn)析

    用戶(hù)自定義類(lèi)型

    SystemVerilog還為工程師定義新的數(shù)據(jù)類(lèi)型提供了一種機(jī)制。用戶(hù)定義數(shù)據(jù)類(lèi)型允許從現(xiàn)有數(shù)據(jù)類(lèi)型創(chuàng)建新的
    的頭像 發(fā)表于 02-09 14:53 ?1339次閱讀
    用戶(hù)自<b class='flag-5'>定義</b><b class='flag-5'>類(lèi)型</b>

    博途PLC1200/1500PLC用戶(hù)自定義數(shù)據(jù)類(lèi)型(UDT)

    用戶(hù)自定義數(shù)據(jù)類(lèi)型可以包含基本數(shù)據(jù)類(lèi)型(例如,INT bool string),以及 數(shù)組 ,結(jié)構(gòu)體,以及PLC的專(zhuān)有數(shù)據(jù)類(lèi)型等,而且用戶(hù)自定義
    發(fā)表于 04-20 09:46 ?5次下載
    博途PLC1200/1500PLC用戶(hù)自<b class='flag-5'>定義</b><b class='flag-5'>數(shù)據(jù)類(lèi)型</b>(UDT)

    淺談PLC定義數(shù)據(jù)類(lèi)型的應(yīng)用

    PLC定義數(shù)據(jù)類(lèi)型以下用一個(gè)例子介紹PLC定義數(shù)據(jù)類(lèi)型的應(yīng)用,以便進(jìn)一步理解PLC定義數(shù)據(jù)類(lèi)型
    的頭像 發(fā)表于 07-24 16:07 ?1711次閱讀
    淺談PLC<b class='flag-5'>定義</b><b class='flag-5'>數(shù)據(jù)類(lèi)型</b>的應(yīng)用
    主站蜘蛛池模板: 和平县| 丹巴县| 科尔| 昭苏县| 缙云县| 垫江县| 扬中市| 盐源县| 武汉市| 陇川县| 贡山| 厦门市| 平昌县| 南郑县| 山东| 哈尔滨市| 武定县| 高雄县| 泊头市| 敖汉旗| 鹤岗市| 鞍山市| 电白县| 南充市| 上思县| 乐业县| 新邵县| 扶沟县| 东平县| 井冈山市| 宜丰县| 五大连池市| 鄯善县| 鲜城| 海原县| 灵川县| 登封市| 射阳县| 外汇| 张家川| 永德县|