book/src/bison_config1.txt
author Eugen Sawin <sawine@me73.com>
Wed, 30 Mar 2011 15:34:56 +0200
changeset 16 421fa3452b41
permissions -rw-r--r--
Final?
sawine@1
     1
%token
sawine@1
     2
CONSTRNT PATTERN FLOWP COM
sawine@1
     3
QUOTE THAN FROM UNTIL ON
sawine@1
     4
sawine@1
     5
%union
sawine@1
     6
{
sawine@1
     7
	int integer;
sawine@1
     8
	double real;
sawine@1
     9
	const char* string;
sawine@1
    10
}
sawine@1
    11
sawine@1
    12
%token <integer> INTEGER
sawine@1
    13
%token <integer> TIME
sawine@1
    14
%token <real> 	REAL
sawine@1
    15
%token <string> STRING
sawine@1
    16
sawine@1
    17
sawine@1
    18
%token <integer> IS 
sawine@1
    19
%token <integer> IN 
sawine@1
    20
%token <integer> GREATER 
sawine@1
    21
%token <integer> LESS 
sawine@1
    22
%token <integer> NOT 
sawine@1
    23
%token <integer> AND 
sawine@1
    24
%token <integer> OR 
sawine@1
    25
%token <integer> AT
sawine@1
    26
%token <integer> COPX
sawine@1
    27
%token <integer> ADEP
sawine@1
    28
%token <integer> ADES
sawine@1
    29
%token <integer> RWY
sawine@1
    30
%token <integer> ROUTE
sawine@1
    31
%token <integer> ATYP
sawine@1
    32
%token <integer> FLVL
sawine@1
    33
%token <integer> TAS
sawine@1
    34
%token <integer> FRUL
sawine@1
    35
%token <integer> FTYP
sawine@1
    36
%token <integer> EQUIP
sawine@1
    37
%token <integer> RFL
sawine@1
    38
%token <integer> TRAVEL_TYPE
sawine@1
    39
%token <integer> TIMESEP 
sawine@1
    40
%token <integer> FL
sawine@1
    41
sawine@1
    42
%type <string> string
sawine@1
    43
%type <string> pttrn
sawine@1
    44
%type <string> flowp
sawine@1
    45
%type <string> constrnt
sawine@1
    46
%type <integer> int
sawine@1
    47
%type <integer> string_array
sawine@1
    48
%type <integer> int_array
sawine@1
    49
%type <integer> int_pt
sawine@1
    50
%type <integer> char_pt
sawine@1
    51
%type <integer> string_pt
sawine@1
    52
%type <integer> string_array_pt
sawine@1
    53
%type <integer> char_array_pt
sawine@1
    54
%type <integer> int_op
sawine@1
    55
%type <integer> string_op
sawine@1
    56
%type <integer> string_array_op
sawine@1
    57
%type <integer> string_string_array_op
sawine@1
    58
%type <integer> si_unit
sawine@1
    59
sawine@1
    60
%left OR
sawine@1
    61
%left AND
sawine@1
    62
%right NOT
sawine@1
    63
sawine@1
    64
%%
sawine@1
    65
prog:			| prog rule {  }
sawine@1
    66
				| error ')' { yyerrok; yyclearin;}				
sawine@1
    67
;
sawine@1
    68
sawine@1
    69
rule:			pttrn 		{ if (!pattern($1)) printf("Error: %s\n", last_error()); }
sawine@1
    70
				| constrnt 	{ if (!constraint($1)) printf("Error: %s\n", last_error()); }
sawine@1
    71
				| flowp 	{ if (!flowpoint($1)) printf("Error: %s\n", last_error()); }
sawine@1
    72
				| COM		{ comment(); }
sawine@1
    73
;
sawine@1
    74
sawine@1
    75
flowp:			FLOWP STRING '(' flowp_entry ')'	{ $$ = $2; }
sawine@1
    76
;
sawine@1
    77
sawine@1
    78
flowp_entry:	pttrn_lbl ':' constrnt_lbl					
sawine@1
    79
;
sawine@1
    80
sawine@1
    81
pttrn_lbl:		STRING						{ if (!pattern_id($1)) printf("Error: %s\n", last_error()); }						
sawine@1
    82
