63 lines
1.1 KiB
C
63 lines
1.1 KiB
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
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);
|
|
|