色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

定義數據類型

汽車電子技術 ? 來源:程序猿搬磚 ? 作者:壞人 ? 2023-03-03 10:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一節我們從模型上重建了AST節點,將antlr生成的表達式AST抽象成可直接運算的AST節點。

在運算之前我們必須首先定義出數據類型,定義出腳本支持的數據類型,這是運算的基礎。

這一小節我們將定義出數據類型,在這里我們暫時定義四個數據類型:

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

完整的數據類型定義如下:

/// .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; }
        /// 獲取數據的字符串描述
        const string getText();
        template

這里我們使用了any來包裝我們具體的數據,所以我們的C++編譯器需要設置成C++ 17

String類型我們使用的是std::string來實現。

Number類型則是上面提到的使用double來實現的。

Bool類型則是使用bool實現。

Object類型是單獨定義的一個C++類型或者本身就是一個SemaASTNodeObject,后面單獨說明。

通過std::any中的type()函數獲取放置的數據信息來判斷放置的數據的類型:

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;
    }
}

解包的時候判斷再轉換成具體的數據類即可,它的實現如下:

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

為里需要特別說明一下Object這個類型中的另外一個自定義數據類型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;
        }
    };
};

這個類定義了棧幀執行時的變量上下文環境,由于特殊的使用場景,還多定義了一個注入的Json對象,這個Json對象在使用模板一開始的時候就注入了。

棧運行過程中產生的臨時變量放入variable容器中,目前執行環境都是單獨的一個表達式樹,在沒有對象與函數實現之前,這個執行環境比較單純,這里只是提前考慮到執行環境這個問題,后期加入類與函數實現的時候可以更方便改造。

后面我們在消解變量的時候就需要從當前這個環境中查找對應的數據,找到后打包成一個SemaASTNodeObject對象,他的具體執行邏輯是這樣的:

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;
        }

首先從臨時變量中查找,如果找到了就直接返回,如果沒找到就從注入的Json對象就查找。

到此,我們的類型系統就實現完成了, 我們還實現了棧幀執行的環境上下文。

