吴忠躺衫网络科技有限公司

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

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

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

動(dòng)態(tài)模板語(yǔ)義分析-實(shí)現(xiàn)AST節(jié)點(diǎn)

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

完整實(shí)現(xiàn)代碼及antlr語(yǔ)法規(guī)則文件在這里:https://github.com/czqasngit/DynamicDSL

上一節(jié),我們已經(jīng)實(shí)現(xiàn)了數(shù)據(jù)類型的定義,在此基礎(chǔ)上我們就可以來(lái)實(shí)現(xiàn)我們的數(shù)據(jù)節(jié)點(diǎn)了。

在實(shí)現(xiàn)某個(gè)具體節(jié)點(diǎn)(比如一無(wú)表達(dá)式節(jié)點(diǎn))之前,我們需要抽象出一個(gè)基類SemaASTNode

它的定義如下:

namespace DynamicDSL {
    /// 整理后可運(yùn)算的AST
    class SemaASTNode {
    protected:
        SemaContext *context;
    public:
        enum Type {
            None    = 1<<0,
            Assign  = 1<<1, /// 賦值表達(dá)式, 改變上下文環(huán)境中已存在變量的值
            Declare = 1<<2, /// 申明變量,上下文環(huán)境中增加變量
            Value   = 1<<3  /// 求值表達(dá)式
        };
        /// 節(jié)點(diǎn)的類型
        Type type;
        SemaASTNodeObject object;
    public:
        SemaASTNode() {
            this->type = None;
        }
        SemaASTNode(SemaContext *context, Type type) {
            this->type = type;
            /// 復(fù)制,單獨(dú)管理context的內(nèi)存
            this->context = SemaContext::copy(context);
        }
        virtual ~SemaASTNode() {
            //cout << "SemaASTNode: release" << endl;
            delete context;
        }
        /// 求節(jié)點(diǎn)的值
        virtual void run() {  }
        /// 獲取節(jié)點(diǎn)的值
        SemaASTNodeObject getResult() { return object; }
    };
};

基類定義了共有的數(shù)據(jù)SemaContext(執(zhí)行時(shí)的環(huán)境變量),Type(表達(dá)式類型),SemaASTNodeObject(表達(dá)式運(yùn)算結(jié)果)。

同時(shí)還定義了一個(gè)虛函數(shù),它抽象了節(jié)點(diǎn)結(jié)算的過(guò)程,每一種不同的節(jié)點(diǎn)都需要實(shí)現(xiàn)這個(gè)函數(shù)來(lái)完成具體節(jié)點(diǎn)的運(yùn)算,這樣就很方便的只需要調(diào)用節(jié)點(diǎn)的run我們就能得到想要的結(jié)果了。

virtual void run() { assert(false); }

運(yùn)算結(jié)果保存賦值給object,通過(guò)getResult()就可以取到節(jié)點(diǎn)的運(yùn)算結(jié)果。

接下來(lái)我們來(lái)看最簡(jiǎn)單的也是最重要的節(jié)點(diǎn)Primay節(jié)點(diǎn):SemaPrimaryASTNode

這個(gè)節(jié)點(diǎn)需要完成兩個(gè)小功能,第一就是ID標(biāo)識(shí)符的消解,我們需要將解析到的標(biāo)識(shí)符解析成最終要獲得的值。

比如我們有一個(gè)變量是age,他的值是30,在SemaPrimaryASTNode里面我們就需要將age替換成30。

而實(shí)現(xiàn)這個(gè)邏輯的代碼就在run()函數(shù)里面,當(dāng)被調(diào)用的時(shí)候就替換成最終的值了。

void run() override {
    if(idTokenText.empty() &&
       stringTokenText.empty() &&
       intTokenText.empty() &&
       doubleTokenText.empty() &&
       tfTokenText.empty()) {
            object = SemaASTNodeObject(*context);
    } else {
       /// 這里對(duì)變量進(jìn)行消解
       if(!idTokenText.empty()) {
           object = this->context->getVariableValue(idTokenText);
       } else if(!stringTokenText.empty()) {
           object.setValue(stringTokenText.substr(1, stringTokenText.length() - 2));
       } else if(!intTokenText.empty()) {
           object.setValue(stod(intTokenText));
       } else if(!doubleTokenText.empty()) {
           object.setValue(stod(doubleTokenText));
       } else if(!tfTokenText.empty()) {
           if(tfTokenText == "true") {
               object.setValue(true);
           } else {
               object.setValue(false);
           }
       } else {
           cout << "[Warning] " << "未支持的類型" << endl;
       }
    }
}

