表示式目錄樹(一)

2022-02-11 09:17:47 字數 3683 閱讀 1289

(一)

lambda

建立表示式目錄樹

expression

<

func

<

int, 

int, 

int>>

exp1 

=(a, b) 

=>a *

b+2;

說明一下:

func

func

<

(of 

<

(t1, t2, tresult

>

)>

)泛型委託:封裝乙個具有兩個引數並返回 tresult 引數指定的型別值的方法。

t1:此委託封裝的方法的第乙個引數型別。

t2:此委託封裝的方法的第二個引數型別。

tresult:此委託封裝的方法的返回值型別。

例如:現在求2個int型別的和

(1) 原始的方法

public

intadd(

inta, 

intb)

(2)通過委託來實現

delegate

intdeleadd(

inta, 

intb);

public

void

deleconcrete()

(3)直接通過泛型委託func來實現

public

intgetfunc(

inta,

intb)

(二)分解表示式目錄樹

這點可能想到小學數學中的四則運算。對於

a*b+2

來說,先算乘,再算加

用圖表示為:

每個矩形框為乙個節點(表示式型別),節點有多種型別。

附表表示式型別:

說明

binaryexpression

表示包含二元運算子的表示式。

conditionalexpression

表示包含條件運算子的表示式。

constantexpression

表示具有常量值的表示式。

elementinit

表示ienumerable

集合的單個元素的初始值設定項。

expression

提供一種基類,表示表示式目錄樹節點的類派生自該基類。它還包含用來建立各種節點型別的

static

(在visual basic

中為shared

)工廠方法。這是乙個

abstract

類。expression)>)

以表示式目錄樹的形式將強型別

lambda

表示式表示為資料結構。無法繼承此類。

invocationexpression

表示將委託或

lambda

表示式應用於引數表示式列表的表示式。

lambdaexpression

描述乙個

lambda

表示式。

listinitexpression

表示包含集合初始值設定項的構造函式呼叫。

memberassignment

表示初始化新建立物件的字段或屬性。

memberbinding

提供一種基類,該基類派生表示繫結的類,這些繫結用於初始化新建立物件的成員。

memberexpression

表示訪問欄位或屬性。

memberinitexpression

表示呼叫建構函式並初始化新物件的乙個或多個成員。

memberlistbinding

表示初始化新建立物件的集合成員的元素。

membermemberbinding

表示初始化新建立物件的成員的成員。

methodcallexpression

表示呼叫一種方法。

newarrayexpression

表示建立新陣列並可能初始化該新陣列的元素。

newexpression

表示構造函式呼叫。

parameterexpression

表示命名的引數表示式。

typebinaryexpression

表示表示式和型別之間的操作。

unaryexpression

表示包含一元運算子的表示式。

而這個(a+b)*2

的幾個節點:

·a,b

是引數,型別為

parameterexpression·+

,*,為二元運符,型別為

binaryexpression·2

為常量,型別為

constantexpression

(三)通過表示式型別來建立目錄樹

a*b+2

節點有4個,2

個引數,

2個運算子,

1個常量

·兩個引數

//兩個引數

parameterexpression a 

=expression.parameter(

typeof

(int

), "a"

);parameterexpression b 

=expression.parameter(

typeof

(int

), "b"

); //

求積binaryexpression multi

=expression.multiply(a,b); 

//常量

constantexpression x2 

=expression.constant(

2); 

//求和

binaryexpression add 

=expression.add(multi, x2); 

//建立乙個表示lambda表示式的物件

lambdaexpression lexp 

=expression.lambda

<

func

<

int, 

int, 

int>>

(add, a, b); 

//檢視表示式

console.writeline(lexp.tostring());

建立方法是通過

expression

的工廠方法來建立。

(四)使用

expression

<

func

<

int, 

int, 

int>>

lexp 

=expression.lambda

<

func

<

int, 

int, 

int>>

(add, a, b);

func

<

int, 

int, 

int>

fun 

=lexp.compile();

console.writeline(fun(3,

5));

ms-help:

C Expression表示式目錄樹

expression就是表示式目錄樹,是以樹形資料結構表示 其中每乙個節點都是一種表示式。用lambda表示式來建立乙個簡單的expression 使用lambda表示式,編譯器在生成il時會幫我們拼裝表示式目錄樹,示例 expression expr a,b a b 3 除錯檢視表示式的結構 手動...

EXpression 表示式目錄樹

表示式樹 前面n 1的是乙個表示式 最後乙個是乙個表示式 一直拆開拆到最後 繼承expressionvisitor的類 可以重寫獲取到表示式樹的方法進行擴張和改寫 委託是編譯成乙個方法 表示式樹不是的 是一種資料結構 但是通過exp.compile 方法編譯後就是乙個委託 能進行compile 的只...

表示式 表示式樹 表示式求值

總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入輸入分...