};
struct stmt {
- enum {sassign, sif, sreturn, sexpr, swhile} type;
+ enum {sassign, sif, sreturn, sexpr, svardecl, swhile} type;
union {
struct {
char *ident;
int nels;
struct stmt **els;
} sif;
+ struct vardecl *svardecl;
struct expr *sreturn;
struct expr *sexpr;
struct {
char *ident;
int nargs;
struct expr **args;
+ int nfields;
+ enum fieldspec *fields;
} efuncall;
int eint;
struct {
struct expr *left;
struct expr *right;
} etuple;
- char *estring;
+ struct {
+ int nchar;
+ char *chars;
+ } estring;
struct {
enum unop op;
struct expr *l;
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();