book/src/atccl.y
author Eugen Sawin <sawine@me73.com>
Mon, 28 Mar 2011 19:25:26 +0200
changeset 8 baaaa26809cf
permissions -rw-r--r--
Final corrections.
sawine@1
     1
%{
sawine@1
     2
#include <stdlib.h>
sawine@1
     3
#include <stdio.h>
sawine@1
     4
#include <string.h>
sawine@1
     5
#include "semantic_helper.hh"
sawine@1
     6
sawine@1
     7
#define MAX_ID_TABLE_NO 1024 
sawine@1
     8
char* id_table[MAX_ID_TABLE_NO];
sawine@1
     9
int id_table_no;
sawine@1
    10
ErrorType* errors;
sawine@1
    11
int maxErrorNo;
sawine@1
    12
int errorNo;
sawine@1
    13
int yylex();
sawine@1
    14
int yywrap();
sawine@1
    15
int yyerror(const char *str);
sawine@1
    16
void yyrestart(FILE* file);
sawine@1
    17
%}
sawine@1
    18
%token
sawine@1
    19
CONSTRNT PATTERN FLOWP COM
sawine@1
    20
QUOTE THAN FROM UNTIL ON
sawine@1
    21
sawine@1
    22
%union
sawine@1
    23
{
sawine@1
    24
	int integer;
sawine@1
    25
	double real;
sawine@1
    26
	const char* string;
sawine@1
    27
}
sawine@1
    28
sawine@1
    29
%token <integer> INTEGER
sawine@1
    30
%token <integer> TIME
sawine@1
    31
%token <real> 	REAL
sawine@1
    32
%token <string> STRING
sawine@1
    33
%token <integer> IS 
sawine@1
    34
%token <integer> IN 
sawine@1
    35
%token <integer> GREATER 
sawine@1
    36
%token <integer> LESS 
sawine@1
    37
%token <integer> NOT 
sawine@1
    38
%token <integer> AND 
sawine@1
    39
%token <integer> OR 
sawine@1
    40
%token <integer> AT
sawine@1
    41
%token <integer> COPX
sawine@1
    42
%token <integer> GATE
sawine@1
    43
%token <integer> INTERNAL
sawine@1
    44
%token <integer> GLOBAL
sawine@1
    45
%token <integer> ADEP
sawine@1
    46
%token <integer> ADES
sawine@1
    47
%token <integer> RWY
sawine@1
    48
%token <integer> ROUTE
sawine@1
    49
%token <integer> ATYP
sawine@1
    50
%token <integer> FLVL
sawine@1
    51
%token <integer> TAS
sawine@1
    52
%token <integer> FRUL
sawine@1
    53
%token <integer> FTYP
sawine@1
    54
%token <integer> EQUIP
sawine@1
    55
%token <integer> RFL
sawine@1
    56
%token <integer> TRAVEL_TYPE
sawine@1
    57
%token <integer> TIMESEP 
sawine@1
    58
%token <integer> DEPTIME
sawine@1
    59
%token <integer> ARRTIME
sawine@1
    60
%token <integer> GATETIME
sawine@1
    61
%token <integer> FL
sawine@1
    62
%type <string> string
sawine@1
    63
%type <string> pttrn
sawine@1
    64
%type <string> flowp
sawine@1
    65
%type <string> constrnt
sawine@1
    66
%type <integer> int
sawine@1
    67
%type <integer> string_array
sawine@1
    68
%type <integer> int_array
sawine@1
    69
%type <integer> int_pt
sawine@1
    70
%type <integer> time_pt
sawine@1
    71
%type <integer> char_pt
sawine@1
    72
%type <integer> string_pt
sawine@1
    73
%type <integer> string_array_pt
sawine@1
    74
%type <integer> char_array_pt
sawine@1
    75
%type <integer> int_op
sawine@1
    76
%type <integer> string_op
sawine@1
    77
%type <integer> string_array_op
sawine@1
    78
%type <integer> string_string_array_op
sawine@1
    79
