view tests/agcl/oldagsrc/cf-old.syn @ 15:f5acaf0c8a29

Don't cast through "volatile int". Causes a gcc warning nowadays. XXX: should put something else back here to frighten the optimizer
author David A. Holland
date Tue, 31 May 2022 01:00:55 -0400
parents 13d2b8934445
children
line wrap: on
line source

{/*
  AnaGram Syntax Analyzer.
  Copyright (c) Parsifal Software, 1993.
  All Rights Reserved.

  Configuration file module
*/
#include HEADERS

#include DATA
#include ASSERT
#include CTYPE
#include STDLIB
#include STRING
#include ARRAYS
#include MYALLOC
#include CF
#include PARAMS
#include PF

}
[
  auto resynch
  context type = cint
  grammar token = config file
 ~declare pcb
	diagnose errors
//	enum constant name = "cf_%_token"
  lines and columns
  line numbers
 ~allow macros
	line numbers
  error frame
  nest comments
 ~test range
  token names
  pointer input
  default token type = int
  near functions
]

any digit = digit + hex letter
backslash = '\\'
blank char = ' ' + '\t'
carriage return = '\r'
digit = '0-9'
double quote = '"'
eof = 0 + 26
eol chars = newline + carriage return
hex letter = 'a-f' + 'A-F'
letter = 'a-z' + 'A-Z' + '_'
newline = '\n'
nonoctal digit = any digit - octal digit
octal digit = '0-7'
simple string char = ~eof - (any digit + double quote + backslash + eol chars)
tab = '\t'
vertical space = '\f' + '\v'

equals
 -> '=', space?

minus
 -> '-', space?

plus
 -> '+', space?

tilde
 -> '~', space?
/*
left bracket
 -> '[', space?

right bracket
 -> ']', blank?...
*/
left parenthesis
 -> '(', space?

right parenthesis
 -> ')', blank?...


config file
 -> blank?..., [global parameter | end of line]/..., eof

(void) global parameter
 -> name                          =cf_gp4(1);
 -> tilde, name                   =cf_gp4(0);
 -> name, equals, data type       =cf_gp2();
 -> name, equals, keyword string  =cf_gp3();
 -> name, equals, number:n        =cf_gp5(n);
 -> "trial", blank..., "copy", blank..., "code", blank?..., equals,
    trial copy code:n             =trial_copy_code = n;

(unsigned long) trial copy code
 -> '0-9':d                       =d-'0';
 -> trial copy code:n, '0-9':d    =10*n + d-'0';

(void) data type
 -> name
 -> name, abstract declarator  =concat_string();

(void) abstract declarator
 -> indirect data type
 -> direct abstract declarator
 -> indirect data type, direct abstract declarator  =concat_string();


(void) direct abstract declarator
 -> {left parenthesis =scs('('),0;}, abstract declarator,
     right parenthesis =concat_string(), acs(')');
/*
 -> brackets
 -> direct abstract declarator, brackets =concat_string();

(void) brackets
 -> left bracket, right bracket =sss("[]");
 -> left parenthesis, right parenthesis     =sss("()");
*/

(void) pointer
 -> star
 -> star, name  =concat_string();

(void) star
 -> '*', blank?... =sss(" *");

(void) indirect data type
 -> pointer
 -> indirect data type, pointer  =concat_string();

(void) name string
 -> letter:a   =scs(a);
 -> name string, letter + digit :a =acs(a);
 -> name string, blank..., letter + digit :a =acs(' '), acs(a);

name
 -> name string, blank?...

blank
 -> blank char
 -> c comment

space
 -> blank...
 -> blank..., continuation
 -> continuation

continuation
 -> comment, next line
 -> next line

next line
 -> carriage return?, newline
 -> carriage return?, newline, blank...

white
 -> blank
 -> carriage return?, newline
 -> comment, carriage return?, newline

