eaxhla/source/eaxhla.h
2024-09-08 05:49:54 +02:00

122 lines
3.2 KiB
C

#ifndef EAXHLA_H
#define EAXHLA_H
#include <tommyds/tommyds/tommyhashtbl.h>
#define WORD_SIZE_IN_BYTES (64/8)
#define MAX_REPEAT_NESTING 12
#define MAX_IF_NESTING 12
// XXX these should be private
typedef enum {
VARIABLE_SYMBOL,
LABEL_SYMBOL,
} symbol_type_t;
typedef struct {
symbol_type_t symbol_type;
union {
struct { // VARIABLE_SYMBOL
int type;
size_t elements;
union {
long value;
void * array_value;
};
};
struct { // LABEL_SYMBOL
int is_resolved;
};
};
char * name;
unsigned _id;
unsigned _hash;
tommy_node _node;
} symbol_t;
/* private:
symbol_t * new_symbol(const char * const name);
void free_symbol(void * name);
*/
extern tommy_hashtable symbol_table;
typedef struct {
unsigned number : 6;
unsigned size : 2;
} cpuregister_t;
extern int system_type;
/* Used for error discovery
*/
extern int is_program_found;
extern int has_encountered_error;
/* Used for error reporting
*/
extern char * yyfilename;
extern int eaxhla_init(void);
extern int eaxhla_deinit(void);
extern int variable_size_sum(void);
// Language constructs
extern void add_program(const char * const name);
extern void add_scope(const char * const name);
extern void add_variable(unsigned type, const char * const name);
extern void add_variable_with_value(unsigned type, const char * const name, size_t value);
extern void add_array_variable(unsigned type, const char * const name, size_t size);
extern void add_array_variable_with_value(unsigned type, const char * const name, size_t size, void * value, size_t value_size);
extern void add_literal(void * data, size_t size);
extern void add_label(const char * const name, int is_resolved);
extern void add_procedure(const char * const name);
extern void add_fastcall(const char * const destination);
extern void fin_procedure(void);
extern void fin_hla(void);
extern void add_repeat(void);
extern void fin_repeat(void);
extern void add_continue(unsigned i);
extern void add_break(unsigned i);
extern void add_exit(unsigned short code);
/* Partially implemented */
extern void add_if(void);
extern void fin_if(void);
typedef enum {
EQUALS,
NOT_EQUALS,
LESSER_THAN,
GREATER_THAN,
} logic_t;
extern void add_logic(cpuregister_t * c1, cpuregister_t * c2, logic_t logic);
/* Not implemented
extern symbol_t * add_function(symbol_t function);
extern symbol_t * get_function(const char * const name);
extern void add_logic_equals();
*/
// Asm value constructs
/* These functions MUST return a valid symbol_t or
* we segv and catch fire.
* Unresolved symbol errors are handled internally.
*/
extern symbol_t * get_relative(const char * const name);
extern symbol_t * get_variable(const char * const name);
// XXX: move to assembler.h,
// delete the switch bullshit, you can get away with artimetrics,
// also typedef the D\d+ type
extern int type2size(int type); // XXX: the return type is an anon enum
extern int size2bytes(const int size); // XXX: size is an anon enum
// Error reporting
extern void issue_warning(const char * format, ...);
extern void issue_error(const char * format, ...);
extern void issue_internal_error(void);
#endif