@fileverse-dev/formula-parser 0.2.5-tally-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/es/error.js +45 -0
  4. package/es/evaluate-by-operator/evaluate-by-operator.js +70 -0
  5. package/es/evaluate-by-operator/operator/add.js +16 -0
  6. package/es/evaluate-by-operator/operator/ampersand.js +10 -0
  7. package/es/evaluate-by-operator/operator/divide.js +21 -0
  8. package/es/evaluate-by-operator/operator/equal.js +5 -0
  9. package/es/evaluate-by-operator/operator/formula-function.js +40 -0
  10. package/es/evaluate-by-operator/operator/greater-than-or-equal.js +5 -0
  11. package/es/evaluate-by-operator/operator/greater-than.js +5 -0
  12. package/es/evaluate-by-operator/operator/less-than-or-equal.js +5 -0
  13. package/es/evaluate-by-operator/operator/less-than.js +5 -0
  14. package/es/evaluate-by-operator/operator/minus.js +16 -0
  15. package/es/evaluate-by-operator/operator/multiply.js +16 -0
  16. package/es/evaluate-by-operator/operator/not-equal.js +5 -0
  17. package/es/evaluate-by-operator/operator/power.js +11 -0
  18. package/es/grammar-parser/grammar-parser.jison +230 -0
  19. package/es/grammar-parser/grammar-parser.js +1522 -0
  20. package/es/helper/cell.js +117 -0
  21. package/es/helper/number.js +25 -0
  22. package/es/helper/string.js +13 -0
  23. package/es/index.js +5 -0
  24. package/es/parser.js +318 -0
  25. package/es/supported-formulas.js +3 -0
  26. package/lib/error.js +53 -0
  27. package/lib/evaluate-by-operator/evaluate-by-operator.js +77 -0
  28. package/lib/evaluate-by-operator/operator/add.js +23 -0
  29. package/lib/evaluate-by-operator/operator/ampersand.js +17 -0
  30. package/lib/evaluate-by-operator/operator/divide.js +28 -0
  31. package/lib/evaluate-by-operator/operator/equal.js +12 -0
  32. package/lib/evaluate-by-operator/operator/formula-function.js +50 -0
  33. package/lib/evaluate-by-operator/operator/greater-than-or-equal.js +12 -0
  34. package/lib/evaluate-by-operator/operator/greater-than.js +12 -0
  35. package/lib/evaluate-by-operator/operator/less-than-or-equal.js +12 -0
  36. package/lib/evaluate-by-operator/operator/less-than.js +12 -0
  37. package/lib/evaluate-by-operator/operator/minus.js +23 -0
  38. package/lib/evaluate-by-operator/operator/multiply.js +23 -0
  39. package/lib/evaluate-by-operator/operator/not-equal.js +12 -0
  40. package/lib/evaluate-by-operator/operator/power.js +18 -0
  41. package/lib/grammar-parser/grammar-parser.jison +230 -0
  42. package/lib/grammar-parser/grammar-parser.js +1528 -0
  43. package/lib/helper/cell.js +128 -0
  44. package/lib/helper/number.js +32 -0
  45. package/lib/helper/string.js +19 -0
  46. package/lib/index.js +114 -0
  47. package/lib/parser.js +326 -0
  48. package/lib/supported-formulas.js +11 -0
  49. package/package.json +73 -0
