#ifndef ABC_EXPR_H #define ABC_EXPR_H #include #include #include #include "gen.h" #include "ustr.h" enum ExprKind { EK_BINARY, // binary expression EK_ADD = EK_BINARY, EK_ASSIGN, EK_EQUAL, EK_NOT_EQUAL, EK_GREATER, EK_GREATER_EQUAL, EK_LESS, EK_LESS_EQUAL, EK_SUB, EK_MUL, EK_DIV, EK_MOD, EK_BINARY_END, EK_UNARY = EK_BINARY_END, // unary expression EK_UNARY_MINUS = EK_UNARY, EK_UNARY_PLUS, EK_UNARY_END, EK_PRIMARY = EK_UNARY_END, // primary expression EK_UNSIGNED_LITERAL = EK_PRIMARY, EK_IDENTIFIER, EK_PRIMARY_END, }; struct Expr; // constructors struct Expr *newUnsignedLiteralExpr(uint64_t uint); struct Expr *newIdentifierExpr(const struct UStr *identifier); struct Expr *newUnaryExpr(enum ExprKind kind, const struct Expr *unary); struct Expr *newBinaryExpr(enum ExprKind kind, const struct Expr *left, const struct Expr *right); // destructor void deleteAllExpr(void); // methods bool isLValueExpr(const struct Expr *expr); bool isConstExpr(const struct Expr *expr); void loadExprAddr(const struct Expr *expr, GenReg dest); void loadExpr(const struct Expr *expr, GenReg dest); void printExprTree(const struct Expr *expr, FILE *out); const struct Expr *constFoldExpr(const struct Expr *expr); #endif // ABC_EXPR_H