#pragma once #include #include typedef enum { ET_Add, ET_Subtract, ET_Multiply, ET_Divide, ET_Int, } ExprType; typedef struct Expr Expr; struct Expr { ExprType type; int int_value; struct { Expr* left; Expr* right; }; }; Expr* exprNew(Expr expr); Expr* intExprNew(int int_value); Expr* binaryExprNew(ExprType type, Expr* left, Expr* right); void exprFree(Expr* expr); int exprEval(const Expr* expr); void exprPrint(const Expr* expr); char binarySymbol(ExprType type); typedef enum { TT_Plus = '+', TT_Minus = '-', TT_Asterisk = '*', TT_Slash = '/', TT_Int = '0', } TokenType; typedef struct { TokenType type; int value; } Token; typedef struct { Token* tokens; size_t tokens_size; size_t i; } Parser; size_t lex(Token* tokens, size_t tokens_max_size, const char* text); bool parserDone(const Parser* parser); void parserStep(Parser* parser); Token parserCurrent(const Parser* parser); void parserConstruct(Parser* parser, Token* tokens, size_t tokens_size); Expr* parseExpr(Parser* parser);