#ifndef SEMANTICS_H
#define SEMANTICS_H
#include "const.h"
typedef struct CNode CNode;
typedef struct CTable *CTable_t;
typedef struct CType CType;
typedef CType *CType_t;
typedef struct CVar CVar;
typedef CVar *CVar_t;
typedef struct CSymbol CSymbol;
typedef CSymbol *CSymbol_t;
typedef struct CDef CDef;
typedef CDef *CDef_t;
struct CVar {
const char *name;
CVar_t next; /* next in the linked list */
CType_t type;
int start;
CNode *ast;
};
CVar_t cvar_create(const char *name, CType_t type, CNode *ast);
void cvar_print(CVar_t cv);
struct CType {
enum {
CINT,
CCHAR,
CVOID,
CSTRUCT,
CUNION,
CARR,
CPTR,
CFUNC
} type;
const char *name;
union {
struct {
CTable_t fields; /* for a struct or union */
CVar_t flist;
} st;
CType_t ref; /* for a pointer */
struct {
CType_t elem;
int len;
} arr; /* for an array */
struct {
CVar_t params;
CVar_t local;
CType_t ret;
CNode *body;
} func; /* for a function */
} rec;
int size; /* memory footprint */
CNode *ast;
};
CType_t ctype_create(const char *name, int type, CNode *ast);
void ctype_debug_print(CType_t ct);
typedef unsigned int (*Hashfunc_t) (const char *);
typedef const char *(*Printfunc_t) (void *);
typedef struct CTNode CTNode;
struct CTNode {
const char *key;
void *val;
CTNode *next;
int lvl;
};
typedef struct CTable {
CTNode *head[MAX_TABLE_SIZE];
Hashfunc_t hfunc;
Printfunc_t pfunc;
} CTable;
CTable_t ctable_create(Hashfunc_t hfunc, Printfunc_t pfunc);
void ctable_destroy(CTable_t ct);
void *ctable_lookup(CTable_t ct,