end of line
 -> comment, carriage return?, newline
 -> carriage return?, newline
 -> end of line, white
 -> end of line, vertical space //form feed

comment
 -> "//", ~eol chars & ~eof?...

decimal number
 -> '1-9':d                       =d - '0';
 -> decimal number:n, '0-9':d     =10*n + d - '0';

octal number
 -> '0'                          =0;
 -> octal number:n, '0-7':d      =8*n + d - '0';

hex number
 -> "0x"                       =0;
 -> "0X"                       =0;
 -> hex number:n, '0-9':d      =16*n + d - '0';
 -> hex number:n, 'A-F' + 'a-f':d      =16*n + (d&7) + 9;

simple number
 -> decimal number
 -> octal number
 -> hex number

number
 -> sign:s, simple number:n, blank?... =s*n;

sign
 -> plus?         =1;
 -> minus         =-1;

keyword string
 -> keyword string head, string,  double quote, blank?...

string
 -> string A | string B | string C

(void) keyword string head
 -> double quote =ics();

string char
 -> simple string char
 -> escape sequence

escape sequence
 -> "\\a" ='\a';
 -> "\\b" ='\b';
 -> "\\f" ='\f';
 -> "\\n" ='\n';
 -> "\\r" ='\r';
 -> "\\t" ='\t';
 -> "\\v" ='\v';
 -> "\\\\" ='\\';
 -> "\\?" = '\?';
 -> "\\'" ='\'';
 -> "\\\"" ='"';
 -> three octal:n =n==0?cf_error("Null character in string"),0 : n;

one octal
 -> backslash, '0-7':n                      =n&7;

two octal
 -> one octal:n, '0-7':d                    = n*8 + (d&7);

three octal
 -> two octal:n, '0-7':d                    = n*8 + (d&7);

octal escape
 -> {one octal | two octal}:n =
     n==0?cf_error("Null character in string"),0 : n;

hex escape
 -> "\\x", hex number:n   =n;

(void) string A
 -> string char:c               =acs(c);
 -> any digit:c                 =acs(c);
 -> string, string char:c       =acs(c);
 -> string A, any digit:c       =acs(c);
 -> string B, nonoctal digit:c  =acs(c);

(void) string B
 -> octal escape:n              =acs(n);
 -> string, octal escape:n      =acs(n);

(void) string C
 -> hex escape:n                =acs(n);
 -> string, hex escape:n        =acs(n);

(void) c comment
 -> c comment text, "*/"

(void) c comment text
 -> "/*"
 -> c comment text, ~eof

c comment, c comment text
 -> c comment text, c comment =
{if (nest_comments) PCB.reduction_token = cf_c_comment_text_token;}

[
  hidden {
    left parenthesis, right parenthesis,
    pointer, indirect data type, name string,
    space, next line, sign, one octal, two octal, three octal,
    string A, string B, string C, c comment text, escape sequence,
    octal escape, hex escape, name string
  }
]