@@ -0,0 +1,230 @@
1
+ /* description: Parses end evaluates mathematical expressions. */
2
+ /* lexical grammar */
3
+ %lex
4
+ %%
5
+ \s+ {/* skip whitespace */}
6
+ '"'("\\"["]|[^"])*'"' {return 'STRING';}
7
+ "'"('\\'[']|[^'])*"'" {return 'STRING';}
8
+ [A-Za-z]{1,}[A-Za-z_0-9\.]+(?=[(]) {return 'FUNCTION';}
9
+ '#'[A-Z0-9\/]+('!'|'?')? {return 'ERROR';}
10
+ '$'[A-Za-z]+'$'[0-9]+ {return 'ABSOLUTE_CELL';}
11
+ '$'[A-Za-z]+[0-9]+ {return 'MIXED_CELL';}
12
+ [A-Za-z]+'$'[0-9]+ {return 'MIXED_CELL';}
13
+ [A-Za-z]+[0-9]+ {return 'RELATIVE_CELL';}
14
+ [A-Za-z\.]+(?=[(]) {return 'FUNCTION';}
15
+ [A-Za-z]{1,}[A-Za-z_0-9]+ {return 'VARIABLE';}
16
+ [A-Za-z_]+ {return 'VARIABLE';}
17
+ [0-9]*\.?[0-9]+ {return 'NUMBER';}
18
+ '['(.*)?']' {return 'ARRAY';}
19
+ "&" {return '&';}
20
+ " " {return ' ';}
21
+ [.] {return 'DECIMAL';}
22
+ ":" {return ':';}
23
+ ";" {return ';';}
24
+ "," {return ',';}
25
+ "*" {return '*';}
26
+ "/" {return '/';}
27
+ "-" {return '-';}
28
+ "+" {return '+';}
29
+ "^" {return '^';}
30
+ "(" {return '(';}
31
+ ")" {return ')';}
32
+ ">" {return '>';}
33
+ "<" {return '<';}
34
+ "NOT" {return 'NOT';}
35
+ '"' {return '"';}
36
+ "'" {return "'";}
37
+ "!" {return "!";}
38
+ "=" {return '=';}
39
+ "%" {return '%';}
40
+ [#] {return '#';}
41
+ <<EOF>> {return 'EOF';}
42
+ /lex
43
+
44
+ /* operator associations and precedence (low-top, high-bottom) */
45
+ %left '='
46
+ %left '<=' '>=' '<>' 'NOT' '||'
47
+ %left '>' '<'
48
+ %left '+' '-'
49
+ %left '*' '/'
50
+ %left '^'
51
+ %left '&'
52
+ %left '%'
53
+ %left UMINUS
54
+
55
+ %start expressions
56
+
57
+ %% /* language grammar */
58
+
59
+ expressions
60
+ : expression EOF {
61
+ return $1;
62
+ }
63
+ ;
64
+
65
+ expression
66
+ : variableSequence {
67
+ $$ = yy.callVariable($1[0]);
68
+ }
69
+ | number {
70
+ $$ = yy.toNumber($1);
71
+ }
72
+ | STRING {
73
+ $$ = yy.trimEdges($1);
74
+ }
75
+ | expression '&' expression {
76
+ $$ = yy.evaluateByOperator('&', [$1, $3]);
77
+ }
78
+ | expression '=' expression {
79
+ $$ = yy.evaluateByOperator('=', [$1, $3]);
80
+ }
81
+ | expression '+' expression {
82
+ $$ = yy.evaluateByOperator('+', [$1, $3]);
83
+ }
84
+ | '(' expression ')' {
85
+ $$ = $2;
86
+ }
87
+ | expression '<' '=' expression {
88
+ $$ = yy.evaluateByOperator('<=', [$1, $4]);
89
+ }
90
+ | expression '>' '=' expression {
91
+ $$ = yy.evaluateByOperator('>=', [$1, $4]);
92
+ }
93
+ | expression '<' '>' expression {
94
+ $$ = yy.evaluateByOperator('<>', [$1, $4]);
95
+ }
96
+ | expression NOT expression {
97
+ $$ = yy.evaluateByOperator('NOT', [$1, $3]);
98
+ }
99
+ | expression '>' expression {
100
+ $$ = yy.evaluateByOperator('>', [$1, $3]);
101
+ }
102
+ | expression '<' expression {
103
+ $$ = yy.evaluateByOperator('<', [$1, $3]);
104
+ }
105
+ | expression '-' expression {
106
+ $$ = yy.evaluateByOperator('-', [$1, $3]);
107
+ }
108
+ | expression '*' expression {
109
+ $$ = yy.evaluateByOperator('*', [$1, $3]);
110
+ }
111
+ | expression '/' expression {
112
+ $$ = yy.evaluateByOperator('/', [$1, $3]);
113
+ }
114
+ | expression '^' expression {
115
+ $$ = yy.evaluateByOperator('^', [$1, $3]);
116
+ }
117
+ | '-' expression {
118
+ var n1 = yy.invertNumber($2);
119
+
120
+ $$ = n1;
121
+
122
+ if (isNaN($$)) {
123
+ $$ = 0;
124
+ }
125
+ }
126
+ | '+' expression {
127
+ var n1 = yy.toNumber($2);
128
+
129
+ $$ = n1;
130
+
131
+ if (isNaN($$)) {
132
+ $$ = 0;
133
+ }
134
+ }
135
+ | FUNCTION '(' ')' {
136
+ $$ = yy.callFunction($1);
137
+ }
138
+ | FUNCTION '(' expseq ')' {
139
+ $$ = yy.callFunction($1, $3);
140
+ }
141
+ | cell
142
+ | error
143
+ | error error
144
+ ;
145
+
146
+ cell
147
+ : ABSOLUTE_CELL {
148
+ $$ = yy.cellValue($1);
149
+ }
150
+ | RELATIVE_CELL {
151
+ $$ = yy.cellValue($1);
152
+ }
153
+ | MIXED_CELL {
154
+ $$ = yy.cellValue($1);
155
+ }
156
+ | ABSOLUTE_CELL ':' ABSOLUTE_CELL {
157
+ $$ = yy.rangeValue($1, $3);
158
+ }
159
+ | ABSOLUTE_CELL ':' RELATIVE_CELL {
160
+ $$ = yy.rangeValue($1, $3);
161
+ }
162
+ | ABSOLUTE_CELL ':' MIXED_CELL {
163
+ $$ = yy.rangeValue($1, $3);
164
+ }
165
+ | RELATIVE_CELL ':' ABSOLUTE_CELL {
166
+ $$ = yy.rangeValue($1, $3);
167
+ }
168
+ | RELATIVE_CELL ':' RELATIVE_CELL {
169
+ $$ = yy.rangeValue($1, $3);
170
+ }
171
+ | RELATIVE_CELL ':' MIXED_CELL {
172
+ $$ = yy.rangeValue($1, $3);
173
+ }
174
+ | MIXED_CELL ':' ABSOLUTE_CELL {
175
+ $$ = yy.rangeValue($1, $3);
176
+ }
177
+ | MIXED_CELL ':' RELATIVE_CELL {
178
+ $$ = yy.rangeValue($1, $3);
179
+ }
180
+ | MIXED_CELL ':' MIXED_CELL {
181
+ $$ = yy.rangeValue($1, $3);
182
+ }
183
+ ;
184
+
185
+ expseq
186
+ : expression {
187
+ $$ = [$1];
188
+ }
189
+ | ARRAY {
190
+ $$ = yy.trimEdges(yytext).split(',');
191
+ }
192
+ | expseq ';' expression {
193
+ $1.push($3);
194
+ $$ = $1;
195
+ }
196
+ | expseq ',' expression {
197
+ $1.push($3);
198
+ $$ = $1;
199
+ }
200
+ ;
201
+
202
+ variableSequence
203
+ : VARIABLE {
204
+ $$ = [$1];
205
+ }
206
+ | variableSequence DECIMAL VARIABLE {
207
+ $$ = (Array.isArray($1) ? $1 : [$1]);
208
+ $$.push($3);
209
+ }
210
+ ;
211
+
212
+ number
213
+ : NUMBER {
214
+ $$ = $1;
215
+ }
216
+ | NUMBER DECIMAL NUMBER {
217
+ $$ = ($1 + '.' + $3) * 1;
218
+ }
219
+ | number '%' {
220
+ $$ = $1 * 0.01;
221
+ }
222
+ ;
223
+
224
+ error
225
+ : ERROR {
226
+ $$ = yy.throwError($1);
227
+ }
228
+ ;
229
+
230
+ %%