一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

自制深度學(xué)習(xí)推理框架之計(jì)算圖中的表達(dá)式

jf_pmFSk4VX ? 來(lái)源:GiantPandaCV ? 2023-02-16 10:33 ? 次閱讀

什么是表達(dá)式

表達(dá)式就是一個(gè)計(jì)算過(guò)程,類似于如下:

output_mid=input1+input2
output=output_mid*input3

用圖形來(lái)表達(dá)就是這樣的.

1d1dd988-ad17-11ed-bfe3-dac502259ad0.png

但是在PNNX的Expession Layer中給出的是一種抽象表達(dá)式,會(huì)對(duì)計(jì)算過(guò)程進(jìn)行折疊,消除中間變量. 并且將具體的輸入張量替換為抽象輸入@0,@1等.對(duì)于上面的計(jì)算過(guò)程,PNNX生成的抽象表達(dá)式是這樣的.

add(@0,mul(@1,@2))抽象的表達(dá)式重新變回到一個(gè)方便后端執(zhí)行的計(jì)算過(guò)程(抽象語(yǔ)法樹(shù)來(lái)表達(dá),在推理的時(shí)候我們會(huì)把它轉(zhuǎn)成逆波蘭式)。

其中add和mul表示我們上一節(jié)中說(shuō)到的RuntimeOperator, @0和@1表示我們上一節(jié)課中說(shuō)道的RuntimeOperand. 這個(gè)抽象表達(dá)式看起來(lái)比較簡(jiǎn)單,但是實(shí)際上情況會(huì)非常復(fù)雜,我們給出一個(gè)復(fù)雜的例子:

add(add(mul(@0,@1),mul(@2,add(add(add(@0,@2),@3),@4))),@5)

這就要求我們需要一個(gè)魯棒的表達(dá)式解析和語(yǔ)法樹(shù)構(gòu)建功能.

我們的工作

詞法解析

詞法解析的目的就是將add(@0,mul(@1,@2))拆分為多個(gè)token,token依次為add ( @0 , mul等.代碼如下:

enumclassTokenType{
TokenUnknown=-1,
TokenInputNumber=0,
TokenComma=1,
TokenAdd=2,
TokenMul=3,
TokenLeftBracket=4,
TokenRightBracket=5,
};

structToken{
TokenTypetoken_type=TokenType::TokenUnknown;
int32_tstart_pos=0;//詞語(yǔ)開(kāi)始的位置
int32_tend_pos=0;//詞語(yǔ)結(jié)束的位置
Token(TokenTypetoken_type,int32_tstart_pos,int32_tend_pos):token_type(token_type),start_pos(start_pos),end_pos(end_pos){

}
};

我們?cè)赥okenType中規(guī)定了Token的類型,類型有輸入、加法、乘法以及左右括號(hào)等.Token類中記錄了類型以及Token在字符串的起始和結(jié)束位置.

如下的代碼是具體的解析過(guò)程,我們將輸入存放在statement_中,首先是判斷statement_是否為空, 隨后刪除表達(dá)式中的所有空格和制表符.

if(!need_retoken&&!this->tokens_.empty()){
return;
}

CHECK(!statement_.empty())<

下面的代碼中,我們先遍歷表達(dá)式輸入