接下來(lái)是一元運(yùn)算節(jié)點(diǎn): SemaUnaryASTNode他的實(shí)現(xiàn)也很簡(jiǎn)單,因?yàn)槲覀儸F(xiàn)在只簡(jiǎn)單的支持了++ --運(yùn)算,所以我們要求他們的值類型一定是Number。

void run() override {
    this->node->run();
    this->object = node->getResult();
    /// 僅Number支持
    if(object.getType() == DynamicDSL::Number) {
        if(op == "++") {
            object.setValue(object.getValue<number>() + 1);
        } else if(op == "--") {
            object.setValue(object.getValue<number>() - 1);
        } else {
            throw "一元表達(dá)式暫不支持: " + op + " 運(yùn)算符";
        }
    } else {
        cout << "[Warning] " << "++或--只能對(duì)Number類型有效, " << "當(dāng)前的類型是: " << object.getTypeText() << endl;
    }
}

但是這里需要注意的是,SemaUnaryASTNode包含了一個(gè)節(jié)點(diǎn),而這個(gè)節(jié)點(diǎn)求出來(lái)的值就是一個(gè)Number類型的數(shù)據(jù)。

它也許是一個(gè)簡(jiǎn)單的SemaPrimaryASTNode節(jié)點(diǎn),也許是一個(gè)更復(fù)雜的節(jié)點(diǎn),但是我們只關(guān)心他這個(gè)節(jié)點(diǎn)運(yùn)算的結(jié)果,在這個(gè)結(jié)果的基礎(chǔ)上再進(jìn)行一元運(yùn)算。

接下來(lái)是二元運(yùn)算,二元運(yùn)算也很簡(jiǎn)單,它包含了兩個(gè)子節(jié)點(diǎn):

void DynamicDSL::SemaBinaryASTNode::run() {
    this->left->run();
    this->right->run();
    SemaASTNodeObject left = this->left->getResult();
    SemaASTNodeObject right = this->right->getResult();
    if(op == "*") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number) {
            object.setValue(left.getValue<number>() * right.getValue<number>());
        } else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "/") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number) {
            object.setValue(left.getValue<number>() / right.getValue<number>());
        } else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "%") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue((int)left.getValue<number>() % (int)right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "+") {
        if(left.getType() == DynamicDSL::String || right.getType() == DynamicDSL::String) {
            object.setValue(left.getText() + right.getText());
        } else if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number) {
            object.setValue(left.getValue<number>() + right.getValue<number>());
        } else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "-") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue(left.getValue<number>() - right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "<") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue(left.getValue<number>() < right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "<=") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue(left.getValue<number>() <= right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == ">") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue(left.getValue<number>() > right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == ">=") {
        if(left.getType() == DynamicDSL::Number && right.getType() == DynamicDSL::Number)
            object.setValue(left.getValue<number>() >= right.getValue<number>());
        else {
            cout << "[Warning] " << "二元表達(dá)式, 類型 " << left.getTypeText() << "與 " << right.getTypeText() << "不能進(jìn)行 ' " + op + " ' 運(yùn)算" << endl;
        }
    } else if(op == "==") {
        if(left.getType() != right.getType()) {
            object.setValue(false);
        } else {
            object.setValue(left.getText() == right.getText());
        }
    } else if(op == "!=") {
        if(left.getType() != right.getType()) {
            object.setValue(true);
        } else {
            object.setValue(!(left.getText() == right.getText()));
        }
    } else if(op == "&&") {
        if(left.getType() == DynamicDSL::Bool && right.getType() == DynamicDSL::Bool)
            object.setValue(left.getValue

我們利用C++完成對(duì)節(jié)點(diǎn)的運(yùn)算求值,當(dāng)需要支持更多的二元運(yùn)算時(shí)我們就在這里對(duì)它進(jìn)行擴(kuò)展就可以了。

在求值之前我們需要先求出左右兩個(gè)子節(jié)點(diǎn)的值,通過(guò)這種模式可以無(wú)限擴(kuò)展節(jié)點(diǎn)。

在說(shuō)到三元運(yùn)算符之前,需要先說(shuō)一下小括號(hào)運(yùn)算符,因?yàn)樗鼤?huì)改變節(jié)點(diǎn)運(yùn)算的優(yōu)先級(jí)。

它的實(shí)現(xiàn)如下:

void run() override {
    this->node->run();
    this->object = node->getResult();
}

首先求出小括號(hào)內(nèi)部節(jié)點(diǎn)的值,再把值賦值給節(jié)點(diǎn)自身,因?yàn)樾±ㄌ?hào)只改變了運(yùn)算優(yōu)先級(jí)。

