從組合語言轉為位元組碼應該盡可能的少坑。
控制流應該容易檢測來幫助進行形式驗證與優化。
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單元 特殊變數和函式 表示式和控制結構 控制...