for(int32_ti=0;i

char c是當(dāng)前的字符,當(dāng)c等于字符a的時(shí)候,我們的詞法規(guī)定在token中以a作為開(kāi)始的情況只有add. 所以我們判斷接下來(lái)的兩個(gè)字符必須是d和 d.如果不是的話就報(bào)錯(cuò),如果是i的話就初始化一個(gè)新的token并進(jìn)行保存.

舉個(gè)簡(jiǎn)單的例子只有可能是add,沒(méi)有可能是axc之類的組合.

elseif(c=='m'){
CHECK(i+1

同理當(dāng)c等于字符m的時(shí)候,我們的語(yǔ)法規(guī)定token中以m作為開(kāi)始的情況只有mul. 所以我們判斷接下來(lái)的兩個(gè)字必須是u和l. 如果不是的話,就報(bào)錯(cuò),是的話就初始化一個(gè)mul token進(jìn)行保存.

}elseif(c=='@'){
CHECK(i+1

當(dāng)輸入為ant時(shí)候,我們對(duì)ant之后的所有數(shù)字進(jìn)行讀取,如果其之后不是操作數(shù),則報(bào)錯(cuò).當(dāng)字符等于(或者,的時(shí)候就直接保存為對(duì)應(yīng)的token,不需要對(duì)往后的字符進(jìn)行探查, 直接保存為對(duì)應(yīng)類型的Token.

語(yǔ)法解析

當(dāng)?shù)玫絫oken數(shù)組之后,我們對(duì)語(yǔ)法進(jìn)行分析,并得到最終產(chǎn)物抽象語(yǔ)法樹(shù)(不懂的請(qǐng)自己百度,這是編譯原理中的概念).語(yǔ)法解析的過(guò)程是遞歸向下的,定義在Generate_函數(shù)中.

structTokenNode{
int32_tnum_index=-1;
std::shared_ptrleft=nullptr;
std::shared_ptrright=nullptr;
TokenNode(int32_tnum_index,std::shared_ptrleft,std::shared_ptrright);
TokenNode()=default;
};

抽象語(yǔ)法樹(shù)由一個(gè)二叉樹(shù)組成,其中存儲(chǔ)它的左子節(jié)點(diǎn)和右子節(jié)點(diǎn)以及對(duì)應(yīng)的操作編號(hào)num_index. num_index為正, 則表明是輸入的編號(hào),例如@0,@1中的num_index依次為1和2. 如果num_index為負(fù)數(shù)則表明當(dāng)前的節(jié)點(diǎn)是mul或者add等operator.

std::shared_ptrExpressionParser::Generate_(int32_t&index){
CHECK(indextokens_.size());
constautocurrent_token=this->tokens_.at(index);
CHECK(current_token.token_type==TokenType::TokenInputNumber
||current_token.token_type==TokenType::TokenAdd||current_token.token_type==TokenType::TokenMul);

因?yàn)槭且粋€(gè)遞歸函數(shù),所以index指向token數(shù)組中的當(dāng)前處理位置.current_token表示當(dāng)前處理的token,它作為當(dāng)前遞歸層的第一個(gè)Token, 必須是以下類型的一種.

TokenInputNumber=0,
TokenAdd=2,
TokenMul=3,

如果當(dāng)前token類型是輸入數(shù)字類型, 則直接返回一個(gè)操作數(shù)token作為一個(gè)葉子節(jié)點(diǎn),不再向下遞歸, 也就是在add(@0,@1)中的@0和@1,它們?cè)谇懊娴脑~法分析中被歸類為TokenInputNumber類型.

if(current_token.token_type==TokenType::TokenInputNumber){
uint32_tstart_pos=current_token.start_pos+1;
uint32_tend_pos=current_token.end_pos;
CHECK(end_pos>start_pos);
CHECK(end_pos<=?this->statement_.length());
conststd::string&str_number=
std::string(this->statement_.begin()+start_pos,this->statement_.begin()+end_pos);
returnstd::make_shared(std::stoi(str_number),nullptr,nullptr);

}
elseif(current_token.token_type==TokenType::TokenMul||current_token.token_type==TokenType::TokenAdd){
std::shared_ptrcurrent_node=std::make_shared();
current_node->num_index=-int(current_token.token_type);

index+=1;
CHECK(indextokens_.size());
//判斷add之后是否有(leftbracket
CHECK(this->tokens_.at(index).token_type==TokenType::TokenLeftBracket);

index+=1;
CHECK(indextokens_.size());
constautoleft_token=this->tokens_.at(index);
//判斷當(dāng)前需要處理的lefttoken是不是合法類型
if(left_token.token_type==TokenType::TokenInputNumber
||left_token.token_type==TokenType::TokenAdd||left_token.token_type==TokenType::TokenMul){
//(之后進(jìn)行向下遞歸得到@0
current_node->left=Generate_(index);
}else{
LOG(FATAL)<

如果當(dāng)前Token類型是mul或者add. 那么我們需要向下遞歸構(gòu)建對(duì)應(yīng)的左子節(jié)點(diǎn)和右子節(jié)點(diǎn).

例如對(duì)于add(@1,@2),再遇到add之后,我們需要先判斷是否存在left bracket, 然后再向下遞歸得到@1, 但是@1所代表的 數(shù)字類型,不會(huì)再繼續(xù)向下遞歸.

當(dāng)左子樹(shù)構(gòu)建完畢之后,我們將左子樹(shù)連接到current_node的left指針中,隨后我們開(kāi)始構(gòu)建右子樹(shù).此處描繪的過(guò)程體現(xiàn)在current_node->left = Generate_(index);中.

index+=1;
//當(dāng)前的index指向add(@1,@2)中的逗號(hào)
CHECK(indextokens_.size());
//判斷是否是逗號(hào)
CHECK(this->tokens_.at(index).token_type==TokenType::TokenComma);

index+=1;
CHECK(indextokens_.size());
//current_node->right=Generate_(index);構(gòu)建右子樹(shù)
constautoright_token=this->tokens_.at(index);
if(right_token.token_type==TokenType::TokenInputNumber
||right_token.token_type==TokenType::TokenAdd||right_token.token_type==TokenType::TokenMul){
current_node->right=Generate_(index);
}else{
LOG(FATAL)<tokens_.size());
CHECK(this->tokens_.at(index).token_type==TokenType::TokenRightBracket);
returncurrent_node;

例如對(duì)于add(@1,@2),index當(dāng)前指向逗號(hào)的位置,所以我們需要先判斷是否存在comma, 隨后開(kāi)始構(gòu)建右子樹(shù).右子樹(shù)中的向下遞歸分析中得到了@2. 當(dāng)右子樹(shù)構(gòu)建完畢后,我們將它(Generate_返回的節(jié)點(diǎn),此處返回的是一個(gè)葉子節(jié)點(diǎn),其中的數(shù)據(jù)是@2) 放到current_node的right指針中.

串聯(lián)起來(lái)的例子

簡(jiǎn)單來(lái)說(shuō),我們復(fù)盤一下add(@0,@1)這個(gè)例子.輸入到Generate_函數(shù)中, 是一個(gè)token數(shù)組.

add

(

@0

,

@1

)

Generate_數(shù)組首先檢查第一個(gè)輸入是否為add,mul或者是input number中的一種.

CHECK(current_token.token_type==TokenType::TokenInputNumber||
current_token.token_type==TokenType::TokenAdd||current_token.token_type==TokenType::TokenMul);

第一個(gè)輸入add,所以我們需要判斷其后是否是left bracket來(lái)判斷合法性, 如果合法則構(gòu)建左子樹(shù).

elseif(current_token.token_type==TokenType::TokenMul||current_token.token_type==TokenType::TokenAdd){
std::shared_ptrcurrent_node=std::make_shared();
current_node->num_index=-int(current_token.token_type);

index+=1;
CHECK(indextokens_.size());
CHECK(this->tokens_.at(index).token_type==TokenType::TokenLeftBracket);

index+=1;
CHECK(indextokens_.size());
constautoleft_token=this->tokens_.at(index);

if(left_token.token_type==TokenType::TokenInputNumber
||left_token.token_type==TokenType::TokenAdd||left_token.token_type==TokenType::TokenMul){
current_node->left=Generate_(index);
}

處理下一個(gè)token, 構(gòu)建左子樹(shù).

if(current_token.token_type==TokenType::TokenInputNumber){
uint32_tstart_pos=current_token.start_pos+1;
uint32_tend_pos=current_token.end_pos;
CHECK(end_pos>start_pos);
CHECK(end_pos<=?this->statement_.length());
conststd::string&str_number=
std::string(this->statement_.begin()+start_pos,this->statement_.begin()+end_pos);
returnstd::make_shared(std::stoi(str_number),nullptr,nullptr);

}

遞歸進(jìn)入左子樹(shù)后,判斷是TokenType::TokenInputNumber則返回一個(gè)新的TokenNode到add token成為左子樹(shù).

檢查下一個(gè)token是否為逗號(hào),也就是在add(@0,@1)的@0是否為,

CHECK(this->tokens_.at(index).token_type==TokenType::TokenComma);

index+=1;
CHECK(indextokens_.size());

下一步是構(gòu)建add token的右子樹(shù)

index+=1;
CHECK(indextokens_.size());
constautoright_token=this->tokens_.at(index);
if(right_token.token_type==TokenType::TokenInputNumber
||right_token.token_type==TokenType::TokenAdd||right_token.token_type==TokenType::TokenMul){
current_node->right=Generate_(index);
}else{
LOG(FATAL)<tokens_.size());
CHECK(this->tokens_.at(index).token_type==TokenType::TokenRightBracket);
returncurrent_node;
current_node->right=Generate_(index);///構(gòu)建add(@0,@1)中的右子樹(shù)

Generate_(index)遞歸進(jìn)入后遇到的token是@1 token,因?yàn)槭荌nput Number類型所在構(gòu)造TokenNode后返回.

if(current_token.token_type==TokenType::TokenInputNumber){
uint32_tstart_pos=current_token.start_pos+1;
uint32_tend_pos=current_token.end_pos;
CHECK(end_pos>start_pos);
CHECK(end_pos<=?this->statement_.length());
conststd::string&str_number=
std::string(this->statement_.begin()+start_pos,this->statement_.begin()+end_pos);
returnstd::make_shared(std::stoi(str_number),nullptr,nullptr);

}

至此, add語(yǔ)句的抽象語(yǔ)法樹(shù)構(gòu)建完成.

structTokenNode{
int32_tnum_index=-1;
std::shared_ptrleft=nullptr;
std::shared_ptrright=nullptr;
TokenNode(int32_tnum_index,std::shared_ptrleft,std::shared_ptrright);
TokenNode()=default;
};

在上述結(jié)構(gòu)中, left存放的是@0表示的節(jié)點(diǎn), right存放的是@1表示的節(jié)點(diǎn).

一個(gè)復(fù)雜點(diǎn)的例子

我們提出這個(gè)例子是為了讓同學(xué)更加透徹的理解Expression Layer, 我們舉一個(gè)復(fù)雜點(diǎn)的例子:

add(mul(@0,@1),@2),我們將以人工分析的方式去還原詞法和語(yǔ)法分析的過(guò)程.

例子中的詞法分析

我們將以上的這個(gè)輸入劃分為多個(gè)token,多個(gè)token分別為

add | left bracket| |mul|left bracket|@0|comma|@1|right bracket| @2 |right bracket

例子中的語(yǔ)法分析

在ExpressionParser::Generate_函數(shù)對(duì)例子add(mul(@0,@1),@2),如下的列表為token 數(shù)組.

add

(

mul

(

@0

,

@1

)

,

@2

)

index = 0, 當(dāng)前遇到的token為add, 調(diào)用層為1

index = 1, 根據(jù)以上的流程,我們期待add token之后的token為left bracket, 否則就報(bào)錯(cuò). 調(diào)用層為1

**開(kāi)始遞歸調(diào)用,構(gòu)建add的左子樹(shù).**從層1進(jìn)入層2

index = 2, 遇到了mul token. 調(diào)用層為2.

index = 3, 根據(jù)以上的流程,我們期待mul token之后的token是第二個(gè)left bracket. 調(diào)用層為2.

開(kāi)始遞歸調(diào)用用來(lái)構(gòu)建mul token的左子樹(shù).

index = 4, 遇到@0,進(jìn)入遞歸調(diào)用,進(jìn)入層3, 但是因?yàn)椴僮鲾?shù)都是葉子節(jié)點(diǎn),構(gòu)建好之后就直接返回了,得到mul token的左子節(jié)點(diǎn).放在mul token的left 指針上.

index = 5, 我們希望遇到一個(gè)逗號(hào),否則就報(bào)錯(cuò)mul(@0,@1)中中間的逗號(hào).調(diào)用層為2.

index = 6, 遇到@2,進(jìn)入遞歸調(diào)用,進(jìn)入層3, 但是因?yàn)椴僮鲾?shù)是葉子節(jié)點(diǎn), 構(gòu)建好之后就直接返回到2,得到mul token的右子節(jié)點(diǎn).

index = 7, 我們希望遇到一個(gè)右括號(hào),就是mul(@1,@2)中的右括號(hào).調(diào)用層為2.

到現(xiàn)在為止mul token已經(jīng)構(gòu)建完畢,返回形成add token的左子節(jié)點(diǎn),add token的left指針指向構(gòu)建完畢的mul樹(shù). 返回到調(diào)用層1.

...

add token開(kāi)始構(gòu)建right token,但是因?yàn)锧2是一個(gè)輸入操作數(shù),所以直接遞歸就返回了,至此得到add的右子樹(shù),并用right指針指向.

