blob: 914f00334fbfefef28665b5a7e08fd14ee41182c [file] [log] [blame] [edit]
;;
;; Binary Format of Values
;;
;; Numbers
grammar Bbyte : byte = 0x00 | ... | 0xFF
grammar BuN(N) : uN(N) hint(show `Bu#%) hint(macro "BuNX") =
| n:Bbyte => n -- if $(n < 2^7 /\ n < 2^N)
| n:Bbyte m:BuN(($(N-7))) => $(2^7 * m + (n - 2^7)) -- if $(n >= 2^7 /\ N > 7)
grammar BsN(N) : sN(N) hint(show `Bs#%) hint(macro "BsNX") =
| n:Bbyte => n -- if $(n < 2^6 /\ n < 2^(N-1))
| n:Bbyte => $(n - 2^7) -- if $(2^6 <= n < 2^7 /\ n >= 2^7 - 2^(N-1))
| n:Bbyte i:BuN(($(N-7))) => $(2^7 * i + (n - 2^7)) -- if $(n >= 2^7 /\ N > 7)
grammar BiN(N) : iN(N) hint(show `Bi#%) hint(macro "BiNX") =
| i:BsN(N) => $inv_signed_(N, i)
grammar BfN(N) : fN(N) hint(show `Bf#%) hint(macro "BfNX") =
| b*:Bbyte^(N/8) => $inv_fbytes_(N, b*)
grammar Bu32 : u32 = n:BuN(32) => n
grammar Bu64 : u64 = n:BuN(64) => n
grammar Bs33 : s33 = i:BsN(33) => i
grammar Bf32 : f32 = p:BfN(32) => p
grammar Bf64 : f64 = p:BfN(64) => p
;; Lists
grammar Blist(grammar BX : el) : el* =
| n:Bu32 (el:BX)^n => el^n
;; Names
var ch : char
def $cont(byte) : nat hint(macro none)
def $cont(b) = $(b - 0x80) -- if (0x80 < b < 0xC0)
;; def $utf8(char*) : byte*
def $utf8(ch*) = $concat_(byte, $utf8(ch)*)
def $utf8(ch) = b
-- if ch < U+0080
-- if ch = b
def $utf8(ch) = b_1 b_2
-- if U+0080 <= ch < U+0800
-- if ch = $(2^6*(b_1 - 0xC0) + $cont(b_2))
def $utf8(ch) = b_1 b_2 b_3
-- if U+0800 <= ch < U+D800 \/ U+E000 <= ch < U+10000
-- if ch = $(2^12*(b_1 - 0xE0) + 2^6*$cont(b_2) + $cont(b_3))
def $utf8(ch) = b_1 b_2 b_3 b_4
-- if U+10000 <= ch < U+11000
-- if ch = $(2^18*(b_1 - 0xF0) + 2^12*$cont(b_2) + 2^6*$cont(b_3) + $cont(b_4))
grammar Bname : name =
| b*:Blist(Bbyte) => name -- if $utf8(name) = b*
;; Indices
grammar Btypeidx : typeidx = x:Bu32 => x
grammar Btagidx : tagidx = x:Bu32 => x
grammar Bglobalidx : globalidx = x:Bu32 => x
grammar Bmemidx : memidx = x:Bu32 => x
grammar Btableidx : tableidx = x:Bu32 => x
grammar Bfuncidx : funcidx = x:Bu32 => x
grammar Bdataidx : dataidx = x:Bu32 => x
grammar Belemidx : elemidx = x:Bu32 => x
grammar Blocalidx : localidx = x:Bu32 => x
grammar Blabelidx : labelidx = l:Bu32 => l
grammar Bexternidx : externidx =
| 0x00 x:Bfuncidx => FUNC x
| 0x01 x:Btableidx => TABLE x
| 0x02 x:Bmemidx => MEM x
| 0x03 x:Bglobalidx => GLOBAL x
| 0x04 x:Btagidx => TAG x