1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
#ifndef PARSER_H
#define PARSER_H
#include "main.h"
#include "token.h"
#include "utils/hash.h"
#include "utils/vector.h"
#include <stdbool.h>
#include <stdint.h>
typedef struct
{
hkey_t key;
uint16_t code_nr;
// when key.string != NULL, key stores the label string
} label_t;
typedef struct
{
token_type type;
uint32_t data;
string_t literal;
// store idx for MEM | ATTR_LOWARG | ATTR_HIGHARG
// store value for NUMBER | TRAP | TRACE | ERRNO
} obj_t;
typedef struct
{
obj_t left_var;
token_type operator;
obj_t right_var;
// if operator is NEGATIVE, then it should be A EQUAL NEGATIVE A
// but EQUAL is skipped
} assign_line_t;
typedef struct
{
// token_t if;
// jump_line_t must starts with if, so skip it
bool if_bang;
// if match '!' before jump_condition
bool if_condition;
// does condition exists
// if true, jt and jf both uint16_t
// else jt is uint32_t, jf is ignored
// var A;
// jump always compare A with something else, so skip it
token_type comparator;
obj_t cmpobj;
label_t jt;
label_t jf;
// pc += (jump_condition ? jt : jf) + 1
// pc += jt + 1
} jump_line_t;
typedef struct
{
// token_type return
// return_line_t must have return, so skip it
obj_t ret_obj;
} return_line_t;
typedef void *empty_line_t;
typedef void *eof_line_t;
typedef struct
{
char *error_start;
const char *error_msg;
} error_line_t;
typedef enum
{
ASSIGN_LINE,
JUMP_LINE,
RETURN_LINE,
EMPTY_LINE,
EOF_LINE,
ERROR_LINE,
} expr_type;
typedef struct
{
expr_type type;
string_t label_decl;
uint16_t text_nr;
uint16_t code_nr;
char *line_start;
int16_t comment;
uint16_t line_len;
union
{
assign_line_t assign_line;
jump_line_t jump_line;
return_line_t return_line;
empty_line_t empty_line;
eof_line_t eof_line;
error_line_t error_line;
};
} statement_t;
extern void init_parser (uint32_t scmp_arch);
// see vector.h for vector details
extern void parser (vector_t *text_v, vector_t *code_ptr_v);
#endif
|