shithub: mc

ref: da5bfc6d15a50130afdcd37ed9af737a81724506
dir: /mparse/types.myr/

View raw version
use std

pkg parse =
	type srcloc = struct
		file	: byte[:]
		line	: int
		col	: int
	;;

	type attr = union
		`Attrpkglocal
		`Attrextern
		`Attrnoret
	;;

	type file = struct
		path	: byte[:]
		uses	: usefile[:]
		libs	: byte[:][:]
		extlibs	: byte[:][:]
		extinit	: dcl#[:]
		init	: std.option(dcl#)
		builtin	: stab#
		globls	: stab#
		ns	: std.htab(byte[:], stab#)#
		dcls	: dcl#[:]
	;;

	type node = union
		`Nexpr	expr
		`Nlit	lit
		`Nloop	loopstmt
		`Niter	iterstmt
		`Nif	ifstmt
		`Nmatch matchstmt
		`Ncase	matchcase
		`Ndcl	dcl#
		`Nfunc	func
		`Ntrait traitdef
		`Nimpl	impldef
	;;

	type tydef = struct
		ty	: ty
		id	: int32
		loc	: srcloc
		fixed	: bool
		found	: bool
		traits	: std.bitset#
	;;
		
	type ty = union
		`Tyvoid
		`Tybool
		/* integers */
		`Tyint8
		`Tyint16
		`Tyint32
		`Tyint
		/* unsigned integers */
		`Tychar
		`Tybyte
		`Tyint64
		`Tyuint8
		`Tyuint16
		`Tyuint32
		`Tyuint
		`Tyuint64
		/*floats */
		`Tyflt32
		`Tyflt64
		/* a bit odd.. */
		`Tyvalist
		/* compound types */
		`Tyslice tydef#
		`Typtr tydef#
		`Tyarray (tydef#, node#)
		`Tystruct (dcl#[:])
		`Tyunion (ucon#[:])
		/* user defined types */
		`Tygeneric (tydef#[:], tydef#)
		`Tyname	(tydef#[:], tydef#)
		`Typaram byte[:]
		`Tyvar int64
	;;

	type ucon = struct
		loc	: srcloc
		name	: name#
		uty	: tydef#
		ety	: std.option(tydef#)
	;;

	type impldef = struct
		vis	: vis
		tr	: name#
		ty	: tydef#
		aux	: tydef#[:]
		dcls	: dcl#[:]
		isimport	: bool
	;;

	type expr = struct
		ty	: tydef#
		loc	: srcloc
		e	: union
			`Oadd	(node#, node#)
			`Osub	(node#, node#)
			`Omul	(node#, node#)
			`Odiv	(node#, node#)
			`Omod	(node#, node#)
			`Oneg	node#
			`Obor	(node#, node#)
			`Oband	(node#, node#)
			`Obxor	(node#, node#)
			`Obsl	(node#, node#)
			`Obsr	(node#, node#)
			`Obnot	node#
			`Opreinc	node#
			`Opostinc	node#
			`Opredec	node#
			`Opostdec	node#
			`Oaddr	node#
			`Oderef	node#
			`Olor	(node#, node#)
			`Oland	(node#, node#)
			`Olnot	node#
			`Oeq	(node#, node#)
			`One	(node#, node#)
			`Ogt	(node#, node#)
			`Oge	(node#, node#)
			`Olt	(node#, node#)
			`Ole	(node#, node#)
			`Oasn	(node#, node#)
			`Oaddeq	(node#, node#)
			`Osubeq	(node#, node#)
			`Omuleq	(node#, node#)
			`Odiveq	(node#, node#)
			`Omodeq	(node#, node#)
			`Oboreq	(node#, node#)
			`Obandeq	(node#, node#)
			`Obxoreq	(node#, node#)
			`Obsleq	(node#, node#)
			`Obsreq	(node#, node#)
			`Oidx	(node#, node#)
			`Oslice	(node#, node#, node#)
			`Omemb	(node#, byte[:])
			`Osize	ty#
			`Ocall	(node#, node#[:])
			`Ocast	node#
			`Oret	node#
			`Ojmp	name#
			`Obreak
			`Ocontinue
			`Ovar	name#
			`Ogap
			`Olit	lit
			`Oucon	(name#, std.option(node#))
			`Otup	node#[:]
			`Ostruct	(name#, node#)[:]
			`Oarr	(node#, node#)[:]
			`Oidxlen
		;;
	;;

	type dcl = struct
		id	: int32
		name	: name
		vis	: vis

		ty	: tydef#
		init	: expr#
		tr	: traitdef#
		impls	: std.htab(tydef#, dcl#)

		isglobl	: bool
		isconst	: bool
		isnoret	: bool
		isinit	: bool
		isexportinit	: bool
		isextern	: bool
		isimport	: bool
		ishidden	: bool
		ispkglocal	: bool
		isgeneric	: bool
	;;

	type loopstmt = struct
		init	: expr#
		cond	: expr#
		step	: expr#
		body	: block#
		scope	: stab#
	;;

	type iterstmt = struct
		elt	: expr#
		seq	: expr#
		body	: block#
	;;

	type ifstmt = struct
		cond	: expr#
		iftrue	: block#
		iffalse	: block#
	;;

	type block = struct
		stab	: stab#
		stmts	: node#[:]
	;;

	type matchstmt = struct
		val	: expr#
		matches	: matchcase#[:]
	;;

	type matchcase = struct
		expr	: node#
		blk	: block#
	;;

	type lit = union
		`Lint	uint64
		`Lflt	flt64
		`Lchr	char
		`Lstr	byte[:]
		`Llbl	byte[:]
		`Lbool	bool
		`Lvoid
	;;

	type traitdef = struct
		id	: int32
		loc	: srcloc
		vis	: vis
		name	: name
		param	: tydef#
		aux	: tydef#[:]
		memb	: dcl#[:]
		funcs	: dcl#[:]
	;;

	type usefile = union
		`Ulocal	byte[:]
		`Ulib	byte[:]
	;;

	type func = struct
		stab	: stab#
		ty	: tydef#
		args	: dcl#[:]
		body	: block#
	;;

	type stab = struct
		super	: std.option(stab#)
		name	: byte[:]
		isfunc	: bool

		syms	: std.htab(name, sym)#
		types	: std.htab(name, tysym)#
		impls	: std.htab(name, node#)#
		env	: std.htab(name, node#)#
	;;

	type sym = union
		`Dcl	dcl#
		`Ucon	ucon#
	;;

	type tysym = union
		`Tyfwd
		`Trfwd
		`Tydef	tydef#
		`Trdef	traitdef#
	;;

	type name = struct
		ns	: byte[:]
		name	: byte[:]
	;;

	type vis = union
		`Visintern
		`Vishidden
		`Visexport
		`Visbuiltin
	;;
;;