ref: ac297020506255ca01cde01c14145f3203d1a155
dir: /mparse/dump.myr/
use std
use "types.use"
use "util.use"
pkg parse =
;;
const __init__ = {
var f : file
var d : dcl
var st : stab
var e : expr
std.fmtinstall(std.typeof(&f), fmtfile, [][:])
std.fmtinstall(std.typeof(&d), fmtdcl, [][:])
/*std.fmtinstall(std.typeof(&n), fmtnode, [][:])*/
std.fmtinstall(std.typeof(&e), fmtexpr, [][:])
std.fmtinstall(std.typeof(&st), fmtstab, [][:])
}
/*
const fmtnode = {sb, ap, opts
var f : node#
f = std.vanext(ap)
nodedump(sb, f, 0)
}
*/
generic fmtfile = {sb, ap, opts
var f : file#
f = std.vanext(ap)
filedump(sb, f, 0)
}
const fmtdcl = {sb, ap, opts
var f : dcl#
f = std.vanext(ap)
dcldump(sb, f, 0)
}
const fmtstab = {sb, ap, opts
var f : stab#
f = std.vanext(ap)
stabdump(sb, f, 0)
}
const fmtexpr = {sb, ap, opts
var f : expr#
f = std.vanext(ap)
exprdump(sb, f)
}
const filedump = {sb, f, ind
ifmt(sb, ind, "file: {}\n", f.path)
for u in f.uses
match u
| `Ulocal l: ifmt(sb, ind + 1, "local-use:\t{}\n", l)
| `Ulib l: ifmt(sb, ind + 1, "lib-use:\t{}\n", l)
;;
;;
ifmt(sb, ind, "libs: {}\n", f.extlibs)
ifmt(sb, ind, "extlibs: {}\n", f.extlibs)
for i in f.extinit
dcldump(sb, i, ind + 1)
;;
match f.init
| `std.Some d: dcldump(sb, d, ind + 1)
| `std.None:
;;
stabdump(sb, f.builtin, ind + 1)
stabdump(sb, f.globls, ind + 1)
for s in f.dcls
dcldump(sb, s, ind + 1)
;;
}
const dcldump = {sb, dcl, ind
ifmt(sb, ind, "{}: {} {}: {}\t", dcl.id, dcl.vis, dcl.name, dcl.ty)
ifmt(sb, ind + 2, "globl:{}, const:{}, noret:{}, init:{}, exportinit:{}\n", \
dcl.isglobl, dcl.isconst, dcl.isnoret, dcl.isinit, dcl.isexportinit)
ifmt(sb, ind + 2, "extern:{}, import:{}, hidden:{}, pkglocal:{}, generic:{}\n", \
dcl.isextern, dcl.isimport, dcl.ishidden, dcl.ispkglocal, dcl.isgeneric)
ifmt(sb, ind + 1, "{}", dcl.init)
}
const exprdump = {sb, e
match e#
| [.e = `Oadd (a, b)]: std.sbfmt(sb, "{} + {}", a, b)
| [.e = `Osub (a, b)]: std.sbfmt(sb, "{} - {}", a, b)
| [.e = `Omul (a, b)]: std.sbfmt(sb, "{} * {}", a, b)
| [.e = `Odiv (a, b)]: std.sbfmt(sb, "{} / {}", a, b)
| [.e = `Omod (a, b)]: std.sbfmt(sb, "{} % {}", a, b)
| [.e = `Oneg exp]: std.sbfmt(sb, "-{}", exp)
| [.e = `Obor (a, b)]: std.sbfmt(sb, "{} | {}", a, b)
| [.e = `Oband (a, b)]: std.sbfmt(sb, "{} & {}", a, b)
| [.e = `Obxor (a, b)]: std.sbfmt(sb, "{} ^ {}", a, b)
| [.e = `Obsl (a, b)]: std.sbfmt(sb, "{} << {}", a, b)
| [.e = `Obsr (a, b)]: std.sbfmt(sb, "{} >> {}", a, b)
| [.e = `Obnot exp]: std.sbfmt(sb, "~{}", exp)
| [.e = `Opreinc exp]: std.sbfmt(sb, "++{}", exp)
| [.e = `Opostinc exp]: std.sbfmt(sb, "{}++", exp)
| [.e = `Opredec exp]: std.sbfmt(sb, "++{}", exp)
| [.e = `Opostdec exp]: std.sbfmt(sb, "{}--", exp)
| [.e = `Oaddr exp]: std.sbfmt(sb, "&{}", exp)
| [.e = `Oderef exp]: std.sbfmt(sb, "{}#", exp)
| [.e = `Olor (a, b)]: std.sbfmt(sb, "{} || {}", a, b)
| [.e = `Oland (a, b)]: std.sbfmt(sb, "{} && {}", a, b)
| [.e = `Olnot exp]: std.sbfmt(sb, "!{}", exp)
| [.e = `Oeq (a, b)]: std.sbfmt(sb, "{} == {}", a, b)
| [.e = `One (a, b)]: std.sbfmt(sb, "{} != {}", a, b)
| [.e = `Ogt (a, b)]: std.sbfmt(sb, "{} > {}", a, b)
| [.e = `Oge (a, b)]: std.sbfmt(sb, "{} >= {}", a, b)
| [.e = `Olt (a, b)]: std.sbfmt(sb, "{} < {}", a, b)
| [.e = `Ole (a, b)]: std.sbfmt(sb, "{} <= {}", a, b)
| [.e = `Oasn (a, b)]: std.sbfmt(sb, "{} = {}", a, b)
| [.e = `Oaddeq (a, b)]: std.sbfmt(sb, "{} += {}", a, b)
| [.e = `Osubeq (a, b)]: std.sbfmt(sb, "{} -= {}", a, b)
| [.e = `Omuleq (a, b)]: std.sbfmt(sb, "{} *= {}", a, b)
| [.e = `Odiveq (a, b)]: std.sbfmt(sb, "{} /= {}", a, b)
| [.e = `Omodeq (a, b)]: std.sbfmt(sb, "{} %= {}", a, b)
| [.e = `Oboreq (a, b)]: std.sbfmt(sb, "{} |= {}", a, b)
| [.e = `Obandeq (a, b)]: std.sbfmt(sb, "{} &= {}", a, b)
| [.e = `Obxoreq (a, b)]: std.sbfmt(sb, "{} ^= {}", a, b)
| [.e = `Obsleq (a, b)]: std.sbfmt(sb, "{} <<= {}", a, b)
| [.e = `Obsreq (a, b)]: std.sbfmt(sb, "{} >>= {}", a, b)
| [.e = `Oidx (a, b)]: std.sbfmt(sb, "{}[{}]", a, b)
| [.e = `Oslice (a, b, c)]: std.sbfmt(sb, "{}[{} : {}]", a, b, c)
| [.e = `Omemb (a, memb)]: std.sbfmt(sb, "{}.{}", a, memb)
| [.e = `Osize ty]: std.sbfmt(sb, "sizeof({})", ty)
| [.e = `Ocast exp]: std.sbfmt(sb, "{} castto({})", exp)
| [.e = `Oret exp]: std.sbfmt(sb, "-> {}", exp)
| [.e = `Ojmp name]: std.sbfmt(sb, "goto {}", name)
| [.e = `Obreak]: std.sbfmt(sb, "break")
| [.e = `Ocontinue]: std.sbfmt(sb, "continue")
| [.e = `Ovar name]: std.sbfmt(sb, "{}", name)
| [.e = `Ogap]: std.sbfmt(sb, "_")
| [.e = `Olit lit]: std.sbfmt(sb, "{}", lit)
| [.e = `Ocall (f, args)]: std.sbfmt(sb, "{}({})", f, args)
| [.e = `Oucon (t, `std.Some v)]:
std.sbfmt(sb, "{} {}", t, v)
| [.e = `Oucon (t, `std.None)]:
std.sbfmt(sb, "{}", t)
| [.e = `Otup al]:
std.sbfmt(sb, "{}", al)
| [.e = `Ostruct ml]:
std.sbfmt(sb, "{}", ml)
| [.e = `Oarr il]:
std.sbfmt(sb, "{}", il)
| [.e = `Oidxlen]:
std.sbfmt(sb, "$")
;;
}
const stabdump = {sb, st, ind
var keys
if st.name.len != 0
ifmt(sb, ind, "ns: {}", st.name)
;;
keys = std.htkeys(st.syms)
for k in keys
match std.get(std.htget(st.syms, k))
| `Dcl d: ifmt(sb, ind, "{} : {}\n", k, d.ty)
| `Ucon uc: ifmt(sb, ind, "{} : {}\n", k, uc.ety)
;;
;;
std.slfree(keys)
keys = std.htkeys(st.types)
for k in keys
match std.get(std.htget(st.types, k))
| `Tyfwd: ifmt(sb, ind, "type {} [PROTO]", k)
| `Trfwd: ifmt(sb, ind, "trait {} [PROTO]", k)
| `Tydef d: ifmt(sb, ind, "type {} = {}\n", k, d)
| `Trdef tr: ifmt(sb, ind, "trait {} = ...\n", k)
;;
;;
std.slfree(keys)
}