%type <integer> si_unit
sawine@1
    80
sawine@1
    81
%left OR
sawine@1
    82
%left AND
sawine@1
    83
%right NOT
sawine@1
    84
%%
sawine@1
    85
prog: | prog rule {  } 
sawine@1
    86
      | error ')' { yyerrok; yyclearin;}				
sawine@1
    87
;
sawine@1
    88
rule: pttrn      { if (!pattern($1)) 
sawine@1
    89
                   printf("Error: %s\n", last_error()); }
sawine@1
    90
      | constrnt { if (!constraint($1)) 
sawine@1
    91
                   printf("Error: %s\n", last_error()); }
sawine@1
    92
      | flowp    { if (!flowpoint($1)) 
sawine@1
    93
                   printf("Error: %s\n", last_error()); }
sawine@1
    94
      | COM      { comment(); }
sawine@1
    95
;
sawine@1
    96
flowp: FLOWP STRING '(' flowp_entry ')' { $$ = $2; }
sawine@1
    97
;
sawine@1
    98
flowp_entry: pttrn_lbl ':' constrnt_lbl					
sawine@1
    99
;
sawine@1
   100
pttrn_lbl: STRING { if (!pattern_id($1)) 
sawine@1
   101
                    printf("Error: %s\n", last_error()); }						
sawine@1
   102
;
sawine@1
   103
constrnt_lbl: STRING { if (!constraint_id($1)) 
sawine@1
   104
                       printf("Error: %s\n", last_error()); }
sawine@1
   105
;
sawine@1
   106
constrnt: CONSTRNT STRING '(' cterm ')' { $$ = $2; }
sawine@1
   107
;
sawine@1
   108
cterm:  TIMESEP AT string IS INTEGER si_unit		
sawine@1
   109
        { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   110
                                 0, 0, 0); }				
sawine@1
   111
        | TIMESEP AT string_array IS INTEGER si_unit
sawine@1
   112
        { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   113
                                      0, 0, 0); }		
sawine@1
   114
        | TIMESEP AT string IS INTEGER si_unit 
sawine@1
   115
          FROM INTEGER UNTIL INTEGER	
sawine@1
   116
        { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, 
sawine@1
   117
                                 $10, 0); }				
sawine@1
   118
        | TIMESEP AT string_array IS INTEGER si_unit 
sawine@1
   119
          FROM INTEGER UNTIL INTEGER
sawine@1
   120
        { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   121
                                      $8, $10, 0); }	
sawine@1
   122
        | TIMESEP AT string IS INTEGER si_unit AT FL int_array
sawine@1
   123
        { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   124
                                 0, 0, $9); }				
sawine@1
   125
        | TIMESEP AT string_array IS INTEGER si_unit 
sawine@1
   126
          AT FL int_array
sawine@1
   127
        { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   128
                                      0, 0, $9); }		
sawine@1
   129
        | TIMESEP AT string IS INTEGER si_unit 
sawine@1
   130
            FROM INTEGER UNTIL INTEGER AT FL int_array	
sawine@1
   131
        { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, 
sawine@1
   132
                                 $10, $13); }				
sawine@1
   133
        | TIMESEP AT string_array IS INTEGER si_unit 
sawine@1
   134
            FROM INTEGER UNTIL INTEGER AT FL int_array
sawine@1
   135
        { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 
sawine@1
   136
                                      $8, $10, $13); }						
sawine@1
   137
        | cterm AND cterm { and_term(); }
sawine@1
   138
;
sawine@1
   139
si_unit: STRING	{ if (!strcmp($1, "s"))        { $$ = 1; }
sawine@1
   140
                  else if (!strcmp($1, "min")) { $$ = 60; } }
sawine@1
   141
;
sawine@1
   142
pttrn: PATTERN STRING '(' term ')' { $$ = $2; }
sawine@1
   143
       | PATTERN '(' term ')'      { $$ = get_pattern_id(); }
sawine@1
   144
;
sawine@1
   145
