vc4/asm/parse.h
2025-10-02 22:44:00 +02:00

99 lines
1.7 KiB
C

#ifndef PARSE_H
#define PARSE_H
#include "report.h"
#include <stddef.h>
#include <stdint.h>
typedef enum {
PExprTy_Err,
PExprTy_Ident,
PExprTy_SubLabel,
PExprTy_Imm,
PExprTy_Str,
PExprTy_Mem,
PExprTy_Not,
PExprTy_Negate,
PExprTy_Or,
PExprTy_Xor,
PExprTy_And,
PExprTy_Shl,
PExprTy_Shr,
PExprTy_Add,
PExprTy_Sub,
PExprTy_Mul,
PExprTy_Div,
PExprTy_Mod,
} PExprTy;
typedef struct PExpr PExpr;
struct PExpr {
PExprTy ty;
Loc loc;
union {
char* str;
uint16_t imm;
PExpr* operand;
struct {
PExpr* left;
PExpr* right;
};
};
};
void pexpr_free(PExpr* expr);
typedef struct {
Loc loc;
char* ident;
PExpr* value;
} PConst;
void pconst_free(PConst* stmt);
typedef struct {
Loc loc;
char* filename;
} PInclude;
void pinclude_free(PInclude* stmt);
typedef struct {
Loc loc;
char* ident;
bool local;
} PLabel;
void plabel_free(PLabel* stmt);
typedef struct {
Loc loc;
char* ident;
PExpr* ops[2];
size_t ops_size;
} PLine;
void pline_free(PLine* stmt);
typedef struct Parser Parser;
Parser* parser_new(const char* filename, const char* text);
void parser_free(Parser* parser);
void parser_skip_newlines(Parser* parser);
bool parser_next_is_const(Parser* parser);
bool parser_next_is_include(Parser* parser);
bool parser_next_is_label(Parser* parser);
PConst* parser_parse_const(Parser* parser);
PInclude* parser_parse_include(Parser* parser);
PLabel* parser_parse_label(Parser* parser);
PLine* parser_parse_line(Parser* parser);
bool parser_done(const Parser* parser);
bool parser_error_occured(const Parser* parser);
#endif