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