typedef struct AST AST;
typedef enum Primary_expr_kind Primary_expr_kind;
-struct Literal {
- union {
- float f;
- int i;
- bool b;
- char ch;
- char *str;
- } as;
-};
-
-void print_literal(FILE *f, Literal value, Literal_kind kind);
-
enum Literal_kind {
LIT_FLOAT,
LIT_INT,
const char *lit_kind_as_str(Literal_kind k);
+struct Literal {
+ Literal_kind kind;
+ union {
+ float f;
+ int i;
+ bool b;
+ char ch;
+ char *str;
+ } as;
+};
+
+void print_literal(FILE *f, Literal value);
struct Unary_expr {
Token operator;
AST *operand;
struct Primary_expr {
Primary_expr_kind kind;
Literal value;
- Literal_kind value_kind;
String_view identifier_key;
};
typedef struct {
String_view name;
Literal value;
- Literal_kind value_kind;
bool not_declared;
Primary_expr *prim_expr;
} Identifier;
return t.type == TK_INT || t.type == TK_FLOAT;
}
-void print_literal(FILE *f, Literal value, Literal_kind kind) {
- switch (kind) {
+void print_literal(FILE *f, Literal value) {
+ switch (value.kind) {
case LIT_FLOAT: fprintf(f, "%f", value.as.f); break;
case LIT_INT: fprintf(f, "%d", value.as.i); break;
case LIT_BOOL: fprintf(f, "%s", value.as.b ? "true" : "false"); break;
void print_primary_expr(FILE *f, Primary_expr *pe) {
if (pe->kind == PRIMARY_VALUE) {
- print_literal(f, pe->value, pe->value_kind);
+ print_literal(f, pe->value);
} else if (pe->kind == PRIMARY_IDENT) {
Identifier_KV *ident_kv = hmgetp_null(identifier_map, pe->identifier_key);
ASSERT(ident_kv != NULL, "The identifier should be in the identifier_map!");
if (ident.not_declared) {
fprintf(f, "???");
} else {
- print_literal(f, ident.value, ident.value_kind);
+ print_literal(f, ident.value);
}
} else {
ASSERT(false, "UNREACHABLE!");
} break;
case AST_BINARY: {
fprintf(f, "(");
- print_ast_as_value(f, *e.bin_ast->lhs);
- fprintf(f, " %s ", token_type_as_str(e.bin_ast->operator.type));
- print_ast_as_value(f, *e.bin_ast->rhs);
+ print_ast_as_value(f, *e.bin_expr->lhs);
+ fprintf(f, " %s ", token_type_as_str(e.bin_expr->operator.type));
+ print_ast_as_value(f, *e.bin_expr->rhs);
fprintf(f, ")");
} break;
case AST_UNARY: {
- if (e.unary_ast->suffix) {
+ if (e.unary_expr->suffix) {
fprintf(f, "(");
- print_ast_as_value(f, *e.unary_ast->operand);
+ print_ast_as_value(f, *e.unary_expr->operand);
fprintf(f, ")");
- fprintf(f, " %s ", token_type_as_str(e.unary_ast->operator.type));
+ fprintf(f, " %s ", token_type_as_str(e.unary_expr->operator.type));
} else {
- fprintf(f, " %s ", token_type_as_str(e.unary_ast->operator.type));
+ fprintf(f, " %s ", token_type_as_str(e.unary_expr->operator.type));
fprintf(f, "(");
- print_ast_as_value(f, *e.unary_ast->operand);
+ print_ast_as_value(f, *e.unary_expr->operand);
fprintf(f, ")");
}
} else {
// If the ident is declared, set the value of the expr!
ast->prim_expr->value = ident.value;
- ast->prim_expr->value_kind = ident.value_kind;
+ ast->prim_expr->value.kind = ident.value.kind;
}
ast->prim_expr->kind = PRIMARY_IDENT;
int i = sv_to_int(t.lexeme, &i_count, 10);
ASSERT(i_count != -1, "We made a mistake in lexing of integers!");
ast->prim_expr->value.as.i = i;
- ast->prim_expr->value_kind = LIT_INT;
+ ast->prim_expr->value.kind = LIT_INT;
return ast;
} else if (t.type == TK_FLOAT) {
int f_count = -1;
float f = sv_to_float(t.lexeme, &f_count);
ASSERT(f_count != -1, "We made a mistake in lexing of floats!");
ast->prim_expr->value.as.f = f;
- ast->prim_expr->value_kind = LIT_FLOAT;
+ ast->prim_expr->value.kind = LIT_FLOAT;
return ast;
} else {
}
} else if (t.type == TK_STRING) {
- ast->prim_expr->value_kind = LIT_STRING;
+ ast->prim_expr->value.kind = LIT_STRING;
ast->prim_expr->value.as.str = sv_to_cstr(t.lexeme);
return ast;
} else if (t.type == TK_CHAR) {
- ast->prim_expr->value_kind = LIT_CHAR;
+ ast->prim_expr->value.kind = LIT_CHAR;
ast->prim_expr->value.as.ch = *t.lexeme.data;
return ast;
} else if (t.type == TK_BOOL) {
- ast->prim_expr->value_kind = LIT_BOOL;
+ ast->prim_expr->value.kind = LIT_BOOL;
ast->prim_expr->value.as.b = sv_equals(t.lexeme, SV("true"));
return ast;
} else if (t.type == TK_NULL) {
- ast->prim_expr->value_kind = LIT_INT; // TODO: Should we introduce a LIT_NULL?
+ ast->prim_expr->value.kind = LIT_INT; // TODO: Should we introduce a LIT_NULL?
ast->prim_expr->value.as.i = 0;
return ast;
} else {
AST *ast = (AST *)arena_alloc(arena, sizeof(AST));
ast->loc = t.loc;
- ast->unary_ast = (Unary_expr *)arena_alloc(arena, sizeof(Unary_expr));
+ ast->unary_expr = (Unary_expr *)arena_alloc(arena, sizeof(Unary_expr));
ast->kind = AST_UNARY;
- Unary_expr *unary_ast = ast->unary_ast;
- unary_ast->operator = parser_advance(p);
- unary_ast->operand = operand;
- unary_ast->suffix = true;
+ Unary_expr *unary_expr = ast->unary_expr;
+ unary_expr->operator = parser_advance(p);
+ unary_expr->operand = operand;
+ unary_expr->suffix = true;
return ast;
}
if (t.type == TK_NOT || t.type == TK_MINUS) {
AST *ast = (AST *)arena_alloc(arena, sizeof(AST));
ast->loc = t.loc;
- ast->unary_ast = (Unary_expr *)arena_alloc(arena, sizeof(Unary_expr));
+ ast->unary_expr = (Unary_expr *)arena_alloc(arena, sizeof(Unary_expr));
ast->kind = AST_UNARY;
- Unary_expr *unary_ast = ast->unary_ast;
- unary_ast->operator = parser_advance(p);
- unary_ast->operand = parse_unary(arena, p);
+ Unary_expr *unary_expr = ast->unary_expr;
+ unary_expr->operator = parser_advance(p);
+ unary_expr->operand = parse_unary(arena, p);
return ast;
}
AST *new_ast = (AST *)arena_alloc(arena, sizeof(AST));
new_ast->kind = AST_BINARY;
new_ast->loc = ast->loc;
- new_ast->bin_ast = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
- new_ast->bin_ast->lhs = ast;
- new_ast->bin_ast->operator = op;
- new_ast->bin_ast->rhs = rhs;
+ new_ast->bin_expr = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
+ new_ast->bin_expr->lhs = ast;
+ new_ast->bin_expr->operator = op;
+ new_ast->bin_expr->rhs = rhs;
ast = new_ast;
}
AST *new_ast = (AST *)arena_alloc(arena, sizeof(AST));
new_ast->kind = AST_BINARY;
new_ast->loc = ast->loc;
- new_ast->bin_ast = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
- new_ast->bin_ast->lhs = ast;
- new_ast->bin_ast->operator = operator;
- new_ast->bin_ast->rhs = rhs;
+ new_ast->bin_expr = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
+ new_ast->bin_expr->lhs = ast;
+ new_ast->bin_expr->operator = operator;
+ new_ast->bin_expr->rhs = rhs;
ast = new_ast;
}
AST *new_ast = (AST *)arena_alloc(arena, sizeof(AST));
new_ast->kind = AST_BINARY;
new_ast->loc = ast->loc;
- new_ast->bin_ast = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
- new_ast->bin_ast->lhs = ast;
- new_ast->bin_ast->operator = operator;
- new_ast->bin_ast->rhs = rhs;
+ new_ast->bin_expr = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
+ new_ast->bin_expr->lhs = ast;
+ new_ast->bin_expr->operator = operator;
+ new_ast->bin_expr->rhs = rhs;
ast = new_ast;
}
AST *new_ast = (AST *)arena_alloc(arena, sizeof(AST));
new_ast->kind = AST_BINARY;
new_ast->loc = ast->loc;
- new_ast->bin_ast = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
- new_ast->bin_ast->lhs = ast;
- new_ast->bin_ast->operator = operator;
- new_ast->bin_ast->rhs = rhs;
+ new_ast->bin_expr = (Binary_expr *)arena_alloc(arena, sizeof(Binary_expr));
+ new_ast->bin_expr->lhs = ast;
+ new_ast->bin_expr->operator = operator;
+ new_ast->bin_expr->rhs = rhs;
ast = new_ast;
}