term:   int_pt int_op INTEGER	
sawine@1
   146
        { intpt_int_term($2, $1, $3); }	
sawine@1
   147
        | time_pt int_op INTEGER
sawine@1
   148
        { time_pt_int_term($2, $1, $3); }
sawine@1
   149
        | char_pt string_op string
sawine@1
   150
        { charpt_char_term($2, $1, $3); }	
sawine@1
   151
        | string_pt string_op string
sawine@1
   152
        { stringpt_string_term($2, $1, $3); }
sawine@1
   153
        | string_array_pt string_array_op string_array
sawine@1
   154
        { stringarraypt_stringarray_term($2, $1, $3); }			
sawine@1
   155
        | string_array string_array_op string_array_pt
sawine@1
   156
        { if ($2 == OT_IN_C)         { $2 = OT_IN_P; }
sawine@1
   157
          else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; }
sawine@1
   158
          stringarraypt_stringarray_term($2, $3, $1); }	
sawine@1
   159
        | string string_string_array_op string_array_pt
sawine@1
   160
        { if ($2 == OT_IN_C)         { $2 = OT_IN_P; }
sawine@1
   161
          else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; } 
sawine@1
   162
          stringarraypt_string_term($2, $3, $1); }	
sawine@1
   163
        | string string_string_array_op char_array_pt
sawine@1
   164
        { if ($2 == OT_IN_C)         { $2 = OT_IN_P; }
sawine@1
   165
          else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; } 
sawine@1
   166
          chararraypt_char_term($2, $3, $1); }			
sawine@1
   167
        | term OR term 	{ or_term(); }
sawine@1
   168
        | term AND term { and_term(); } 
sawine@1
   169
        | NOT term						
sawine@1
   170
        | '(' term ')'				
sawine@1
   171
;
sawine@1
   172
int_op:	IS             { $$ = OT_IS; }	
sawine@1
   173
        | IS NOT	   { $$ = OT_ISNOT; } 
sawine@1
   174
        | GREATER THAN { $$ = OT_GREATER; }
sawine@1
   175
        | LESS THAN	   { $$ = OT_LESS; }
sawine@1
   176
;
sawine@1
   177
string_op: IS       { $$ = OT_IS; }	
sawine@1
   178
           | IS NOT { $$ = OT_ISNOT; } 
sawine@1
   179
;
sawine@1
   180
string_array_op: IS       { $$ = OT_IS; }
sawine@1
   181
                 | IS NOT { $$ = OT_ISNOT; } 
sawine@1
   182
                 | IN 	  { $$ = OT_IN_P; }
sawine@1
   183
                 | NOT IN { $$ = OT_NOTIN_P; }
sawine@1
   184
;
sawine@1
   185
string_string_array_op: IN       { $$ = OT_IN_P; }
sawine@1
   186
                        | NOT IN { $$ = OT_NOTIN_P; }
sawine@1
   187
;
sawine@1
   188
int_array: '[' ints ']' { $$ = integer_array(); }
sawine@1
   189
;
sawine@1
   190
ints: | ints ',' int
sawine@1
   191
      | ints int
sawine@1
   192
;
sawine@1
   193
int:  INTEGER { integer($1); $$ = $1; }
sawine@1
   194
; 
sawine@1
   195
string_array: '[' strings ']' { $$ = string_array(); }
sawine@1
   196
;
sawine@1
   197
strings: | strings ',' string
sawine@1
   198
         | strings string
sawine@1
   199
;
sawine@1
   200
int_pt: TAS        { $$ = PT_TAS; }
sawine@1
   201
        | INTERNAL { $$ = PT_INTERNAL; } 			
sawine@1
   202
        | GLOBAL   { $$ = PT_GLOBAL; } 			
sawine@1
   203
;
sawine@1
   204
time_pt: DEPTIME    { $$ = PT_DEPTIME;  }
sawine@1
   205
         | ARRTIME  { $$ = PT_ARRTIME;  }
sawine@1
   206
         | GATETIME { $$ = PT_GATETIME; }