接下來(lái)就是三元運(yùn)算了,它也很簡(jiǎn)單:

void run() override {
    this->condition->run();
    this->first->run();
    this->second->run();
    SemaASTNodeObject condition = this->condition->getResult();
    SemaASTNodeObject first = this->first->getResult();
    SemaASTNodeObject second = this->second->getResult();
    if(condition.getType() == DynamicDSL::Bool) {
        if(condition.getValue<bool>()) {
            object = first;
        } else {
            object = second;
        }
    } else {
        cout << "[Warning] " << "三元表達(dá)式條件語(yǔ)句的結(jié)果必須是Bool數(shù)據(jù)類型" << endl;
    }
}

它有三個(gè)子節(jié)點(diǎn),分別是:條件節(jié)點(diǎn),條件為真時(shí)的first節(jié)點(diǎn),條件為假時(shí)的second節(jié)點(diǎn)。它的運(yùn)算規(guī)則就是判斷條件節(jié)點(diǎn),再把結(jié)果設(shè)置給節(jié)點(diǎn)自身。

最后還需要實(shí)現(xiàn)的就是取值節(jié)點(diǎn)了,取值節(jié)點(diǎn)可能是一個(gè)或多個(gè)連續(xù)的聚會(huì)運(yùn)算符,它的實(shí)現(xiàn)如下:

