13
char *filename = "<stdin>";
15
extern int cmd_parse_tree;
17
extern int cmd_rolleval;
21
void list_quicksort(struct val_list **data, int start, int end) {
27
while(data[++i]->values[0] < data[end]->values[0]);
28
while(data[--j >= 0 ? j : end]->values[0] > data[end]->values[0]);
40
list_quicksort(data, start, i-1);
41
list_quicksort(data, i+1, end);
45
struct val_list *list_sort(struct val_list *list) {
46
struct val_list *cl = list;
54
struct val_list **hash = (struct val_list**)malloc(sizeof(struct val_list*) * count);
63
list_quicksort(hash, 0, count-1);
64
for (i = 0; i < count-1; i++) {
65
hash[i]->next = hash[i+1];
67
hash[count-1]->next = NULL;
83
%token <tval> VARIABLE
85
%token IN DO WHILE ELSE
88
%token EQ NE LT GT LE GE
91
%token SUM PROD COUNT LOW HIGH
96
%token PERM SORT REV DROP KEEP FIRST LAST LET FOREACH IF THEN
111
if (cmd_parse_tree) {
116
struct symtab *st = NULL;
118
struct roll_value *rv = roll($1);
119
for (i = 0; i < rv->count; i++) {
120
printf("%i ", rv->values[i]);
126
struct symtab *st = NULL;
128
set_ordering($1, caring);
129
struct val_list *vl = eval($1);
130
struct val_list *cl = vl;
133
if (cl->count != 1) {
134
yyerror("result is not scalar");
137
printf("%3i\t%0.6f\t\n", cl->values[0], cl->prob);
144
struct result_node *rl = NULL;
145
for (i = 0; i < cmd_count; i++) {
146
struct symtab *st = NULL;
148
struct roll_value *rv = roll($1);
149
if (rv->count != 1) {
150
yyerror("Result not a single value");
154
result_add(&rl, rv->values[0]);
158
struct result_node *cl = rl;
167
fprob = 1.0*cl->prob;
169
printf("%3i\t%0.6f\n", cl->value, fprob);
176
expr: scalar { $$ = $1; }
180
scalar: NUMBER { $$ = number_create($1); }
181
| VARIABLE { $$ = variable_create($1); }
182
| '(' scalar ')' { $$ = $2; }
183
| '-' scalar { $$ = negate_create($2); }
184
| scalar '+' scalar { $$ = plus_create($1, $3); }
185
| scalar '-' scalar { $$ = minus_create($1, $3); }
186
| scalar '*' scalar { $$ = multi_create($1, $3); }
187
| scalar '/' scalar { $$ = divi_create($1, $3); }
188
| scalar '%' scalar { $$ = mod_create($1, $3); }
189
| scalar '^' scalar { $$ = expo_create($1, $3); }
190
| scalar '.' scalar { $$ = scat_create($1, $3); }
191
| DICE scalar { $$ = dice_create($2); }
192
| SUM expr { $$ = sum_create($2); }
193
| PROD expr { $$ = prod_create($2); }
194
| COUNT expr { $$ = count_create($2); }
197
list: scalar '#' expr { $$ = rep_create($1, $3); }
198
| '(' list ')' { $$ = $2; }
199
| '(' ')' { $$ = elist_create(); }
200
| scalar RANGE scalar { $$ = range_create($1, $3); }
201
| expr ',' expr { $$ = lcat_create($1, $3); }
202
| PERM expr { $$ = perm_create($2); }
203
| SORT expr { $$ = sort_create($2); }
204
| REV expr { $$ = rev_create($2); }
205
| filter { $$ = $1; }
206
| IF expr THEN expr ELSE expr { $$ = ifthenelse_create($2, $4, $6); }
207
| LET VARIABLE '=' expr IN expr { $$ = let_create($4, $6, $2); }
208
| WHILE VARIABLE '=' expr DO expr { $$ = whiledo_create($4, $6, $2); }
209
| FOREACH VARIABLE IN expr DO expr { $$ = foreach_create($4, $6, $2); }
212
filter: DROP FIRST expr expr { $$ = first_create($3, $4, drop); }
213
| KEEP FIRST expr expr { $$ = first_create($3, $4, keep); }
214
| FIRST expr expr { $$ = first_create($2, $3, keep); }
215
| DROP LAST expr expr { $$ = last_create($3, $4, drop); }
216
| KEEP LAST expr expr { $$ = last_create($3, $4, keep); }
217
| LAST expr expr { $$ = last_create($2, $3, keep); }
218
| DROP HIGH expr expr { $$ = high_create($3, $4, drop); }
219
| KEEP HIGH expr expr { $$ = high_create($3, $4, keep); }
220
| HIGH expr expr { $$ = high_create($2, $3, keep); }
221
| DROP LOW expr expr { $$ = low_create($3, $4, drop); }
222
| KEEP LOW expr expr { $$ = low_create($3, $4, keep); }
223
| LOW expr expr { $$ = low_create($2, $3, keep); }
224
| DROP EQ expr expr { $$ = comparison_create($3, $4, drop, eq); }
225
| KEEP EQ expr expr { $$ = comparison_create($3, $4, keep, eq); }
226
| EQ expr expr { $$ = comparison_create($2, $3, keep, eq); }
227
| DROP NE expr expr { $$ = comparison_create($3, $4, drop, ne); }
228
| KEEP NE expr expr { $$ = comparison_create($3, $4, keep, ne); }
229
| NE expr expr { $$ = comparison_create($2, $3, keep, ne); }
230
| DROP GT expr expr { $$ = comparison_create($3, $4, drop, gt); }
231
| KEEP GT expr expr { $$ = comparison_create($3, $4, keep, gt); }
232
| GT expr expr { $$ = comparison_create($2, $3, keep, gt); }
233
| DROP LT expr expr { $$ = comparison_create($3, $4, drop, lt); }
234
| KEEP LT expr expr { $$ = comparison_create($3, $4, keep, lt); }
235
| LT expr expr { $$ = comparison_create($2, $3, keep, lt); }
236
| DROP GE expr expr { $$ = comparison_create($3, $4, drop, ge); }
237
| KEEP GE expr expr { $$ = comparison_create($3, $4, keep, ge); }
238
| GE expr expr { $$ = comparison_create($2, $3, keep, ge); }
239
| DROP LE expr expr { $$ = comparison_create($3, $4, drop, le); }
240
| KEEP LE expr expr { $$ = comparison_create($3, $4, keep, le); }
241
| LE expr expr { $$ = comparison_create($2, $3, keep, le); }
245
int yyerror(char *s) {
246
fprintf(stderr, "%s:%li %s\n", yycurrfilename(), yycurrlinenum(), s);
250
long yycurrlinenum() {
251
return yyget_lineno();
254
char *yycurrfilename() {
258
void yynodefailed() {