所以構(gòu)建好的抽象語(yǔ)法樹(shù)如圖:

1d2c6584-ad17-11ed-bfe3-dac502259ad0.png

實(shí)驗(yàn)部分

需要完成test/tet_expression.cpp下的expression3函數(shù)

TEST(test_expression,expression3){
usingnamespacekuiper_infer;
conststd::string&statement="add(@0,div(@1,@2))";
ExpressionParserparser(statement);
constauto&node_tokens=parser.Generate();
ShowNodes(node_tokens);
}
staticvoidShowNodes(conststd::shared_ptr&node){
if(!node){
return;
}
ShowNodes(node->left);
if(node->num_indexnum_index==-int(kuiper_infer::TokenAdd)){
LOG(INFO)<num_index==-int(kuiper_infer::TokenMul)){
LOG(INFO)<num_index;
}
ShowNodes(node->right);
}

TEST(test_expression,expression1){
usingnamespacekuiper_infer;
conststd::string&statement="add(mul(@0,@1),@2)";
ExpressionParserparser(statement);
constauto&node_tokens=parser.Generate();
ShowNodes(node_tokens);
}

最后會(huì)打印抽象語(yǔ)法樹(shù)的中序遍歷:

Couldnotcreateloggingfile:Nosuchfileordirectory
COULDNOTCREATEALOGGINGFILE20230115-223854.21496!I202301152254.86322621496test_main.cpp:13]Starttest...
I202301152254.86348021496test_expression.cpp:23]NUM:0
I202301152254.86348821496test_expression.cpp:20]MUL
I202301152254.86349221496test_expression.cpp:23]NUM:1
I202301152254.86349721496test_expression.cpp:18]ADD
I202301152254.86350221496test_expression.cpp:23]NUM:2

