You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
#ifndef WEBDICE_EXPRESSION
|
|
|
|
#define WEBDICE_EXPRESSION
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
enum expression_type{
|
|
|
|
WEBDICE_CONST,
|
|
|
|
WEBDICE_ROLL,
|
|
|
|
WEBDICE_BINARY
|
|
|
|
};
|
|
|
|
|
|
|
|
enum binary_type{
|
|
|
|
WEBDICE_MUL,
|
|
|
|
WEBDICE_DIV,
|
|
|
|
WEBDICE_ADD,
|
|
|
|
WEBDICE_SUB
|
|
|
|
};
|
|
|
|
|
|
|
|
struct expression_id{
|
|
|
|
enum expression_type id;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct expression_const{
|
|
|
|
enum expression_type id;
|
|
|
|
int64_t value;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct expression_roll{
|
|
|
|
enum expression_type id;
|
|
|
|
int64_t count;
|
|
|
|
int64_t type;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct expression_binary{
|
|
|
|
enum expression_type id;
|
|
|
|
enum binary_type operation;
|
|
|
|
union expression* left;
|
|
|
|
union expression* right;
|
|
|
|
};
|
|
|
|
|
|
|
|
union expression{
|
|
|
|
struct expression_id id;
|
|
|
|
struct expression_const constant;
|
|
|
|
struct expression_roll roll;
|
|
|
|
struct expression_binary binary;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct expression_result{
|
|
|
|
char* text;
|
|
|
|
long double min;
|
|
|
|
long double max;
|
|
|
|
long double expected;
|
|
|
|
long double actual;
|
|
|
|
};
|
|
|
|
|
|
|
|
union expression* webdice_const(int64_t value);
|
|
|
|
union expression* webdice_roll(int64_t count, int64_t roll);
|
|
|
|
|
|
|
|
union expression* webdice_mul(union expression* left, union expression* right);
|
|
|
|
union expression* webdice_div(union expression* left, union expression* right);
|
|
|
|
union expression* webdice_add(union expression* left, union expression* right);
|
|
|
|
union expression* webdice_sub(union expression* left, union expression* right);
|
|
|
|
|
|
|
|
union expression* webdice_binary(enum binary_type type, union expression* left, union expression* right);
|
|
|
|
|
|
|
|
struct expression_result resolve(union expression* root);
|
|
|
|
|
|
|
|
void free_expression(union expression* root);
|
|
|
|
|
|
|
|
#endif
|