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