void run() override {
    /// 如果node不為null,則表示當(dāng)前取值是從上一個(gè)表達(dá)式的結(jié)果中取值
    /// 上一個(gè)表達(dá)式結(jié)果必須是一個(gè)SemaContext
    /// 如果是一個(gè)基礎(chǔ)類型,則不允許
    if(this->node) {
        /// 通過(guò)調(diào)用node的run,深度優(yōu)先計(jì)算出左值
        this->node->run();
        SemaASTNodeObject tmp = this->node->getResult();
        if(tmp.getType() == DynamicDSL::Object) {
            try {
                SemaContext tmpContext = tmp.getValue

如果它包含了一個(gè)子節(jié)點(diǎn),這個(gè)子節(jié)點(diǎn)運(yùn)算的結(jié)果是一個(gè)SemaContext,通過(guò)key獲取這個(gè)SemaContext中的數(shù)據(jù)。

如果它不包含子節(jié)點(diǎn),則從上下文環(huán)境中的SemaContext中去獲取值。

本節(jié)需要實(shí)現(xiàn)的節(jié)點(diǎn)就是這些了,小結(jié):

? 通過(guò)抽象節(jié)點(diǎn),我們?cè)谶\(yùn)算的時(shí)候不關(guān)心節(jié)點(diǎn)本身是怎么實(shí)現(xiàn)運(yùn)算的。

? 通過(guò)節(jié)點(diǎn)與節(jié)點(diǎn)之前的引用實(shí)現(xiàn)了節(jié)點(diǎn)樹(shù)的擴(kuò)展。

? 最終我們只需要關(guān)心頂層節(jié)點(diǎn)返回的最終結(jié)果即可。

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

    關(guān)注

    0

    文章

    220

    瀏覽量

    24527
  • 數(shù)據(jù)類型
    +關(guān)注

    關(guān)注

    0

    文章

    236

    瀏覽量

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

    關(guān)注

    0

    文章

    10

    瀏覽量

    14356
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Linux系統(tǒng)下的mdev實(shí)現(xiàn)動(dòng)態(tài)更新設(shè)備節(jié)點(diǎn)動(dòng)態(tài)掛載U盤(pán)

    今天主要聊一聊,如何使用Linux系統(tǒng)下的mdev實(shí)現(xiàn)動(dòng)態(tài)更新設(shè)備節(jié)點(diǎn)動(dòng)態(tài)掛載U盤(pán)。
    發(fā)表于 10-17 09:22 ?4583次閱讀

    NLPIR大數(shù)據(jù)語(yǔ)義智能分析平臺(tái)先精準(zhǔn)分詞才語(yǔ)義分析

    特性,是對(duì)數(shù)據(jù)包含信息的更高層次的抽象。  靈玖軟件NLPIR大數(shù)據(jù)語(yǔ)義智能分析平臺(tái)針對(duì)中文數(shù)據(jù)挖掘的綜合需求,融合了網(wǎng)絡(luò)精準(zhǔn)采集、自然語(yǔ)言理解、文本挖掘和語(yǔ)義搜索的研究成果,先后歷時(shí)十八年,服務(wù)了
    發(fā)表于 08-27 10:53

    NLPIR語(yǔ)義分析是對(duì)自然語(yǔ)言處理的完美理解

    單位,詞語(yǔ)具有特定的語(yǔ)義和內(nèi)涵。在詞語(yǔ)層次上,詞語(yǔ)語(yǔ)義分析意味著詞語(yǔ)的內(nèi)涵分析、詞語(yǔ)之間的語(yǔ)義相似度或相關(guān)度
    發(fā)表于 10-19 11:34

    九眼公共安全語(yǔ)義智能分析平臺(tái),實(shí)現(xiàn)文本分析的公共安全應(yīng)用

    社會(huì)和科技的進(jìn)步和現(xiàn)在行業(yè)對(duì)數(shù)據(jù)的利用率提高有很大關(guān)系,各行各業(yè)積累的數(shù)據(jù)量均在增加,公安領(lǐng)域也包括在內(nèi),有大量的案件信息數(shù)據(jù)需要進(jìn)行文本分析。 現(xiàn)在的公安部門(mén)均使用信息管理系統(tǒng)管理數(shù)據(jù),在實(shí)現(xiàn)
    發(fā)表于 10-08 15:56

    屬性節(jié)點(diǎn)或調(diào)用節(jié)點(diǎn)動(dòng)態(tài)引用問(wèn)題

    預(yù)定邏輯使用屬性節(jié)點(diǎn)和調(diào)用節(jié)點(diǎn)。這種辦法麻煩的是先要生成引用常量數(shù)組,引用常量要一個(gè)個(gè)的手動(dòng)在菜單里選擇對(duì)應(yīng)的變量。現(xiàn)在問(wèn):有沒(méi)有一種辦法,通過(guò)對(duì)控件名稱的調(diào)用,實(shí)現(xiàn)動(dòng)態(tài)地改變屬性
    發(fā)表于 09-07 14:39

    動(dòng)態(tài)ppt課件模板

    動(dòng)態(tài)的ppt課件模板,帶動(dòng)畫(huà)的細(xì)紋設(shè)計(jì)課件模版, 動(dòng)態(tài)魔方課件模版
    發(fā)表于 12-03 19:10 ?0次下載
    <b class='flag-5'>動(dòng)態(tài)</b>ppt課件<b class='flag-5'>模板</b>

    智能節(jié)點(diǎn)模板電路設(shè)計(jì)

    介紹了基于AT89C2051單片機(jī)的VCN2M IO智能節(jié)點(diǎn)模板結(jié)構(gòu)電路設(shè)計(jì)。應(yīng)用實(shí)踐證明,該VCN2M IO智能節(jié)點(diǎn)模板的智能節(jié)點(diǎn)數(shù)大大增
    發(fā)表于 05-18 17:08 ?40次下載
    智能<b class='flag-5'>節(jié)點(diǎn)</b><b class='flag-5'>模板</b>電路設(shè)計(jì)

    智能IETM語(yǔ)義檢索系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    通過(guò)對(duì)IETM智能化語(yǔ)義檢索方法的探討,提出了一種基于Jena推理的IETM智能化語(yǔ)義檢索方法。分析了當(dāng)前IETM系統(tǒng)檢索方法存在的不足,提出了語(yǔ)義檢索是
    發(fā)表于 09-12 16:14 ?0次下載

    基于語(yǔ)義的文本語(yǔ)義分析

    文本情感傾向性研究是人工智能的分支學(xué)科,涉及了計(jì)算語(yǔ)言學(xué),數(shù)據(jù)挖掘,自然語(yǔ)言處理等多個(gè)學(xué)科。基于語(yǔ)義的情感傾向研究和基于機(jī)器學(xué)習(xí)的情感傾向研究是情感傾向性分析的兩個(gè)方向。本文采用了基于語(yǔ)義的方法
    發(fā)表于 12-15 16:35 ?6次下載

    基于快照的大規(guī)模動(dòng)態(tài)圖相似節(jié)點(diǎn)查詢算法

    的大規(guī)模動(dòng)態(tài)圖泛相似節(jié)點(diǎn)查詢處理算法。具體包括:圖動(dòng)態(tài)演進(jìn)過(guò)程的快照集表示,即演進(jìn)動(dòng)態(tài)圖;圖動(dòng)態(tài)演進(jìn)過(guò)程中的
    發(fā)表于 12-23 10:11 ?0次下載
    基于快照的大規(guī)模<b class='flag-5'>動(dòng)態(tài)</b>圖相似<b class='flag-5'>節(jié)點(diǎn)</b>查詢算法

    基于能量均衡與動(dòng)態(tài)調(diào)節(jié)的節(jié)點(diǎn)篩選算法

    優(yōu)化,實(shí)現(xiàn)網(wǎng)絡(luò)節(jié)點(diǎn)動(dòng)態(tài)選擇。在此基礎(chǔ)上,利用節(jié)點(diǎn)的關(guān)聯(lián)性選取目標(biāo)路徑,并通過(guò)建立節(jié)點(diǎn)篩選機(jī)制實(shí)時(shí)排除能量不足的
    發(fā)表于 01-21 11:39 ?1次下載
    基于能量均衡與<b class='flag-5'>動(dòng)態(tài)</b>調(diào)節(jié)的<b class='flag-5'>節(jié)點(diǎn)</b>篩選算法

    工具SemExpr可實(shí)現(xiàn)gadget搜索與語(yǔ)義分析

    分析內(nèi)容的基礎(chǔ)上,總結(jié) gadget語(yǔ)義分析應(yīng)包含的要素,提出一種基于表達(dá)式樹(shù)的 gadget語(yǔ)義分析方法。通過(guò)表達(dá)式樹(shù)變體描述寄存器和內(nèi)存
    發(fā)表于 03-12 14:52 ?20次下載
    工具SemExpr可<b class='flag-5'>實(shí)現(xiàn)</b>gadget搜索與<b class='flag-5'>語(yǔ)義</b><b class='flag-5'>分析</b>

    動(dòng)態(tài)模板語(yǔ)義分析-動(dòng)態(tài)綁定XML

    DynamicDSL將遵循以下的交互展示邏輯: 描述文件(XML,Widget) --->(綁定數(shù)據(jù))--->渲染模板--->渲染--->事件驅(qū)動(dòng)--->數(shù)據(jù)改變 這樣循環(huán)下來(lái)的,最終我們看到的就是App上的界面與交互效果了。
    的頭像 發(fā)表于 03-03 10:06 ?698次閱讀
    <b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>模板</b><b class='flag-5'>語(yǔ)義</b><b class='flag-5'>分析</b>-<b class='flag-5'>動(dòng)態(tài)</b>綁定XML

    重建AST

    利用antlr完成了語(yǔ)法分析之后,就需要進(jìn)行語(yǔ)義分析了。
    的頭像 發(fā)表于 03-03 10:12 ?546次閱讀
    重建<b class='flag-5'>AST</b>

    一個(gè)動(dòng)態(tài)環(huán)境下的實(shí)時(shí)語(yǔ)義RGB-D SLAM系統(tǒng)

    關(guān)鍵幀進(jìn)行語(yǔ)義分割以去除已知的動(dòng)態(tài)對(duì)象,并保持靜態(tài)映射以實(shí)現(xiàn)穩(wěn)健的攝像機(jī)跟蹤。此外,文章還提出了一個(gè)有效的幾何模塊,通過(guò)將深度圖像聚類到幾個(gè)區(qū)域,并通過(guò)它們的重投影誤差來(lái)識(shí)別動(dòng)態(tài)區(qū)域,
    的頭像 發(fā)表于 08-25 16:49 ?712次閱讀
    一個(gè)<b class='flag-5'>動(dòng)態(tài)</b>環(huán)境下的實(shí)時(shí)<b class='flag-5'>語(yǔ)義</b>RGB-D SLAM系統(tǒng)
    百家乐官网分析绿色版| 博彩公司| 专业的百家乐玩家| 百家乐官网博彩破解论坛| 赌场百家乐官网攻略| 称多县| 大发888真人娱乐场游戏平台| 百家乐的分析| 百家乐资金注码| 同花顺百家乐官网的玩法技巧和规则 | 赌球开户| 大发888博狗博彩| 百家乐游戏什么时间容易出| 百家乐官网平注法到6568| 南京百家乐官网赌博现场被| 菠菜百家乐官网娱乐城| 五湖四海娱乐城| 云博投注| 大发888-dafa888uk.com| 百家乐几点不用补牌| 百家乐赢退输进有哪些| 百家乐官网缩水工具| 百家乐官网深圳广告| 澳门百家乐官网现场游戏| 百家乐官网最佳下注方法| 百家乐官网美女荷官| 惠来县| 百家乐开发| 百家乐技巧| 188金宝博| 联众博彩| 棋牌评测网xjqppc| 永利高现金网可信吗| 大发888娱乐城客服电话| 威尼斯人娱乐城反水| 三国百家乐的玩法技巧和规则| 百家乐直揽经验| 新时代百家乐娱乐城| 百家乐押注最高是多少| 新梦想百家乐的玩法技巧和规则| 永利百家乐赌场娱乐网规则|