Solidity語言學習筆記 39 獨立彙編

2021-08-20 21:24:39 字數 2266 閱讀 3970

從組合語言轉為位元組碼應該盡可能的少坑。

控制流應該容易檢測來幫助進行形式驗證與優化。

pragma solidity ^0.4.16;

contract c

}

default

// memory allocator

function $allocate(size) -> pos

// the contract function

function f(x) -> y lt(i, x)

}}

將符號流轉為下述定義的語法結構的ast。

註冊塊中定義的識別符號,標註從**開始(根據ast節點的註解),變數可以被訪問。

assemblyblock = ''

assemblyitem =

identifier |

assemblyblock |

assemblyexpression |

assemblylocaldefinition |

assemblyassignment |

assemblystackassignment |

labeldefinition |

assemblyif |

assemblyswitch |

assemblyfunctiondefinition |

assemblyfor |

'break' |

'continue' |

subassembly

assemblyexpression = assemblycall | identifier | assemblyliteral

assemblyliteral = numberliteral | stringliteral | hexliteral

identifier = [a-za-z_$] [a-za-z_0-9]*

assemblycall = identifier '(' ( assemblyexpression ( ',' assemblyexpression )* )? ')'

assemblylocaldefinition = 'let' identifierorlist ( ':=' assemblyexpression )?

assemblyassignment = identifierorlist ':=' assemblyexpression

identifierorlist = identifier | '(' identifierlist ')'

identifierlist = identifier ( ',' identifier)*

assemblystackassignment = '=:' identifier

labeldefinition = identifier ':'

assemblyif = 'if' assemblyexpression assemblyblock

assemblyswitch = 'switch' assemblyexpression assemblycase*

( 'default' assemblyblock )?

assemblycase = 'case' assemblyexpression assemblyblock

assemblyfunctiondefinition = 'function' identifier '(' identifierlist? ')'

( '->' '(' identifierlist ')' )? assemblyblock

assemblyfor = 'for' ( assemblyblock | assemblyexpression )

assemblyexpression ( assemblyblock | assemblyexpression ) assemblyblock

subassembly = 'assembly' identifier assemblyblock

numberliteral = hexnumber | decimalnumber

hexliteral = 'hex' ('"' ([0-9a-fa-f])* '"' | '\'' ([0-9a-fa-f])* '\'')

stringliteral = '"' ([^"\r\n\\] | '\\' .)* '"'

hexnumber = '0x' [0-9a-fa-f]+

decimalnumber = [0-9]+

Solidity語言學習筆記 34 繼承

pragma solidity 0.4.16 contract owned address owner 使用 is 繼承另乙個合約。子合約可以訪問所有非私有成員,包括 內部函式和狀態變數。不過,不能通過 this 來外部訪問這些。contract mortal is owned 這些抽象合約僅用於建...

Solidity語言學習 (三)

使用var關鍵字時,第一次賦值給變數,編譯器會自動推斷變數的型別,而且推斷後不能更改這個變數的型別了,如果更改了就會出錯,還有就是不能在函式引數中使用。注意 有時候var會推斷出乙個錯誤的型別。案例 pragma solidity 0.4.18 contract var 結果為 solidity中v...

Solidity學習筆記(3)

在此後的學習,將更加深入理解solidity的方方面面 solidity原始檔的布局 引入其他的原始檔 注釋合約的結構 型別變數型別 列舉 參考型別對映 包括左賦值的操作符 在基本型別間的轉換 型別匯出 單元區域性和全域性可見變數 ether單元 time單元 特殊變數和函式 表示式和控制結構 控制...