codebased/lommereimar/calculator.h
2023-04-19 23:37:03 +02:00

114 lines
2.6 KiB
C

#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <stdbool.h>
#include <stdio.h>
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