git @ Cat's Eye Technologies Bhuna / master src / lib / ast.h
master

Tree @master (Download .tar.gz)

ast.h @masterraw · history · blame

#ifndef __AST_H_
#define __AST_H_

#include "vm.h"
#include "value.h"

struct builtin;
struct type;
struct symbol;
struct symbol_table;
struct scan_st;

struct ast_local {
	int			 index;
	int			 upcount;
	struct symbol		*sym;
};

struct ast_value {
	struct value		 value;
};

struct ast_builtin {
	struct builtin		*bi;
	struct ast		*right;		/* ISA arg */
};

struct ast_apply {
	struct ast		*left;		/* ISA var(/...?)  (fn/cmd) */
	struct ast		*right;		/* ISA arg */
	int			 is_pure;
};

struct ast_arg {
	struct ast		*left;		/* ISA arg/apply/var */
	struct ast		*right;		/* ISA arg/apply/var */
};

struct ast_routine {
	struct ast		*body;
};

struct ast_statement {
	struct ast		*left;		/* ISA statement/apply */
	struct ast		*right;		/* ISA statement/apply */
};

struct ast_assignment {
	struct ast		*left;		/* ISA var */
	struct ast		*right;		/* ISA apply/var */
	int			 defining;
};

struct ast_conditional {
	struct ast		*test;		/* ISA apply/var */
	struct ast		*yes;		/* ISA statement/apply */
	struct ast		*no;		/* ISA statement/apply/NULL */
	/*int			 index;*/		/* temp var in act rec */
};

struct ast_while_loop {
	struct ast		*test;		/* ISA apply/var */
	struct ast		*body;		/* ISA statement/apply */
};

struct ast_retr {
	struct ast		*body;		/* ISA apply/var */
};

#define AST_LOCAL	 1
#define AST_VALUE	 2
#define	AST_BUILTIN	 3
#define	AST_APPLY	 4
#define	AST_ARG		 5
#define	AST_ROUTINE	 6
#define	AST_STATEMENT	 7
#define	AST_ASSIGNMENT	 8
#define	AST_CONDITIONAL	 9
#define	AST_WHILE_LOOP	10
#define	AST_RETR	11

union ast_union {
	struct ast_local	local;
	struct ast_value	value;
	struct ast_builtin	builtin;
	struct ast_apply	apply;
	struct ast_arg		arg;
	struct ast_routine	routine;
	struct ast_statement	statement;
	struct ast_assignment	assignment;
	struct ast_conditional	conditional;
	struct ast_while_loop	while_loop;
	struct ast_retr		retr;
};

struct ast {
	int				 type;
	struct scan_st			*sc;
	struct type			*datatype;
	vm_label_t			 label;
	union ast_union			 u;
};

struct ast		*ast_new_local(struct symbol_table *, struct symbol *);
struct ast		*ast_new_value(struct value, struct type *);
struct ast		*ast_new_builtin(struct scan_st *, struct builtin *, struct ast *);
struct ast		*ast_new_apply(struct scan_st *, struct ast *, struct ast *, int);
struct ast		*ast_new_arg(struct ast *, struct ast *);
struct ast		*ast_new_routine(struct ast *);
struct ast		*ast_new_statement(struct ast *, struct ast *);
struct ast		*ast_new_assignment(struct scan_st *, struct ast *, struct ast *, int);
struct ast		*ast_new_conditional(struct scan_st *, struct ast *, struct ast *, struct ast *);
struct ast		*ast_new_while_loop(struct scan_st *, struct ast *, struct ast *);
struct ast		*ast_new_retr(struct ast *);
void			 ast_free(struct ast *);

struct ast		*ast_find_local(struct ast *);
int			 ast_is_constant(struct ast *);
int			 ast_count_args(struct ast *);

void			 ast_dump(struct ast *, int);
char			*ast_name(struct ast *);

#endif /* !__AST_H_ */