%{ /* rpldef_y.y Yacc syntactical description of a rpldef file, which formats and names all of the data to come out of sd_rpl, for the benefit of rep and the template writer. */ extern unsigned char global_defs[25][50]; extern int global_def_index; extern struct { unsigned char name[50]; unsigned char field_names[50][50]; unsigned char list_field_names[50][50]; } card_types[100]; extern int card_type_index; int field_name_index; int list_field_name_index; typedef unsigned char *charptr; #define YYSTYPE charptr %} %start rpldef %token NAME %% rpldef: globals { strcpy(global_defs[global_def_index],""); } cards { strcpy(card_types[card_type_index].name,""); } ; globals: NAME '|' { strcpy(global_defs[global_def_index++],$1); } | globals NAME '|' { strcpy(global_defs[global_def_index++],$2); } ; cards: card { strcpy(card_types[card_type_index] .field_names[field_name_index],""); strcpy(card_types[card_type_index] .list_field_names[list_field_name_index],""); field_name_index = 0; list_field_name_index = 0; card_type_index++; } | cards card { strcpy(card_types[card_type_index] .field_names[field_name_index],""); strcpy(card_types[card_type_index] .list_field_names[list_field_name_index],""); field_name_index = 0; list_field_name_index = 0; card_type_index++; } ; card: '~' primary_fields '#' secondary_fields | '~' primary_fields ; primary_fields: NAME '|' { /* first field will be card name */ strcpy(card_types[card_type_index].name,$1); #ifdef RPLDEF_DEBUG printf("rpldef_y.y: name written %s\n",$1); #endif } | primary_fields NAME '|' { strcpy(card_types[card_type_index]. field_names[field_name_index++],$2); } ; secondary_fields: NAME '|' { strcpy(card_types[card_type_index]. list_field_names[list_field_name_index++],$2); } | secondary_fields NAME '|' { strcpy(card_types[card_type_index]. list_field_names[list_field_name_index++],$2); } ; %% #include "rpldef_l.c" yyerror() { printf("Problem with rpldef file.\n"); printf("Syntax error on line %d: Unknown parameter: %s. Exiting\n",yylineno,yytext); } read_rpldef() { FILE *rpl_fd; if ((rpl_fd = fopen("rpldef","r")) == NULL) { printf("No rpldef file. Exiting. \n"); exit(0); } field_name_index = 0; list_field_name_index = 0; yyin = rpl_fd; rpldef_parse(); }