#include <stdbool.h>
#include "util.h"
+#include "type.h"
struct ast;
-#include "y.tab.h"
+#include "parse.h"
+extern const char *fieldspec_str[];
+extern const char *binop_str[];
+extern const char *unop_str[];
struct ast {
int ndecls;
struct decl **decls;
char *ident;
struct expr *expr;
};
-
-enum basictype {btbool, btchar, btint, btvoid};
-struct type {
- enum {tbasic,tlist,ttuple,tvar} type;
- union {
- enum basictype tbasic;
- struct type *tlist;
- struct {
- struct type *l;
- struct type *r;
- } ttuple;
- char *tvar;
- } data;
+struct fundecl {
+ char *ident;
+ int nargs;
+ char **args;
+ int natypes;
+ struct type **atypes;
+ struct type *rtype;
+ int nbody;
+ struct stmt **body;
};
struct decl {
- enum {dfundecl, dvardecl} type;
+ //NOTE: DON'T CHANGE THIS ORDER
+ enum {dcomp, dvardecl, dfundecl} type;
union {
struct {
- char *ident;
- int nargs;
- char **args;
- int natypes;
- struct type **atypes;
- struct type *rtype;
- int nvar;
- struct vardecl **vars;
- int nbody;
- struct stmt **body;
- } dfun;
+ int ndecls;
+ struct fundecl **decls;
+ } dcomp;
+ struct fundecl *dfun;
struct vardecl *dvar;
} data;
};
struct stmt {
- enum {sassign, sif, sreturn, sexpr, swhile} type;
+ enum {sassign, sif, sreturn, sexpr, svardecl, swhile} type;
union {
struct {
char *ident;
+ int nfields;
+ char **fields;
struct expr *expr;
} sassign;
struct {
int nels;
struct stmt **els;
} sif;
+ struct vardecl *svardecl;
struct expr *sreturn;
struct expr *sexpr;
struct {
enum unop {negate,inverse};
struct expr {
enum {ebinop, ebool, echar, efuncall, eident, eint, enil, etuple,
- eunop} type;
+ estring, eunop} type;
union {
bool ebool;
struct {
char *ident;
int nargs;
struct expr **args;
+ int nfields;
+ enum fieldspec *fields;
} efuncall;
int eint;
struct {
struct expr *left;
struct expr *right;
} etuple;
+ struct {
+ int nchars;
+ char *chars;
+ } estring;
struct {
enum unop op;
struct expr *l;
struct ast *ast(struct list *decls);
struct vardecl *vardecl(struct type *type, char *ident, struct expr *expr);
+struct fundecl *fundecl(char *ident, struct list *args, struct list *atypes,
+ struct type *rtype, struct list *body);
-struct decl *decl_fun(char *ident, struct list *args, struct list *atypes,
- struct type *rtype, struct list *vars, struct list *body);
+struct decl *decl_fun(struct fundecl *fundecl);
struct decl *decl_var(struct vardecl *vardecl);
-struct stmt *stmt_assign(char *ident, struct expr *expr);
+struct stmt *stmt_assign(char *ident, struct list *fields, struct expr *expr);
struct stmt *stmt_if(struct expr *pred, struct list *then, struct list *els);
struct stmt *stmt_return(struct expr *rtrn);
struct stmt *stmt_expr(struct expr *expr);
-struct stmt *stmt_vardecl(struct vardecl vardecl);
+struct stmt *stmt_vardecl(struct vardecl *vardecl);
struct stmt *stmt_while(struct expr *pred, struct list *body);
struct expr *expr_binop(struct expr *l, enum binop op, struct expr *r);
struct expr *expr_bool(bool b);
-struct expr *expr_char(const char *c);
-struct expr *expr_funcall(char *ident, struct list *args);
+struct expr *expr_char(char *c);
+struct expr *expr_funcall(char *ident, struct list *args, struct list *fields);
struct expr *expr_int(int integer);
struct expr *expr_ident(char *ident, struct list *fields);
struct expr *expr_nil();
struct expr *expr_tuple(struct expr *left, struct expr *right);
+struct expr *expr_string(char *str);
struct expr *expr_unop(enum unop op, struct expr *l);
-struct type *type_list(struct type *type);
-struct type *type_tuple(struct type *l, struct type *r);
-struct type *type_var(char *ident);
-
void ast_print(struct ast *, FILE *out);
void vardecl_print(struct vardecl *decl, int indent, FILE *out);
-void decl_print(struct decl *ast, int indent, FILE *out);
+void fundecl_print(struct fundecl *decl, FILE *out);
+void decl_print(struct decl *ast, FILE *out);
void stmt_print(struct stmt *ast, int indent, FILE *out);
void expr_print(struct expr *ast, FILE *out);
-void type_print(struct type *type, FILE *out);
void ast_free(struct ast *);
void vardecl_free(struct vardecl *decl);
+void fundecl_free(struct fundecl *fundecl);
void decl_free(struct decl *ast);
void stmt_free(struct stmt *ast);
void expr_free(struct expr *ast);
-void type_free(struct type *type);
#endif