diff options
Diffstat (limited to 'src/parser.h')
| -rw-r--r-- | src/parser.h | 58 | 
1 files changed, 35 insertions, 23 deletions
| diff --git a/src/parser.h b/src/parser.h index ba5aa58..62f557b 100644 --- a/src/parser.h +++ b/src/parser.h @@ -8,45 +8,57 @@  #include "lexer.h"  enum { -	PRSDECL,         /* Declaration */ -	PRSNUMERIC,      /* Numeric constant */ -	PRSTYPE,         /* Type */ +	/* Variable declaration, lhs and rhs may be unused +	   ‘x: lhs = rhs’ */ +	ASTDECL, -	PRSBINADD = '+', /* Addition */ +	/* Constant declaration, lhs and rhs may be unused +	   ‘x: lhs : rhs’ */ +	ASTCDECL, + +	/* Function prototype +	   ‘(a: b, c: d) rhs’; aux[lhs].fnproto */ +	ASTFNPROTO, + +	/* Function, lhs is the prototype and rhs is the body block */ +	ASTFN, + +	/* Braced block, sublist[lhs…rhs] */ +	ASTBLK, + +	/* Numeric literal */ +	ASTNUMLIT, + +	/* Typename */ +	ASTTYPE, + +	/* Return statement, rhs may be unused +	   ‘return rhs’ */ +	ASTRET, + +	/* Binary add +	   ‘lhs + rhs’ */ +	ASTBINADD = '+', + +	/* Binary sub +	   ‘lhs - rhs’ */ +	ASTBINSUB = '-',  };  typedef uint8_t ast_kind;  #define AST_SOA_BLKSZ (sizeof(ast_kind) + sizeof(size_t) * 4) -/* - * AST Notes: - * - * Declarations have .lhs set to the type of the symbol being declared and .rhs - * set to the value of the declaration if it is an assignment declaration.  They - * also have aux.constdecl set to true if it’s a declaration of a constant. - */ - -struct auxilliary { -	union extra { -		bool constdecl; -	} *buf; -	size_t len, cap; -}; -  struct ast_soa {  	ast_kind *kinds;  	size_t *lexemes;  	struct {  		size_t lhs, rhs;  	} *kids; -	size_t *extra;  	size_t len, cap; - -	struct auxilliary aux;  }; -#define ast_free(x) do { free((x).kinds); free((x).aux.buf); } while (0) +#define ast_free(x) free((x).kinds)  /* Parse the tokens in TOKS into an abstract syntax tree */  struct ast_soa parsetoks(struct lexemes_soa toks); |