comparison tests/agcl/oldagsrc/cf-old.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:13d2b8934445
1 {/*
2 AnaGram Syntax Analyzer.
3 Copyright (c) Parsifal Software, 1993.
4 All Rights Reserved.
5
6 Configuration file module
7 */
8 #include HEADERS
9
10 #include DATA
11 #include ASSERT
12 #include CTYPE
13 #include STDLIB
14 #include STRING
15 #include ARRAYS
16 #include MYALLOC
17 #include CF
18 #include PARAMS
19 #include PF
20
21 }
22 [
23 auto resynch
24 context type = cint
25 grammar token = config file
26 ~declare pcb
27 diagnose errors
28 // enum constant name = "cf_%_token"
29 lines and columns
30 line numbers
31 ~allow macros
32 line numbers
33 error frame
34 nest comments
35 ~test range
36 token names
37 pointer input
38 default token type = int
39 near functions
40 ]
41
42 any digit = digit + hex letter
43 backslash = '\\'
44 blank char = ' ' + '\t'
45 carriage return = '\r'
46 digit = '0-9'
47 double quote = '"'
48 eof = 0 + 26
49 eol chars = newline + carriage return
50 hex letter = 'a-f' + 'A-F'
51 letter = 'a-z' + 'A-Z' + '_'
52 newline = '\n'
53 nonoctal digit = any digit - octal digit
54 octal digit = '0-7'
55 simple string char = ~eof - (any digit + double quote + backslash + eol chars)
56 tab = '\t'
57 vertical space = '\f' + '\v'
58
59 equals
60 -> '=', space?
61
62 minus
63 -> '-', space?
64
65 plus
66 -> '+', space?
67
68 tilde
69 -> '~', space?
70 /*
71 left bracket
72 -> '[', space?
73
74 right bracket
75 -> ']', blank?...
76 */
77 left parenthesis
78 -> '(', space?
79
80 right parenthesis
81 -> ')', blank?...
82
83
84 config file
85 -> blank?..., [global parameter | end of line]/..., eof
86
87 (void) global parameter
88 -> name =cf_gp4(1);
89 -> tilde, name =cf_gp4(0);
90 -> name, equals, data type =cf_gp2();
91 -> name, equals, keyword string =cf_gp3();
92 -> name, equals, number:n =cf_gp5(n);
93 -> "trial", blank..., "copy", blank..., "code", blank?..., equals,
94 trial copy code:n =trial_copy_code = n;
95
96 (unsigned long) trial copy code
97 -> '0-9':d =d-'0';
98 -> trial copy code:n, '0-9':d =10*n + d-'0';
99
100 (void) data type
101 -> name
102 -> name, abstract declarator =concat_string();
103
104 (void) abstract declarator
105 -> indirect data type
106 -> direct abstract declarator
107 -> indirect data type, direct abstract declarator =concat_string();
108
109
110 (void) direct abstract declarator
111 -> {left parenthesis =scs('('),0;}, abstract declarator,
112 right parenthesis =concat_string(), acs(')');
113 /*
114 -> brackets
115 -> direct abstract declarator, brackets =concat_string();
116
117 (void) brackets
118 -> left bracket, right bracket =sss("[]");
119 -> left parenthesis, right parenthesis =sss("()");
120 */
121
122 (void) pointer
123 -> star
124 -> star, name =concat_string();
125
126 (void) star
127 -> '*', blank?... =sss(" *");
128
129 (void) indirect data type
130 -> pointer
131 -> indirect data type, pointer =concat_string();
132
133 (void) name string
134 -> letter:a =scs(a);
135 -> name string, letter + digit :a =acs(a);
136 -> name string, blank..., letter + digit :a =acs(' '), acs(a);
137
138 name
139 -> name string, blank?...
140
141 blank
142 -> blank char
143 -> c comment
144
145 space
146 -> blank...
147 -> blank..., continuation
148 -> continuation
149
150 continuation
151 -> comment, next line
152 -> next line
153
154 next line
155 -> carriage return?, newline
156 -> carriage return?, newline, blank...
157
158 white
159 -> blank
160 -> carriage return?, newline
161 -> comment, carriage return?, newline
162
163 end of line
164 -> comment, carriage return?, newline
165 -> carriage return?, newline
166 -> end of line, white
167 -> end of line, vertical space //form feed
168
169 comment
170 -> "//", ~eol chars & ~eof?...
171
172 decimal number
173 -> '1-9':d =d - '0';
174 -> decimal number:n, '0-9':d =10*n + d - '0';
175
176 octal number
177 -> '0' =0;
178 -> octal number:n, '0-7':d =8*n + d - '0';
179
180 hex number
181 -> "0x" =0;
182 -> "0X" =0;
183 -> hex number:n, '0-9':d =16*n + d - '0';
184 -> hex number:n, 'A-F' + 'a-f':d =16*n + (d&7) + 9;
185
186 simple number
187 -> decimal number
188 -> octal number
189 -> hex number
190
191 number
192 -> sign:s, simple number:n, blank?... =s*n;
193
194 sign
195 -> plus? =1;
196 -> minus =-1;
197
198 keyword string
199 -> keyword string head, string, double quote, blank?...
200
201 string
202 -> string A | string B | string C
203
204 (void) keyword string head
205 -> double quote =ics();
206
207 string char
208 -> simple string char
209 -> escape sequence
210
211 escape sequence
212 -> "\\a" ='\a';
213 -> "\\b" ='\b';
214 -> "\\f" ='\f';
215 -> "\\n" ='\n';
216 -> "\\r" ='\r';
217 -> "\\t" ='\t';
218 -> "\\v" ='\v';
219 -> "\\\\" ='\\';
220 -> "\\?" = '\?';
221 -> "\\'" ='\'';
222 -> "\\\"" ='"';
223 -> three octal:n =n==0?cf_error("Null character in string"),0 : n;
224
225 one octal
226 -> backslash, '0-7':n =n&7;
227
228 two octal
229 -> one octal:n, '0-7':d = n*8 + (d&7);
230
231 three octal
232 -> two octal:n, '0-7':d = n*8 + (d&7);
233
234 octal escape
235 -> {one octal | two octal}:n =
236 n==0?cf_error("Null character in string"),0 : n;
237
238 hex escape
239 -> "\\x", hex number:n =n;
240
241 (void) string A
242 -> string char:c =acs(c);
243 -> any digit:c =acs(c);
244 -> string, string char:c =acs(c);
245 -> string A, any digit:c =acs(c);
246 -> string B, nonoctal digit:c =acs(c);
247
248 (void) string B
249 -> octal escape:n =acs(n);
250 -> string, octal escape:n =acs(n);
251
252 (void) string C
253 -> hex escape:n =acs(n);
254 -> string, hex escape:n =acs(n);
255
256 (void) c comment
257 -> c comment text, "*/"
258
259 (void) c comment text
260 -> "/*"
261 -> c comment text, ~eof
262
263 c comment, c comment text
264 -> c comment text, c comment =
265 {if (nest_comments) PCB.reduction_token = cf_c_comment_text_token;}
266
267 [
268 hidden {
269 left parenthesis, right parenthesis,
270 pointer, indirect data type, name string,
271 space, next line, sign, one octal, two octal, three octal,
272 string A, string B, string C, c comment text, escape sequence,
273 octal escape, hex escape, name string
274 }
275 ]
276
277 {
278
279 #define PARSE_STACK_OVERFLOW\
280 {fprintf(stderr,"Parse stack overflow\n");myabort();}
281 #define SYNTAX_ERROR cf_syn_error()
282 #define GET_CONTEXT CONTEXT.x = PCB.column, CONTEXT.y = PCB.line
283
284 #define N_PARAMS 80
285
286
287 static cf_pcb_type cfcb;
288 #define PCB cfcb
289
290 extern string_dict *param_dict;
291 extern unsigned char *input_base;
292 extern int precedence_level;
293 extern int int_token_type;
294
295 void reset_stack(void);
296 void log_error(void);
297
298 static void cf_gp2(void);
299 static void cf_gp3(void);
300 static void cf_gp4(int);
301 static void cf_gp5(int);
302
303 void acs(int);
304 void scs(int);
305
306 void init_params(void);
307
308 unsigned char *read_file(char *);
309
310 static char *config_file;
311
312 static void cf_error(char *);
313
314 static void cf_bad_param(int pn) {
315 char *dm;
316 if (pn) dm = "Inappropriate value";
317 else dm = "No such parameter";
318 cf_error(dm);
319 rcs();
320 return;
321 }
322
323 void xgp5(int, void bad(int), int);
324
325 static void cf_gp5(int tv) {
326 xgp5(tv,cf_bad_param,0);
327 }
328
329 void xgp4(int, void bad(int), int);
330
331 static void cf_gp4(int tv) {
332 xgp4(tv,cf_bad_param,0);
333 }
334
335 void xgp2(void bad(int), int);
336
337 static void cf_gp2(void) {
338 xgp2(cf_bad_param,0);
339 }
340
341 void xgp3(void bad(int), int);
342
343 static void cf_gp3(void) {
344 xgp3(cf_bad_param,0);
345 }
346
347 static int read_config_file(char *path) {
348 char* file_name = allocate(strlen(path)+20,char);
349 char *cp;
350
351 strcpy(file_name, path);
352 cp = strrchr(file_name,PATH_DELIMITER);
353 /*
354 assert(cp != NULL);
355 strcpy(cp+1,"AnaGram.cfg");
356 */
357 if (cp) cp++;
358 else cp = file_name;
359 strcpy(cp,"AnaGram.cfg");
360 config_file = file_name;
361 cfcb.pointer = input_base = read_file(file_name);
362 return input_base != NULL;
363 }
364
365 static void get_config(char *path) {
366 cfcb.pointer = input_base = read_file(path);
367 if (input_base != NULL) {
368 cf();
369 free(input_base);
370 }
371 input_base = NULL;
372 }
373 int in_cur_dir(char *);
374
375 void read_config(char *path) {
376 if (read_config_file(path)) {
377 cf();
378 free(input_base);
379 free(config_file);
380 }
381 if (in_cur_dir(path)) return;
382 config_file = "AnaGram.cfg";
383 get_config("anagram.cfg");
384 }
385
386 static void cf_error(char *msg) {
387 int eline = PCB.line, ecol = PCB.column;
388
389 if (PCB.token_number == cf_eof_token) {
390 eline = ERROR_CONTEXT.y;
391 ecol = ERROR_CONTEXT.x;
392 }
393 ssprintf("%s, Line %d, Col %d: %s", config_file,
394 eline, ecol, msg);
395 log_error();
396 }
397
398 static void cf_syn_error(void) {
399 reset_stk();
400 cf_error(PCB.error_message);
401 }
402
403 param_number_map *map_param_number;
404
405 static void init_param_val_proc(int *pn, char *name, int v) {
406 param_number_map *mpn;
407
408 *pn = add_string_dict(name,param_dict);
409 check_size(map_param_number,*pn,*pn);
410 mpn = &map_param_number[*pn];
411 /* mpn->value_name = 1; */
412 mpn->value = v;
413 }
414
415
416 #define init_param_val(p,v) \
417 init_param_val_proc(&p##_pn, #p,v)
418
419 static param_number_map *id_param(int *pn, void *p, char *name) {
420 int k = add_string_dict(name,param_dict);
421 param_number_map *mpn;
422
423 check_size(map_param_number, k,3*k/2);
424 *pn = k;
425 mpn = &map_param_number[k];
426 mpn->param = p;
427 return mpn;
428 }
429
430 #define init_param(p, global, implicit)\
431 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
432 mpn->global = 1;\
433 mpn->implicit = 1;}
434
435 #define init_param_co(p, global, implicit)\
436 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
437 mpn->global = mpn->config_only = 1;\
438 mpn->implicit = 1;}
439
440 /*
441 #define init_verb(p,param)\
442 {param_number_map *mpn =\
443 &map_param_number[p##_pn = add_string_dict(#p, param_dict)];\
444 mpn->verb = 1;\
445 mpn->value = param##_pn;}
446 */
447 /*
448 #define init_token_param(p,implicit)\
449 {param_number_map *mpn =\
450 &map_param_number[p##_pn = add_string_dict(#p, param_dict)];\
451 mpn->token = 1;\
452 mpn->implicit = 1;}
453 */
454
455 #define init_dict_param(p,global,dict_name)\
456 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
457 mpn->global = 1;\
458 mpn->dict = dict_name;\
459 mpn->value_id = 1;}
460 /*
461 #define init_literal_param(p,global,first_value)\
462 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
463 mpn->value = first_value##_pn;\
464 mpn->global = 1;\
465 mpn->dict = param_dict;\
466 mpn->literal = 1;}
467 */
468
469 #define init_proc_param(p,global,proc_name)\
470 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
471 mpn->global = 1;\
472 mpn->proc = proc_name;\
473 mpn->proc_call = 1;}
474
475 #define init_token_id_param(p,global)\
476 {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
477 mpn->global = 1;\
478 mpn->proc = name_token;\
479 mpn->proc_call = 1;\
480 mpn->token_id = 1;}
481
482 #define dp(p)\
483 static int p##_pn
484
485 dp(on);
486 dp(off);
487
488 extern int allow_macros; dp(allow_macros);
489 int auto_init = 1; dp(auto_init);
490 int auto_resynch = 0; dp(auto_resynch);
491 extern int backtrack; dp(backtrack);
492 int bottom_margin = 3; dp(bottom_margin);
493 int bright_background = 1; dp(bright_background);
494
495 int case_sensitive = 1; dp(case_sensitive);
496 char *compile_command = ""; dp(compile_command);
497 char *context_type = NULL; dp(context_type);
498 char *coverage_file_name = "#.nrc"; dp(coverage_file_name);
499
500 int declare_pcb = 1; dp(declare_pcb);
501 extern int default_input_type; dp(default_input_type);
502 extern int default_token_type; dp(default_token_type);
503 extern int default_reductions; dp(default_reductions);
504 int diagnose_errors = 1; dp(diagnose_errors);
505
506 extern char *edit_command; dp(edit_command);
507 char *enum_constant_name = "$_%_token"; dp(enum_constant_name);
508 int error_frame = 0; dp(error_frame);
509 int error_trace = 0; dp(error_trace);
510 int escape_backslashes = 0; dp(escape_backslashes);
511 int event_driven = 0; dp(event_driven);
512
513 extern int far_tables; dp(far_tables);
514
515 extern int grammar_token; dp(grammar_token);
516 extern char *header_file_name; dp(header_file_name);
517 int input_values = 0; dp(input_values);
518
519 int line_length = 80; dp(line_length);
520 extern int line_numbers; dp(line_numbers);
521 char *line_numbers_path = NULL; dp(line_numbers_path);
522 extern int lines_and_columns; dp(lines_and_columns);
523
524 int main_program = 1; dp(main_program);
525 int max_conflicts = 50; dp(max_conflicts);
526
527 int near_functions = 0; dp(near_functions);
528 int nest_comments = 0; dp(nest_comments);
529
530 int old_style = 0; dp(old_style);
531
532 int page_length = 66; dp(page_length);
533 extern char *parser_file_name; dp(parser_file_name);
534 char *parser_name = "#"; dp(parser_name);
535 int parser_stack_alignment; dp(parser_stack_alignment);
536 int parser_stack_size = 32; dp(parser_stack_size);
537 int pointer_input = 0; dp(pointer_input);
538 char *pointer_type = "unsigned char *"; dp(pointer_type);
539 char *print_file_name = "LPT1"; dp(print_file_name);
540
541 int quick_reference = 1; dp(quick_reference);
542
543 int reduction_choices =0; dp(reduction_choices);
544 int rule_coverage = 0; dp(rule_coverage);
545
546 int tab_spacing = 8; dp(tab_spacing);
547 int test_file_binary = 0; dp(test_file_binary);
548 char *test_file_mask = "*.*"; dp(test_file_mask);
549 extern int test_range; dp(test_range);
550 extern int token_names; dp(token_names);
551 int top_margin = 3; dp(top_margin);
552 extern int traditional_engine; dp(traditional_engine);
553
554 extern int video_mode; dp(video_mode);
555
556 unsigned long trial_copy_code = 0;
557
558
559 /* char *note_file_name = "$.nf"; dp(note_file_name); */
560
561 char *input_type_name = "$_it_type"; /* dp(input_type_name); */
562
563
564 char *control_block_type = "$_pcb_type";
565 char *typedef_name = "$_token_type";
566 char *value_stack_type = "$_vs_type";
567
568
569 extern string_dict *cast_dict;
570 extern string_dict *proc_dict;
571
572
573 extern string_dict *tkn_dict;
574
575 extern int error_token; dp(error_token);
576 /* extern int noise_token; dp(noise_token); */
577 int eof_token = 0; dp(eof_token);
578
579 extern int active_color; dp(active_color);
580 extern int active_bar_color; dp(active_bar_color);
581 extern int inactive_color; dp(inactive_color);
582 extern int inactive_bar_color; dp(inactive_bar_color);
583 extern int backdrop_color; dp(backdrop_color);
584 extern int backdrop_bar_color; dp(backdrop_bar_color);
585
586
587 int id_token(int);
588
589 static int name_token(char *name){
590 sss(name);
591 free(name);
592 ids(tkn_dict);
593 return id_token(fis());
594 }
595
596 void init_params(void) {
597 int n;
598 map_param_number = init_array(N_PARAMS,sizeof(param_number_map));
599
600 init_param_val(off, 0);
601 init_param_val(on, 1);
602
603 /*
604
605 N.B. The following list should be in alphabetical order. Make sure that
606 when you enter a new parameter, you enter it in the right place!
607
608 */
609 init_param(allow_macros, global, implicit);
610 init_param(auto_init, global, implicit);
611 init_param(auto_resynch, global, implicit);
612
613 init_param(backtrack, global, implicit);
614 init_param(bottom_margin, global, int_value);
615 init_param_co(bright_background, global, implicit);
616
617 init_param(case_sensitive, global, implicit);
618 init_param(compile_command, global, string_value);
619 init_param(context_type, global, text_value);
620 init_param(coverage_file_name, global, string_value);
621
622 init_param(declare_pcb, global,implicit);
623 init_dict_param(default_input_type, global, cast_dict);
624 init_param(default_reductions, global, implicit);
625 init_dict_param(default_token_type, global, cast_dict);
626 init_param(diagnose_errors, global, implicit);
627
628 init_param(edit_command, global, string_value);
629 init_param(enum_constant_name, global, string_value);
630 init_token_id_param(eof_token, global);
631 init_param(error_frame, global, implicit);
632 init_token_id_param(error_token, global);
633 init_param(error_trace, global, implicit);
634 init_param(escape_backslashes, global, implicit);
635 init_param(event_driven, global, implicit);
636
637 init_param(far_tables, global, implicit);
638
639 init_token_id_param(grammar_token, global);
640
641 init_param(header_file_name, global, string_value);
642
643 init_param(input_values, global, implicit);
644
645 init_param(line_length, global, int_value);
646 init_param(line_numbers, global, implicit);
647 init_param(line_numbers_path, global, string_value);
648 init_param(lines_and_columns, global, implicit);
649
650 init_param(main_program, global, implicit);
651 init_param(max_conflicts, global, int_value);
652
653 init_param(near_functions, global, implicit);
654 init_param(nest_comments, global, implicit);
655
656 init_param(old_style, global, implicit);
657
658 init_param(page_length, global, int_value);
659 init_param(parser_file_name, global, string_value);
660 init_param(parser_name, global, text_value);
661 init_dict_param(parser_stack_alignment, global, cast_dict);
662 init_param(parser_stack_size, global, int_value);
663 init_param(pointer_input, global, implicit);
664 init_param(pointer_type, global, text_value);
665 init_param(print_file_name, global, string_value);
666
667 init_param(quick_reference, global, implicit);
668
669 init_param(reduction_choices, global, implicit);
670 init_param(rule_coverage, global, implicit);
671
672 init_param(tab_spacing, global, int_value);
673 init_param(test_file_binary, global, implicit);
674 init_param(test_file_mask, global, string_value);
675 init_param(test_range, global, implicit);
676 init_param(token_names, global, implicit);
677 init_param(top_margin, global, int_value);
678 init_param(traditional_engine, global, implicit);
679 init_param_co(video_mode, global, int_value);
680
681
682
683 init_param_co(active_bar_color, global, color_value);
684 init_param_co(active_color, global, color_value);
685 init_param_co(backdrop_bar_color, global, color_value);
686 init_param_co(backdrop_color, global, color_value);
687 init_param_co(inactive_bar_color, global, color_value);
688 init_param_co(inactive_color, global, color_value);
689
690
691 n = param_dict->nsx;
692 assert(n < N_PARAMS);
693 map_param_number = set_array_size(map_param_number, n);
694 }
695 }
696
697
698