vc3/asm/parse.h
2025-04-02 17:00:43 +02:00

111 lines
2.1 KiB
C

#pragma once
#include "common/arch.h"
#include "lex.h"
#include "report.h"
#include <stdbool.h>
#include <stdint.h>
typedef struct PLabel PLabel;
struct PLabel {
PLabel* next;
char* ident;
Loc loc;
bool sub_label;
};
PLabel* plabel_new(PLabel* next, char* ident, bool sub_label, Loc loc);
void plabel_free(PLabel* label);
typedef enum {
PoTy_Reg,
PoTy_Imm,
PoTy_Ident,
PoTy_SubLabel,
PoTy_Str,
PoTy_Mem8,
PoTy_Mem16,
PoTy_Not,
PoTy_Negate,
PoTy_Or,
PoTy_Xor,
PoTy_And,
PoTy_Shl,
PoTy_Shr,
PoTy_Add,
PoTy_Sub,
PoTy_Mul,
PoTy_Div,
PoTy_Mod,
} POperandTy;
typedef struct POperand POperand;
struct POperand {
POperandTy ty;
Loc loc;
union {
Reg reg;
uint16_t imm;
struct {
char* str;
size_t str_len;
};
POperand* operand;
struct {
POperand* left;
POperand* right;
};
};
};
POperand* poperand_new_reg(Reg reg, Loc loc);
POperand* poperand_new_imm(uint16_t imm, Loc loc);
POperand* poperand_new_str(POperandTy ty, char* str, size_t str_len, Loc loc);
POperand* poperand_new_unary(POperandTy ty, POperand* inner, Loc loc);
POperand* poperand_new_binary(
POperandTy ty, POperand* left, POperand* right, Loc loc);
void poperand_free(POperand* operand);
typedef struct {
PLabel* labels;
char* op;
Loc loc;
size_t ops_size;
POperand* ops[];
} PLine;
PLine* pline_new(
char* op, PLabel* labels, Loc loc, size_t ops_size, POperand** ops);
void pline_free(PLine* pline);
typedef enum {
PStmtTy_Line,
PStmtTy_Global,
PStmtTy_Extern,
PStmtTy_Define,
} PStmtTy;
typedef struct {
PStmtTy ty;
union {
PLine* line;
char* ident;
};
} PStmt;
void pstmt_free(PStmt* stmt);
typedef struct {
Lexer lexer;
Tok tok;
Tok eaten;
bool error_occured;
} Parser;
void parser_construct(Parser* parser, const char* filename, const char* text);
bool parser_done(const Parser* parser);
bool parser_error_occured(const Parser* parser);
PLine* parser_next(Parser* parser);