4
4
namespace VQDR.Expression {
6
6
public abstract class Token : GLib.Object {
7
/** Precision used to perform evaluation */
8
public const int VALUES_PRECISION_DIGITS = 3;
9
/** Precision factor used to convert raw values to actual ones */
10
public const int VALUES_PRECISION_FACTOR = 1000;
11
//public static int VALUES_PRECISION_FACTOR = (int)Math.pow(10, VALUES_PRECISION_DIGITS);
13
/** Precision used to output values */
14
public const int VALUES_OUTPUT_PRECISION_DIGITS = 2;
15
/** Precision factor used to evaluate output */
16
public const int VALUES_OUTPUT_PRECISION_FACTOR = 100;
17
8
//public static int VALUES_OUTPUT_PRECISION_FACTOR = (int)Math.pow(10, VALUES_OUTPUT_PRECISION_DIGITS);
26
17
public const int MAX_TOKEN_ITERATIONS = 500;
27
18
/** Max iteration number for the expression */
28
19
public const int MAX_TOTAL_ITERATIONS = 5000;
30
/* ************************************* */
31
/* Operator precedence and associativity */
32
/* ************************************* */
33
/** Priority for assignment "=" operator */
34
public const int PRIO_ASSIGNMENT = 0;
35
/** Priority for conditional OR "||" operator */
36
public const int PRIO_CONDITIONAL_OR = 2;
37
/** Priority for conditional AND "&&" operator */
38
public const int PRIO_CONDITIONAL_AND = 3;
39
/** Priority for equality "==" and "!=" operators */
40
public const int PRIO_EQUALITY = 4;
41
/** Priority for comparison ">", "<", ">=", etc operators */
42
public const int PRIO_COMPARISON = 5;
43
/** Priority for addictive "+" and "-" operators */
44
public const int PRIO_ADDICTIVE = 6;
45
/** Priority for multiplicative "*" and "/" operators */
46
public const int PRIO_MULTIPLICATIVE = 7;
47
/** Priority for unary "+" and "-" and "!" operators */
48
public const int PRIO_UNARY = 8;
49
/** Priority for label assignment ":" operator */
50
public const int PRIO_LABEL = 9;
51
/** Priority for dice "d" operator */
52
public const int PRIO_DICE = 10;
53
/** Priority for functions */
54
public const int PRIO_FUNCTION = 11;
55
/** Priority for values */
56
public const int PRIO_VALUE = 12;
22
/** Operator precedence and associativity
24
* higher number is higher priority, and is to be done befroe those
28
/** Priority for assignment "=" operator */
30
/** Priority for conditional OR "||" operator */
32
/** Priority for conditional AND "&&" operator */
34
/** Priority for equality "==" and "!=" operators */
36
/** Priority for comparison ">", "<", ">=", etc operators */
38
/** Priority for addictive "+" and "-" operators */
40
/** Priority for multiplicative "*" and "/" operators */
42
/** Priority for unary "+" and "-" and "!" operators */
44
/** Priority for label assignment ":" operator */
46
/** Priority for dice "d" operator */
48
/** Priority for functions */
50
/** Priority for values */
53
/** get the name of the priority */
57
return "prio: assigment";
59
return "prio: conditonal or";
61
return "prio: conidonal and";
63
return "prio: equality";
65
return "prio: multiplicative";
73
return "prio: function";
77
assert_not_reached ();
58
82
/** Generation to use to get the root with {@link #getParent} */
59
83
protected const int ROOT_GENERATION = int.MAX;
108
132
/** all children of this token */
109
133
private (unowned Token?)[] children;
112
public long result_value {public get; protected set; default = 0;}
113
public long result_max_value {public get; protected set; default = 0;}
114
public long result_min_value {public get; protected set; default = 0;}
136
* These values should have a protected setter, but I could not get it to
137
* work. So we will have to live with this.
139
public FastNumber result_value;
140
public FastNumber result_max_value;
141
public FastNumber result_min_value;
115
142
public string result_string {public get; protected set; default = "";}
118
// Valgrind says there is a memory leak here... But it's actually
119
// GObject's constructor that is leaking.
120
145
children = new Token[max_num_child];
148
result_value = FastNumber ();
149
result_max_value = FastNumber ();
150
result_min_value = FastNumber ();