#ifndef ABC_EXPR_H #define ABC_EXPR_H #include #include #include #include "ustr.h" enum ExprKind { EK_BINARY, // binary expression EK_ADD = EK_BINARY, EK_ASSIGN, EK_SUB, EK_MUL, EK_DIV, EK_POW, 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); // destrcutor void deleteExpr(const struct Expr *expr); // methods bool isLValueExpr(const struct Expr *expr); double evalExpr(const struct Expr *expr); void printExprTree(const struct Expr *expr, FILE *out); #endif // ABC_EXPR_H