114 lines
2.6 KiB
C
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
|