;
sawine@1
    83
sawine@1
    84
constrnt_lbl:	STRING	{ if (!constraint_id($1)) printf("Error: %s\n", last_error()); }
sawine@1
    85
;
sawine@1
    86
sawine@1
    87
constrnt:		CONSTRNT STRING '(' cterm ')' 	{ $$ = $2; }
sawine@1
    88
;
sawine@1
    89
sawine@1
    90
cterm:			TIMESEP AT string IS INTEGER si_unit		
sawine@1
    91
				{ intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); }				
sawine@1
    92
				| TIMESEP AT string_array IS INTEGER si_unit
sawine@1
    93
				{ intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); }		
sawine@1
    94
				| TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER	
sawine@1
    95
				{ intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); }				
sawine@1
    96
				| TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER
sawine@1
    97
				{ intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); }		
sawine@1
    98
				
sawine@1
    99
				| TIMESEP AT string IS INTEGER si_unit AT FL int_array
sawine@1
   100
				{ intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); }				
sawine@1
   101
				| TIMESEP AT string_array IS INTEGER si_unit AT FL int_array
sawine@1
   102
				{ intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); }		
sawine@1
   103
				| TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array	
sawine@1
   104
				{ intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); }				
sawine@1
   105
				| TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array
sawine@1
   106
				{ intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); }	
sawine@1
   107
									
sawine@1
   108
				| cterm AND cterm							
sawine@1
   109
				{ and_term(); }
sawine@1
   110
;
sawine@1
   111
sawine@1
   112
si_unit:		STRING	
sawine@1
   113
				{ 
sawine@1
   114
					if (!strcmp($1, "s")) { $$ = 1; }
sawine@1
   115
					else if (!strcmp($1, "min")) { $$ = 60; }
sawine@1
   116
				}
sawine@1
   117
;
sawine@1
   118
sawine@1
   119
pttrn: 			PATTERN STRING '(' term ')'	{ $$ = $2; }
sawine@1
   120
				| PATTERN '(' term ')'		{ $$ = get_pattern_id(); }
sawine@1
   121
;
sawine@1
   122
sawine@1
   123
term:			int_pt int_op INTEGER	
sawine@1
   124
				{ intpt_int_term($2, $1, $3); }	
sawine@1
   125
					
sawine@1
   126
				| char_pt string_op string
sawine@1
   127
				{ charpt_char_term($2, $1, $3); }
sawine@1
   128
						
sawine@1
   129
				| string_pt string_op string
sawine@1
   130
				{ stringpt_string_term($2, $1, $3); }
sawine@1
   131
				
sawine@1
   132
				| string_array_pt string_array_op string_array
sawine@1
   133
				{ stringarraypt_stringarray_term($2, $1, $3); }	
sawine@1
   134
							
sawine@1
   135
				| string_array string_array_op string_array_pt
sawine@1
   136
				{ 
sawine@1
   137
					if ($2 == OT_IN_C)
sawine@1
   138
					{
sawine@1
   139
						$2 = OT_IN_P;
sawine@1
   140
					}
sawine@1
   141
					else if ($2 == OT_NOTIN_C)
sawine@1
   142
					{
sawine@1
   143
						$2 = OT_NOTIN_P;
sawine@1
   144
					}
sawine@1
   145
					stringarraypt_stringarray_term($2, $3, $1); 
sawine@1
   146
				}			
sawine@1
   147
					
sawine@1
   148
				| string string_string_array_op string_array_pt
sawine@1
   149
				{ 
sawine@1
   150
					if ($2 == OT_IN_C)
sawine@1
   151
					{
sawine@1
   152
						$2 = OT_IN_P;
sawine@1
   153
					}
sawine@1
   154
					else if ($2 == OT_NOTIN_C)
sawine@1
   155
					{
sawine@1
   156
						$2 = OT_NOTIN_P;
sawine@1
   157
					} 
sawine@1
   158
					stringarraypt_string_term($2, $3, $1); 
sawine@1
   159
				}		
sawine@1
   160
				
sawine@1
   161
				| string string_string_array_op char_array_pt