下一節我們將在此基礎上實現簡最單純的棧幀

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 運算
    +關注

    關注

    0

    文章

    132

    瀏覽量

    26160
  • 數據類型
    +關注

    關注

    0

    文章

    237

    瀏覽量

    13863
  • 定義
    +關注

    關注

    0

    文章

    10

    瀏覽量

    14437
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    一個定時器設計的脈沖發生器?

    定義數據類型為布爾型的輸入變量start作為脈沖發生器的啟動輸入,置位有效。定義數據類型為時間類型的輸入變量onTime作為脈沖發生器的接通
    的頭像 發表于 02-07 10:45 ?2807次閱讀
    一個定時器設計的脈沖發生器?

    EDA技術:預定義數據類型(1)#EDA技術

    edaEDA技術
    jf_49750429
    發布于 :2023年04月11日 23:40:51

    EDA技術:預定義數據類型(2)#EDA技術

    edaEDA技術
    jf_49750429
    發布于 :2023年04月11日 23:41:25

    單片機中宏定義與重新定義數據類型(typedef)區別

    單片機中宏定義與重新定義數據類型(typedef)區別,并且各自的優勢(初學單片機)eg:#define SKY unsigned chartypedef unsigned char SKY
    發表于 08-27 20:21

    求助,插補判別F 怎樣定義數據類型

    插補程序,x1 y1 x2 y2分別為起終點坐標;Xe Ye是起終點之間的橫縱坐標差;N為插補步數F是判別結果,默認為0關于F,Xe,Ye,N;該怎么定義數據類型尤其是F,我試了char int
    發表于 02-25 18:25

    LabVIEW自定義數據類型

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

    請問如何自定義128位數據類型

    編程中有項目需要經常用到一百個左右的二級制數移位比較等操作,KEIL中數據類型最多的也就是32位或64位吧,能不能自己定義數據類型呢?比如定義一個 XXlong關鍵字,使用此關鍵字
    發表于 08-20 21:58

    嵌入式ARM開發之自定義數據類型相關資料推薦

    定義數據類型變量集合常量集合重命名struct(結構體)元素地址連續排列union(共用體)元素共用起始地址enum(枚舉)被命名的整型常數集合typedef(聲明類型)聲明一個新的類型
    發表于 12-14 07:19

    C++程序設計教程之自定義數據類型的詳細資料說明

    本文檔詳細介紹的是C++程序設計教程之自定義數據類型的詳細資料說明主要內容包括了:1. 結構體類型,2. 共用體,3. 枚舉類型,4. 用typedef聲明
    發表于 03-14 16:04 ?1次下載
    C++程序設計教程之自<b class='flag-5'>定義</b><b class='flag-5'>數據類型</b>的詳細資料說明

    SystemVerilog為工程師定義新的數據類型提供了一種機制

    為了使源代碼更易于閱讀和維護,typedef名稱應該使用一種命名約定,使名稱明顯代表用戶自定義類型。兩種常見的命名約定是在用戶自定義類型名稱中添加“_t”后綴或“t_”前綴。本文系列文
    的頭像 發表于 06-09 09:45 ?1127次閱讀

    用戶定義數據類型的結構

    用戶定義數據類型(UDTs)是你自己創建的特殊數據結構。因用戶數據類型指派了名字,他們可以用很多次。一旦他們被定義,就可在CPU程序的任意點
    的頭像 發表于 08-19 10:06 ?1824次閱讀

    KUKA ENUM定義計數類型簡析

    在 $CONFIG.DAT 中不允許使用用關鍵詞 GLOBAL 在數據列表中定義數據類型
    的頭像 發表于 01-16 10:28 ?1872次閱讀
    KUKA ENUM<b class='flag-5'>定義</b>計數<b class='flag-5'>類型</b>簡析

    用戶自定義類型

    SystemVerilog還為工程師定義新的數據類型提供了一種機制。用戶定義數據類型允許從現有數據類型創建新的
    的頭像 發表于 02-09 14:53 ?1345次閱讀
    用戶自<b class='flag-5'>定義</b><b class='flag-5'>類型</b>

    博途PLC1200/1500PLC用戶自定義數據類型(UDT)

    用戶自定義數據類型可以包含基本數據類型(例如,INT bool string),以及 數組 ,結構體,以及PLC的專有數據類型等,而且用戶自定義
    發表于 04-20 09:46 ?5次下載
    博途PLC1200/1500PLC用戶自<b class='flag-5'>定義</b><b class='flag-5'>數據類型</b>(UDT)

    淺談PLC定義數據類型的應用

    PLC定義數據類型以下用一個例子介紹PLC定義數據類型的應用,以便進一步理解PLC定義數據類型
    的頭像 發表于 07-24 16:07 ?1722次閱讀
    淺談PLC<b class='flag-5'>定義</b><b class='flag-5'>數據類型</b>的應用
    主站蜘蛛池模板: 久久精品国产首叶 | 冈本视频黄页正版 | 国产一区二区精品视频 | 精品亚洲永久免费精品 | 校园刺激全黄H全肉细节文 校园纯肉H教室第一次 | 成人免费视频在线观看 | 99久久国产露脸精品国产麻豆 | 97超级碰久久久久香蕉人人 | 国产精品亚洲第一区二区三区 | 国产婷婷一区二区在线观看 | 无码99久热只有精品视频在线 | 亚洲国产精品VA在线看黑人 | 你的欲梦裸身在线播放 | 抽插性奴中出乳精内射 | 日本妈妈xxxx | 亚洲伊人精品综合在合线 | 牛牛超碰 国产 | 在线观看国产高清免费不卡 | 精品久久久亚洲精品中文字幕 | 亚洲永久精品ww47 | 欧美乱妇日本无乱码特黄大片 | 巨胸美女狂喷奶水www网麻豆 | 插我一区二区在线观看 | 国产高清在线a视频大全 | 伊人青青青 | 黑人操日本女人 | 秋霞av伦理片在线观看 | 国产精品人妻无码77777 | 美女打开双腿扒开屁股男生 | 超碰高清熟女一区二区 | 亚洲国产精品嫩草影院永久 | 内射少妇36P九色 | 草莓湿漉漉是好事还是恶性 | 欧美高清videos 360p | 久久精品久精品99热 | 亚洲AV噜噜狠狠网址蜜桃尤物 | 97人妻中文字幕免费视频 | 青青草原亚洲 | 亚洲成人精品久久 | 攻把受做哭边走边肉楼梯PLAY | 国产亚洲美女精品久久久2020 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品