#ifndef CALCULATOR_H #define CALCULATOR_H #include #include typedef struct { FILE* file; bool done; } LommereimarFileIter; LommereimarFileIter lommereimar_fileiter(const char* filename); char lommereimar_fileiter_next(LommereimarFileIter* file); typedef struct { int line; int col; } LommereimarPosition; typedef enum { LommereimarTokenTypeEof, LommereimarTokenTypeInvalidChar, LommereimarTokenTypeInt, LommereimarTokenTypePlus, LommereimarTokenTypeMinus, LommereimarTokenTypeAsterisk, LommereimarTokenTypeSlash, LommereimarTokenTypeHat, LommereimarTokenTypeLParen, LommereimarTokenTypeRParen, } LommereimarTokenType; typedef struct { // optional char* value; LommereimarTokenType type; LommereimarPosition pos; } LommereimarToken; typedef struct { LommereimarFileIter input_file; char current; LommereimarPosition pos; } LommereimarLexer; LommereimarLexer lommereimar_lexer(LommereimarFileIter input_file); void lommereimar_lexer_step(LommereimarLexer* lexer); LommereimarToken lommereimar_lexer_single_token( LommereimarLexer* lexer, LommereimarTokenType token_type ); LommereimarToken lommereimar_lexer_next(LommereimarLexer* lexer); typedef enum { LommereimarExprTypeEof, LommereimarExprTypeError, LommereimarExprTypeInt, LommereimarExprTypeFloat, LommereimarExprTypeUnary, LommereimarExprTypeBinary, } LommereimarExprType; typedef struct LommereimarExpr LommereimarExpr; typedef enum { LommereimarExprBinaryTypeAdd, LommereimarExprBinaryTypeSubtract, LommereimarExprBinaryTypeMultiply, LommereimarExprBinaryTypeDivide, LommereimarExprBinaryTypeExponent, } LommereimarExprBinaryType; typedef struct { LommereimarExprBinaryType type; LommereimarExpr* left; LommereimarExpr* right; } LommereimarExprBinary; typedef enum { LommereimarExprUnaryTypeNegate, } LommereimarExprUnaryType; typedef struct { LommereimarExprUnaryType type; LommereimarExpr* subject; } LommereimarExprUnary; struct LommereimarExpr { LommereimarExprType type; LommereimarPosition pos; union { char* error_value; int int_value; float float_value; LommereimarExprUnary unary; LommereimarExprBinary binary; }; }; LommereimarExpr* lommereimar_allocate_expr(LommereimarExpr data); typedef struct { LommereimarLexer lexer; LommereimarToken current; } LommereimarParser; LommereimarParser lommereimar_parser(LommereimarLexer lexer); void lommereimar_parser_step(LommereimarParser* parser); LommereimarExpr* lommereimar_parser_parse_expr(LommereimarParser* parser); LommereimarExpr* lommereimar_parser_parse_term(LommereimarParser* parser); LommereimarExpr* lommereimar_parser_parse_factor(LommereimarParser* parser); #endif