如果語(yǔ)句是一個(gè)更復(fù)雜的表達(dá)式 add(mul(@0,@1),mul(@2,@3))

1d3b036e-ad17-11ed-bfe3-dac502259ad0.png

我們的單元測(cè)試輸出為:

I202301152222.08662723767test_expression.cpp:23]NUM:0
I202301152222.08663523767test_expression.cpp:20]MUL
I202301152222.08663923767test_expression.cpp:23]NUM:1
I202301152222.08664423767test_expression.cpp:18]ADD
I202301152222.08664923767test_expression.cpp:23]NUM:2
I202301152222.08665323767test_expression.cpp:20]MUL
I202301152222.08665823767test_expression.cpp:23]NUM:3





審核編輯:劉清

聲明:本文內(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)投訴
  • 編程語(yǔ)法
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    6968
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5548

    瀏覽量

    122332
  • Index
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    3797

原文標(biāo)題:自制深度學(xué)習(xí)推理框架-第7節(jié)-計(jì)算圖中的表達(dá)式

文章出處:【微信號(hào):GiantPandaCV,微信公眾號(hào):GiantPandaCV】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    教您快速學(xué)習(xí)python程序設(shè)計(jì)中正則表達(dá)式的運(yùn)用

    正則表達(dá)式:通用的字符串表達(dá)框架;簡(jiǎn)潔表達(dá)一組字符串的表達(dá)式;針對(duì)字符串表達(dá)“簡(jiǎn)潔”和“特征”思
    的頭像 發(fā)表于 11-21 08:10 ?5245次閱讀
    教您快速<b class='flag-5'>學(xué)習(xí)</b>python程序設(shè)計(jì)中正則<b class='flag-5'>表達(dá)式</b>的運(yùn)用

    什么是正則表達(dá)式?正則表達(dá)式如何工作?哪些語(yǔ)法規(guī)則適用正則表達(dá)式?

    正則表達(dá)式又稱規(guī)則表達(dá)式(Regular Expression,在代碼中常簡(jiǎn)寫(xiě)為 regex、regexp 或 RE),是一種用于匹配、查找、替換文本的強(qiáng)大工具。它能夠以特定的模式匹配字符串,從而
    的頭像 發(fā)表于 11-03 14:41 ?4872次閱讀
    什么是正則<b class='flag-5'>表達(dá)式</b>?正則<b class='flag-5'>表達(dá)式</b>如何工作?哪些語(yǔ)法規(guī)則適用正則<b class='flag-5'>表達(dá)式</b>?

    前面板輸入公式的表達(dá)式計(jì)算vi

    公式節(jié)點(diǎn)只能在程序框圖中使用,不方便在前面板進(jìn)行改動(dòng),假期無(wú)聊,于是自己自制一個(gè)前面板表達(dá)式節(jié)點(diǎn)vi,分享之。
    發(fā)表于 11-05 15:53

    表達(dá)式節(jié)點(diǎn)

    labview我用表達(dá)式節(jié)點(diǎn)求sin(x),跟計(jì)算器結(jié)果不同,是出自哪里的問(wèn)題?求解
    發(fā)表于 03-25 10:30

    shell正則表達(dá)式學(xué)習(xí)

    正則表達(dá)式計(jì)算機(jī)科學(xué)中,是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串的單個(gè)字符串。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來(lái)檢索和/或替換那些符合某個(gè)模式的文本內(nèi)容。許多
    發(fā)表于 07-25 17:18

    請(qǐng)問(wèn)labview如何計(jì)算字符串的正表達(dá)式

    labview如何計(jì)算字符串的正表達(dá)式,如:SHORT_OK(65535 Kohm,1000 Kohm):pass,他的正表達(dá)式是什么,是怎么計(jì)算的,怎么分析出來(lái)的,有相關(guān)資料嗎?
    發(fā)表于 01-06 22:16

    防范表達(dá)式的失控

    在C 語(yǔ)言中,表達(dá)式是最重要的組成部分之一,幾乎所有的代碼都由表達(dá)式構(gòu)成。表達(dá)式的使用如此廣泛,讀者也許會(huì)產(chǎn)生這樣的疑問(wèn),像+ 、- 、3 、/ 、& & 這樣簡(jiǎn)單的運(yùn)算也會(huì)出現(xiàn)
    發(fā)表于 04-22 16:57 ?13次下載

    正則表達(dá)式學(xué)習(xí)心得

    正則表達(dá)式學(xué)習(xí)心得
    發(fā)表于 10-30 08:41 ?8次下載
    正則<b class='flag-5'>表達(dá)式</b><b class='flag-5'>學(xué)習(xí)</b>心得

    Python正則表達(dá)式學(xué)習(xí)指南

    本文介紹了Python對(duì)于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫(kù)的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫(xiě)高效的正則表達(dá)式、如何優(yōu)化正則
    發(fā)表于 09-15 08:00 ?0次下載
    Python正則<b class='flag-5'>表達(dá)式</b>的<b class='flag-5'>學(xué)習(xí)</b>指南

    Python正則表達(dá)式指南

    本文介紹了Python對(duì)于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫(kù)的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫(xiě)高效的正則表達(dá)式、如何優(yōu)化正則
    發(fā)表于 03-26 09:13 ?10次下載
    Python正則<b class='flag-5'>表達(dá)式</b>指南

    Lambda表達(dá)式詳解

    C++11中的Lambda表達(dá)式用于 **定義并創(chuàng)建匿名的函數(shù)對(duì)象** ,以簡(jiǎn)化編程工作。下面看一下Lambda表達(dá)式的基本構(gòu)成。
    的頭像 發(fā)表于 02-09 11:28 ?1499次閱讀

    表達(dá)式與邏輯門之間的關(guān)系

    邏輯表達(dá)式是指表示一個(gè)表示邏輯運(yùn)算關(guān)系的式子,是一個(gè)抽象的類似數(shù)學(xué)表達(dá)式,下面我們重點(diǎn)說(shuō)明下其表達(dá)式與邏輯門之間的關(guān)系。
    的頭像 發(fā)表于 02-15 14:54 ?2000次閱讀
    <b class='flag-5'>表達(dá)式</b>與邏輯門之間的關(guān)系

    C語(yǔ)言的表達(dá)式

    在C語(yǔ)言中,表達(dá)式是由操作符和操作數(shù)組成。表達(dá)式可以由一個(gè)或者多個(gè)操作數(shù)組成,不同的操作符與操作數(shù)組成不同的表達(dá)式,因此,表達(dá)式才是C語(yǔ)言的基本。
    的頭像 發(fā)表于 02-21 15:09 ?1721次閱讀
    C語(yǔ)言的<b class='flag-5'>表達(dá)式</b>

    一文詳解Verilog表達(dá)式

    表達(dá)式由操作符和操作數(shù)構(gòu)成,其目的是根據(jù)操作符的意義得到一個(gè)計(jì)算結(jié)果。表達(dá)式可以在出現(xiàn)數(shù)值的任何地方使用。
    的頭像 發(fā)表于 05-29 16:23 ?3110次閱讀
    一文詳解Verilog<b class='flag-5'>表達(dá)式</b>

    zabbix觸發(fā)器表達(dá)式 基本RS觸發(fā)器表達(dá)式 rs觸發(fā)器的邏輯表達(dá)式

    zabbix觸發(fā)器表達(dá)式 基本RS觸發(fā)器表達(dá)式 rs觸發(fā)器的邏輯表達(dá)式? Zabbix是一款開(kāi)源的監(jiān)控軟件,它能通過(guò)監(jiān)控指標(biāo)來(lái)實(shí)時(shí)監(jiān)測(cè)服務(wù)器和網(wǎng)絡(luò)的運(yùn)行狀態(tài),同時(shí)還能提供警報(bào)和報(bào)告等功能來(lái)幫助管理員
    的頭像 發(fā)表于 08-24 15:50 ?1827次閱讀