1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#define _XOPEN_SOURCE 700
#include <inttypes.h>
typedef enum {
MUL, MOD, DIV, ADD, SUB, POW, NEG,
SET, SADD, SSUB, SMUL, SDIV, SMOD, SPOW,
EQ, LE, GE, NE, LT, GT,
INC, DEC
} bc_op;
typedef enum {
DEFINE, BREAK, QUIT, LENGTH,
RETURN, FOR, IF, WHILE, SQRT,
SCALE, IBASE, OBASE, AUTO
} bc_kw;
typedef struct {
int scale;
intmax_t n;
} bc_num;
typedef struct bc_expression {
enum bc_expression_type {
NAMED, LITERAL, FUNCTION_CALL, OPERATION
} type;
char letter;
struct bc_expression *left;
struct bc_expression *right;
bc_num *literal;
bc_num *lval;
bc_num *rval;
bc_op op;
} bc_expression;
extern int bc_lineno;
extern int bc_char;
bc_num *bc_eval(bc_expression *);
bc_expression *bc_named(char);
bc_expression *bc_literal(bc_num *);
bc_expression *bc_function_call(char, void*);
bc_expression *bc_operation(bc_op, bc_expression *, bc_expression *);
bc_num *bc_new(const char *);
void bc_free(bc_num *);
bc_num *bc_print(bc_num *);
int bc_toint(bc_num *);
/* basic operations */
bc_num *bc_mul(bc_num *, bc_num *);
bc_num *bc_add(bc_num *, bc_num *);
bc_num *bc_sub(bc_num *, bc_num *);
bc_num *bc_div(bc_num *, bc_num *);
bc_num *bc_mod(bc_num *, bc_num *);
bc_num *bc_pow(bc_num *, bc_num *);
bc_num *bc_neg(bc_num *);
/* modifying operations */
bc_num *bc_inc(bc_num *);
bc_num *bc_dec(bc_num *);
bc_num *bc_set(bc_num *, bc_num *);
bc_num *bc_sadd(bc_num *, bc_num *);
bc_num *bc_ssub(bc_num *, bc_num *);
bc_num *bc_smul(bc_num *, bc_num *);
bc_num *bc_sdiv(bc_num *, bc_num *);
bc_num *bc_smod(bc_num *, bc_num *);
bc_num *bc_spow(bc_num *, bc_num *);
/* relation operations */
bc_num *bc_eq(bc_num *, bc_num *);
bc_num *bc_le(bc_num *, bc_num *);
bc_num *bc_ge(bc_num *, bc_num *);
bc_num *bc_ne(bc_num *, bc_num *);
bc_num *bc_lt(bc_num *, bc_num *);
bc_num *bc_gt(bc_num *, bc_num *);
/* variables */
bc_num *bc_let(char);
bc_num *bc_arr(char, bc_num *);
/* built-in functions */
bc_num *bc_length(bc_num *);
bc_num *bc_sqrt(bc_num *);
bc_num *bc_scale(bc_num *);
|