sawine@1
   162
				{ 
sawine@1
   163
					if ($2 == OT_IN_C)
sawine@1
   164
					{
sawine@1
   165
						$2 = OT_IN_P;
sawine@1
   166
					}
sawine@1
   167
					else if ($2 == OT_NOTIN_C)
sawine@1
   168
					{
sawine@1
   169
						$2 = OT_NOTIN_P;
sawine@1
   170
					} 
sawine@1
   171
					chararraypt_char_term($2, $3, $1); 
sawine@1
   172
				}	
sawine@1
   173
							
sawine@1
   174
				| term OR term 		
sawine@1
   175
				{ or_term(); }
sawine@1
   176
				
sawine@1
   177
				| term AND term
sawine@1
   178
				{ and_term(); } 	
sawine@1
   179
				
sawine@1
   180
				| NOT term						
sawine@1
   181
				| '(' term ')'				
sawine@1
   182
;
sawine@1
   183
sawine@1
   184
int_op:			IS 				{ $$ = OT_IS; }	
sawine@1
   185
				| IS NOT		{ $$ = OT_ISNOT; } 
sawine@1
   186
				| GREATER THAN	{ $$ = OT_GREATER; }
sawine@1
   187
				| LESS THAN		{ $$ = OT_LESS; }
sawine@1
   188
;
sawine@1
   189
sawine@1
   190
string_op:		IS			{ $$ = OT_IS; }	
sawine@1
   191
				| IS NOT	{ $$ = OT_ISNOT; } 
sawine@1
   192
;
sawine@1
   193
sawine@1
   194
string_array_op:IS			{ $$ = OT_IS; }
sawine@1
   195
				| IS NOT 	{ $$ = OT_ISNOT; } 
sawine@1
   196
				| IN 		{ $$ = OT_IN_P; }
sawine@1
   197
				| NOT IN	{ $$ = OT_NOTIN_P; }
sawine@1
   198
;
sawine@1
   199
sawine@1
   200
string_string_array_op: IN 			{ $$ = OT_IN_P; }
sawine@1
   201
						| NOT IN	{ $$ = OT_NOTIN_P; }
sawine@1
   202
;
sawine@1
   203
sawine@1
   204
int_array:		'[' ints ']' { $$ = integer_array(); }
sawine@1
   205
;
sawine@1
   206
sawine@1
   207
ints:			| ints ',' int
sawine@1
   208
				| ints int
sawine@1
   209
;
sawine@1
   210
sawine@1
   211
int:		INTEGER { integer($1); $$ = $1; }
sawine@1
   212
; 
sawine@1
   213
sawine@1
   214
string_array:	'[' strings ']'	{ $$ = string_array(); }
sawine@1
   215
;
sawine@1
   216
sawine@1
   217
strings:		| strings ',' string
sawine@1
   218
				| strings string
sawine@1
   219
;
sawine@1
   220
sawine@1
   221
int_pt:			TAS		{ $$ = PT_TAS; }			
sawine@1
   222
;
sawine@1
   223
sawine@1
   224
char_pt:		FTYP		{ $$ = PT_FTYP; }
sawine@1
   225
sawine@1
   226
string_pt:		ADEP	{ $$ = PT_ADEP; }
sawine@1
   227
				| ADES	{ $$ = PT_ADES; }
sawine@1
   228
				| RWY 	{ $$ = PT_RWY; }
sawine@1
   229
				| ATYP 	{ $$ = PT_ATYP; }
sawine@1
   230
				| COPX	{ $$ = PT_COPX; }				
sawine@1
   231
				| FRUL 	{ $$ = PT_FRUL; }				
sawine@1
   232
				| RFL	{ $$ = PT_RFL; }
sawine@1
   233
				| TRAVEL_TYPE { $$ = PT_TRAVEL_TYPE; }
sawine@1
   234
;
sawine@1
   235
sawine@1
   236
string_array_pt:ROUTE	{ $$ = PT_ROUTE; }				
sawine@1
   237
;
sawine@1
   238
sawine@1
   239
char_array_pt:	EQUIP	{ $$ = PT_EQUIP; }
sawine@1
   240
;
sawine@1
   241
sawine@1
   242
string:			QUOTE STRING QUOTE	{ string($2); $$ = $2; }
sawine@1
   243
;