sawine@1
   207
;
sawine@1
   208
char_pt: FTYP { $$ = PT_FTYP; }
sawine@1
   209
;
sawine@1
   210
string_pt:  ADEP          { $$ = PT_ADEP; }
sawine@1
   211
            | ADES        { $$ = PT_ADES; }
sawine@1
   212
            | RWY         { $$ = PT_RWY; }
sawine@1
   213
            | ATYP        { $$ = PT_ATYP; }
sawine@1
   214
            | COPX        { $$ = PT_COPX; }				
sawine@1
   215
            | GATE        { $$ = PT_GATE; }				
sawine@1
   216
            | FRUL        { $$ = PT_FRUL; }				
sawine@1
   217
            | RFL         { $$ = PT_RFL; }
sawine@1
   218
            | TRAVEL_TYPE { $$ = PT_TRAVEL_TYPE; }
sawine@1
   219
;
sawine@1
   220
string_array_pt: ROUTE { $$ = PT_ROUTE; }				
sawine@1
   221
;
sawine@1
   222
char_array_pt: EQUIP { $$ = PT_EQUIP; }
sawine@1
   223
;
sawine@1
   224
string: QUOTE STRING QUOTE { string($2); $$ = $2; }
sawine@1
   225
;
sawine@1
   226
%%
sawine@1
   227
#include "atccl_parser.c"
sawine@1
   228
void clear_id_table()
sawine@1
   229
{
sawine@1
   230
    int i;
sawine@1
   231
    for (i = 0; i < id_table_no; ++i)
sawine@1
   232
    {
sawine@1
   233
        free(id_table[i]);
sawine@1
   234
        id_table[i] = 0;
sawine@1
   235
    }
sawine@1
   236
    id_table_no = 0;
sawine@1
   237
}
sawine@1
   238
int yywrap()
sawine@1
   239
{
sawine@1
   240
    clear_id_table();
sawine@1
   241
    return 1;
sawine@1
   242
}
sawine@1
   243
int semantic_error(const char* str)
sawine@1
   244
{
sawine@1
   245
    if (errorNo < maxErrorNo)
sawine@1
   246
    {
sawine@1
   247
        errors[errorNo].line = -1;
sawine@1
   248
        strcpy(errors[errorNo].text, "");
sawine@1
   249
        strcpy(errors[errorNo].error, str);		
sawine@1
   250
        errorNo++;
sawine@1
   251
    }		
sawine@1
   252
    return 1;
sawine@1
   253
}
sawine@1
   254
int yyerror(const char *str)
sawine@1
   255
{
sawine@1
   256
    if (errorNo < maxErrorNo)
sawine@1
   257
    {
sawine@1
   258
        errors[errorNo].line = line_no;
sawine@1
   259
        strcpy(errors[errorNo].text, yytext);
sawine@1
   260
        strcpy(errors[errorNo].error, str);		
sawine@1
   261
        errorNo++;
sawine@1
   262
    }		
sawine@1
   263
    return 1;
sawine@1
   264
}
sawine@1
   265
int parse_syntax(FILE* file, ErrorType* errors_, 
sawine@1
   266
                 int maxErrorNo_, int passes)
sawine@1
   267
{
sawine@1
   268
    line_no = 1;
sawine@1
   269
    errors = errors_;
sawine@1
   270
    maxErrorNo = maxErrorNo_;
sawine@1
   271
    errorNo = 0;
sawine@1
   272
    clear_all();
sawine@1
   273
    clear_id_table();		
sawine@1
   274
    yyrestart(file);
sawine@1
   275
    yyparse();
sawine@1
   276
sawine@1
   277
    if (passes > 1)
sawine@1
   278
    {	
sawine@1
   279
        if (!complete_semantics())
sawine@1
   280
        {
sawine@1
   281
            semantic_error(last_error());
sawine@1
   282
        }	
sawine@1
   283
    }	
sawine@1
   284
    return errorNo;
sawine@1
   285
}