{

#define PARSE_STACK_OVERFLOW\
  {fprintf(stderr,"Parse stack overflow\n");myabort();}
#define SYNTAX_ERROR cf_syn_error()
#define GET_CONTEXT CONTEXT.x = PCB.column, CONTEXT.y = PCB.line

#define N_PARAMS 80


static cf_pcb_type cfcb;
#define PCB cfcb

extern string_dict *param_dict;
extern unsigned char *input_base;
extern int precedence_level;
extern int int_token_type;

void reset_stack(void);
void log_error(void);

static void cf_gp2(void);
static void cf_gp3(void);
static void cf_gp4(int);
static void cf_gp5(int);

void acs(int);
void scs(int);

void init_params(void);

unsigned char *read_file(char *);

static char *config_file;

static void cf_error(char *);

static void cf_bad_param(int pn) {
	char *dm;
	if (pn) dm = "Inappropriate value";
	else dm = "No such parameter";
	cf_error(dm);
  rcs();
  return;
}

void xgp5(int, void bad(int), int);

static void cf_gp5(int tv) {
  xgp5(tv,cf_bad_param,0);
}

void xgp4(int, void bad(int), int);

static void cf_gp4(int tv) {
  xgp4(tv,cf_bad_param,0);
}

void xgp2(void bad(int), int);

static void cf_gp2(void) {
  xgp2(cf_bad_param,0);
}

void xgp3(void bad(int), int);

static void cf_gp3(void) {
  xgp3(cf_bad_param,0);
}

static int read_config_file(char *path) {
  char* file_name = allocate(strlen(path)+20,char);
  char *cp;

  strcpy(file_name, path);
  cp = strrchr(file_name,PATH_DELIMITER);
/*
  assert(cp != NULL);
  strcpy(cp+1,"AnaGram.cfg");
*/
  if (cp) cp++;
  else cp = file_name;
  strcpy(cp,"AnaGram.cfg");
  config_file = file_name;
  cfcb.pointer = input_base = read_file(file_name);
  return input_base != NULL;
}

static void get_config(char *path) {
  cfcb.pointer = input_base = read_file(path);
  if (input_base != NULL) {
    cf();
    free(input_base);
  }
  input_base = NULL;
}
int in_cur_dir(char *);

void read_config(char *path) {
  if (read_config_file(path)) {
    cf();
    free(input_base);
    free(config_file);
  }
  if (in_cur_dir(path)) return;
  config_file = "AnaGram.cfg";
  get_config("anagram.cfg");
}

static void cf_error(char *msg) {
  int eline = PCB.line, ecol = PCB.column;

  if (PCB.token_number == cf_eof_token) {
    eline = ERROR_CONTEXT.y;
    ecol = ERROR_CONTEXT.x;
  }
  ssprintf("%s, Line %d, Col %d: %s", config_file,
    eline, ecol, msg);
  log_error();
}

static void cf_syn_error(void) {
  reset_stk();
  cf_error(PCB.error_message);
}

param_number_map *map_param_number;

static void init_param_val_proc(int *pn, char *name, int v) {
  param_number_map *mpn;

  *pn = add_string_dict(name,param_dict);
  check_size(map_param_number,*pn,*pn);
  mpn = &map_param_number[*pn];
/*  mpn->value_name = 1; */
  mpn->value = v;
}


#define init_param_val(p,v) \
  init_param_val_proc(&p##_pn, #p,v)

static param_number_map *id_param(int *pn, void *p, char *name) {
  int k = add_string_dict(name,param_dict);
  param_number_map *mpn;

  check_size(map_param_number, k,3*k/2);
  *pn = k;
  mpn = &map_param_number[k];
  mpn->param = p;
  return mpn;
}

#define init_param(p, global, implicit)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->global = 1;\
  mpn->implicit = 1;}

#define init_param_co(p, global, implicit)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->global = mpn->config_only = 1;\
  mpn->implicit = 1;}

/*
#define init_verb(p,param)\
 {param_number_map *mpn =\
  &map_param_number[p##_pn = add_string_dict(#p, param_dict)];\
  mpn->verb = 1;\
  mpn->value = param##_pn;}
*/
/*
#define init_token_param(p,implicit)\
  {param_number_map *mpn =\
   &map_param_number[p##_pn = add_string_dict(#p, param_dict)];\
  mpn->token = 1;\
  mpn->implicit = 1;}
*/

#define init_dict_param(p,global,dict_name)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->global = 1;\
  mpn->dict = dict_name;\
  mpn->value_id = 1;}
/*
#define init_literal_param(p,global,first_value)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->value = first_value##_pn;\
  mpn->global = 1;\
  mpn->dict = param_dict;\
  mpn->literal = 1;}
*/

#define init_proc_param(p,global,proc_name)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->global = 1;\
  mpn->proc = proc_name;\
  mpn->proc_call = 1;}

