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