#define init_token_id_param(p,global)\
  {param_number_map *mpn = id_param(&p##_pn,&p, #p);\
  mpn->global = 1;\
  mpn->proc = name_token;\
  mpn->proc_call = 1;\
  mpn->token_id = 1;}

#define dp(p)\
static int p##_pn

dp(on);
dp(off);

extern int   allow_macros;                      dp(allow_macros);
       int   auto_init = 1;                     dp(auto_init);
       int   auto_resynch = 0;                  dp(auto_resynch);
extern int   backtrack;                         dp(backtrack);
       int   bottom_margin = 3;                 dp(bottom_margin);
       int   bright_background = 1;             dp(bright_background);

       int   case_sensitive = 1;                dp(case_sensitive);
			 char *compile_command = "";              dp(compile_command);
       char *context_type = NULL;               dp(context_type);
       char *coverage_file_name = "#.nrc";      dp(coverage_file_name);

       int   declare_pcb = 1;                   dp(declare_pcb);
extern int   default_input_type;                dp(default_input_type);
extern int   default_token_type;                dp(default_token_type);
extern int   default_reductions;                dp(default_reductions);
       int   diagnose_errors = 1;               dp(diagnose_errors);

extern char *edit_command;                      dp(edit_command);
			 char *enum_constant_name = "$_%_token";  dp(enum_constant_name);
       int   error_frame = 0;                   dp(error_frame);
       int   error_trace = 0;                   dp(error_trace);
       int   escape_backslashes = 0;            dp(escape_backslashes);
       int   event_driven = 0;                  dp(event_driven);

extern int   far_tables;                        dp(far_tables);

extern int   grammar_token;                     dp(grammar_token);
extern char *header_file_name;                  dp(header_file_name);
       int   input_values = 0;                  dp(input_values);

       int   line_length = 80;                  dp(line_length);
extern int   line_numbers;                      dp(line_numbers);
       char *line_numbers_path = NULL;          dp(line_numbers_path);
extern int   lines_and_columns;                 dp(lines_and_columns);

       int   main_program = 1;                  dp(main_program);
       int   max_conflicts = 50;                dp(max_conflicts);

       int   near_functions = 0;                dp(near_functions);
       int   nest_comments = 0;                 dp(nest_comments);

       int   old_style = 0;                     dp(old_style);

       int   page_length = 66;                  dp(page_length);
extern char *parser_file_name;                  dp(parser_file_name);
       char *parser_name = "#";                 dp(parser_name);
       int   parser_stack_alignment;            dp(parser_stack_alignment);
       int   parser_stack_size = 32;            dp(parser_stack_size);
       int   pointer_input = 0;                 dp(pointer_input);
       char *pointer_type = "unsigned char *";  dp(pointer_type);
       char *print_file_name = "LPT1";          dp(print_file_name);

       int   quick_reference = 1;               dp(quick_reference);

       int   reduction_choices =0;              dp(reduction_choices);
       int   rule_coverage = 0;                 dp(rule_coverage);

			 int   tab_spacing = 8;                   dp(tab_spacing);
       int   test_file_binary = 0;              dp(test_file_binary);
       char *test_file_mask = "*.*";            dp(test_file_mask);
extern int   test_range;                        dp(test_range);
extern int   token_names;                       dp(token_names);
       int   top_margin = 3;                    dp(top_margin);
extern int   traditional_engine;                dp(traditional_engine);

extern int   video_mode;                        dp(video_mode);

       unsigned long trial_copy_code = 0;


/* char *note_file_name = "$.nf";  dp(note_file_name); */

       char *input_type_name = "$_it_type"; /* dp(input_type_name); */


char *control_block_type = "$_pcb_type";
char *typedef_name       = "$_token_type";
char *value_stack_type   = "$_vs_type";


extern string_dict *cast_dict;
extern string_dict *proc_dict;


extern string_dict *tkn_dict;

extern int error_token; dp(error_token);
/* extern int noise_token; dp(noise_token); */
int eof_token = 0; dp(eof_token);

extern int active_color;        dp(active_color);
extern int active_bar_color;    dp(active_bar_color);
extern int inactive_color;      dp(inactive_color);
extern int inactive_bar_color;  dp(inactive_bar_color);
extern int backdrop_color;      dp(backdrop_color);
extern int backdrop_bar_color;  dp(backdrop_bar_color);


int id_token(int);

static int name_token(char *name){
  sss(name);
  free(name);
  ids(tkn_dict);
  return id_token(fis());
}

void init_params(void) {
  int n;
  map_param_number = init_array(N_PARAMS,sizeof(param_number_map));

  init_param_val(off, 0);
  init_param_val(on, 1);

/*

  N.B. The following list should be in alphabetical order. Make sure that
  when you enter a new parameter, you enter it in the right place!

*/
  init_param(allow_macros, global, implicit);
  init_param(auto_init, global, implicit);
  init_param(auto_resynch, global, implicit);

  init_param(backtrack, global, implicit);
  init_param(bottom_margin, global, int_value);
  init_param_co(bright_background, global, implicit);

  init_param(case_sensitive, global, implicit);
	init_param(compile_command, global, string_value);
  init_param(context_type, global, text_value);
  init_param(coverage_file_name, global, string_value);

  init_param(declare_pcb, global,implicit);
  init_dict_param(default_input_type, global, cast_dict);
  init_param(default_reductions, global, implicit);
  init_dict_param(default_token_type, global, cast_dict);
  init_param(diagnose_errors, global, implicit);

  init_param(edit_command, global, string_value);
	init_param(enum_constant_name, global, string_value);
  init_token_id_param(eof_token, global);
  init_param(error_frame, global, implicit);
  init_token_id_param(error_token, global);
  init_param(error_trace, global, implicit);
  init_param(escape_backslashes, global, implicit);
  init_param(event_driven, global, implicit);

  init_param(far_tables, global, implicit);

  init_token_id_param(grammar_token, global);

  init_param(header_file_name, global, string_value);

  init_param(input_values, global, implicit);

  init_param(line_length, global, int_value);
  init_param(line_numbers, global, implicit);
  init_param(line_numbers_path, global, string_value);
  init_param(lines_and_columns, global, implicit);

  init_param(main_program, global, implicit);
  init_param(max_conflicts, global, int_value);

  init_param(near_functions, global, implicit);
  init_param(nest_comments, global, implicit);

  init_param(old_style, global, implicit);

  init_param(page_length, global, int_value);
  init_param(parser_file_name, global, string_value);
  init_param(parser_name, global, text_value);
  init_dict_param(parser_stack_alignment, global, cast_dict);
  init_param(parser_stack_size, global, int_value);
  init_param(pointer_input, global, implicit);
  init_param(pointer_type, global, text_value);
  init_param(print_file_name, global, string_value);

  init_param(quick_reference, global, implicit);

  init_param(reduction_choices, global, implicit);
  init_param(rule_coverage, global, implicit);

	init_param(tab_spacing, global, int_value);
  init_param(test_file_binary, global, implicit);
  init_param(test_file_mask, global, string_value);
  init_param(test_range, global, implicit);
  init_param(token_names, global, implicit);
  init_param(top_margin, global, int_value);
  init_param(traditional_engine, global, implicit);
  init_param_co(video_mode, global, int_value);



  init_param_co(active_bar_color, global, color_value);
  init_param_co(active_color, global, color_value);
  init_param_co(backdrop_bar_color, global, color_value);
  init_param_co(backdrop_color, global, color_value);
  init_param_co(inactive_bar_color, global, color_value);
  init_param_co(inactive_color, global, color_value);


  n = param_dict->nsx;
  assert(n < N_PARAMS);
  map_param_number = set_array_size(map_param_number, n);
}
}