sawine@1: %token sawine@1: CONSTRNT PATTERN FLOWP COM sawine@1: QUOTE THAN FROM UNTIL ON sawine@1: sawine@1: %union sawine@1: { sawine@1: int integer; sawine@1: double real; sawine@1: const char* string; sawine@1: } sawine@1: sawine@1: %token INTEGER sawine@1: %token TIME sawine@1: %token REAL sawine@1: %token STRING sawine@1: sawine@1: sawine@1: %token IS sawine@1: %token IN sawine@1: %token GREATER sawine@1: %token LESS sawine@1: %token NOT sawine@1: %token AND sawine@1: %token OR sawine@1: %token AT sawine@1: %token COPX sawine@1: %token ADEP sawine@1: %token ADES sawine@1: %token RWY sawine@1: %token ROUTE sawine@1: %token ATYP sawine@1: %token FLVL sawine@1: %token TAS sawine@1: %token FRUL sawine@1: %token FTYP sawine@1: %token EQUIP sawine@1: %token RFL sawine@1: %token TRAVEL_TYPE sawine@1: %token TIMESEP sawine@1: %token FL sawine@1: sawine@1: %type string sawine@1: %type pttrn sawine@1: %type flowp sawine@1: %type constrnt sawine@1: %type int sawine@1: %type string_array sawine@1: %type int_array sawine@1: %type int_pt sawine@1: %type char_pt sawine@1: %type string_pt sawine@1: %type string_array_pt sawine@1: %type char_array_pt sawine@1: %type int_op sawine@1: %type string_op sawine@1: %type string_array_op sawine@1: %type string_string_array_op sawine@1: %type si_unit sawine@1: sawine@1: %left OR sawine@1: %left AND sawine@1: %right NOT sawine@1: sawine@1: %% sawine@1: prog: | prog rule { } sawine@1: | error ')' { yyerrok; yyclearin;} sawine@1: ; sawine@1: sawine@1: rule: pttrn { if (!pattern($1)) printf("Error: %s\n", last_error()); } sawine@1: | constrnt { if (!constraint($1)) printf("Error: %s\n", last_error()); } sawine@1: | flowp { if (!flowpoint($1)) printf("Error: %s\n", last_error()); } sawine@1: | COM { comment(); } sawine@1: ; sawine@1: sawine@1: flowp: FLOWP STRING '(' flowp_entry ')' { $$ = $2; } sawine@1: ; sawine@1: sawine@1: flowp_entry: pttrn_lbl ':' constrnt_lbl sawine@1: ; sawine@1: sawine@1: pttrn_lbl: STRING { if (!pattern_id($1)) printf("Error: %s\n", last_error()); } sawine@1: ; sawine@1: sawine@1: constrnt_lbl: STRING { if (!constraint_id($1)) printf("Error: %s\n", last_error()); } sawine@1: ; sawine@1: sawine@1: constrnt: CONSTRNT STRING '(' cterm ')' { $$ = $2; } sawine@1: ; sawine@1: sawine@1: cterm: TIMESEP AT string IS INTEGER si_unit sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); } sawine@1: | TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); } sawine@1: sawine@1: | TIMESEP AT string IS INTEGER si_unit AT FL int_array sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit AT FL int_array sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); } sawine@1: | TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); } sawine@1: sawine@1: | cterm AND cterm sawine@1: { and_term(); } sawine@1: ; sawine@1: sawine@1: si_unit: STRING sawine@1: { sawine@1: if (!strcmp($1, "s")) { $$ = 1; } sawine@1: else if (!strcmp($1, "min")) { $$ = 60; } sawine@1: } sawine@1: ; sawine@1: sawine@1: pttrn: PATTERN STRING '(' term ')' { $$ = $2; } sawine@1: | PATTERN '(' term ')' { $$ = get_pattern_id(); } sawine@1: ; sawine@1: sawine@1: term: int_pt int_op INTEGER sawine@1: { intpt_int_term($2, $1, $3); } sawine@1: sawine@1: | char_pt string_op string sawine@1: { charpt_char_term($2, $1, $3); } sawine@1: sawine@1: | string_pt string_op string sawine@1: { stringpt_string_term($2, $1, $3); } sawine@1: sawine@1: | string_array_pt string_array_op string_array sawine@1: { stringarraypt_stringarray_term($2, $1, $3); } sawine@1: sawine@1: | string_array string_array_op string_array_pt sawine@1: { sawine@1: if ($2 == OT_IN_C) sawine@1: { sawine@1: $2 = OT_IN_P; sawine@1: } sawine@1: else if ($2 == OT_NOTIN_C) sawine@1: { sawine@1: $2 = OT_NOTIN_P; sawine@1: } sawine@1: stringarraypt_stringarray_term($2, $3, $1); sawine@1: } sawine@1: sawine@1: | string string_string_array_op string_array_pt sawine@1: { sawine@1: if ($2 == OT_IN_C) sawine@1: { sawine@1: $2 = OT_IN_P; sawine@1: } sawine@1: else if ($2 == OT_NOTIN_C) sawine@1: { sawine@1: $2 = OT_NOTIN_P; sawine@1: } sawine@1: stringarraypt_string_term($2, $3, $1); sawine@1: } sawine@1: sawine@1: | string string_string_array_op char_array_pt sawine@1: { sawine@1: if ($2 == OT_IN_C) sawine@1: { sawine@1: $2 = OT_IN_P; sawine@1: } sawine@1: else if ($2 == OT_NOTIN_C) sawine@1: { sawine@1: $2 = OT_NOTIN_P; sawine@1: } sawine@1: chararraypt_char_term($2, $3, $1); sawine@1: } sawine@1: sawine@1: | term OR term sawine@1: { or_term(); } sawine@1: sawine@1: | term AND term sawine@1: { and_term(); } sawine@1: sawine@1: | NOT term sawine@1: | '(' term ')' sawine@1: ; sawine@1: sawine@1: int_op: IS { $$ = OT_IS; } sawine@1: | IS NOT { $$ = OT_ISNOT; } sawine@1: | GREATER THAN { $$ = OT_GREATER; } sawine@1: | LESS THAN { $$ = OT_LESS; } sawine@1: ; sawine@1: sawine@1: string_op: IS { $$ = OT_IS; } sawine@1: | IS NOT { $$ = OT_ISNOT; } sawine@1: ; sawine@1: sawine@1: string_array_op:IS { $$ = OT_IS; } sawine@1: | IS NOT { $$ = OT_ISNOT; } sawine@1: | IN { $$ = OT_IN_P; } sawine@1: | NOT IN { $$ = OT_NOTIN_P; } sawine@1: ; sawine@1: sawine@1: string_string_array_op: IN { $$ = OT_IN_P; } sawine@1: | NOT IN { $$ = OT_NOTIN_P; } sawine@1: ; sawine@1: sawine@1: int_array: '[' ints ']' { $$ = integer_array(); } sawine@1: ; sawine@1: sawine@1: ints: | ints ',' int sawine@1: | ints int sawine@1: ; sawine@1: sawine@1: int: INTEGER { integer($1); $$ = $1; } sawine@1: ; sawine@1: sawine@1: string_array: '[' strings ']' { $$ = string_array(); } sawine@1: ; sawine@1: sawine@1: strings: | strings ',' string sawine@1: | strings string sawine@1: ; sawine@1: sawine@1: int_pt: TAS { $$ = PT_TAS; } sawine@1: ; sawine@1: sawine@1: char_pt: FTYP { $$ = PT_FTYP; } sawine@1: sawine@1: string_pt: ADEP { $$ = PT_ADEP; } sawine@1: | ADES { $$ = PT_ADES; } sawine@1: | RWY { $$ = PT_RWY; } sawine@1: | ATYP { $$ = PT_ATYP; } sawine@1: | COPX { $$ = PT_COPX; } sawine@1: | FRUL { $$ = PT_FRUL; } sawine@1: | RFL { $$ = PT_RFL; } sawine@1: | TRAVEL_TYPE { $$ = PT_TRAVEL_TYPE; } sawine@1: ; sawine@1: sawine@1: string_array_pt:ROUTE { $$ = PT_ROUTE; } sawine@1: ; sawine@1: sawine@1: char_array_pt: EQUIP { $$ = PT_EQUIP; } sawine@1: ; sawine@1: sawine@1: string: QUOTE STRING QUOTE { string($2); $$ = $2; } sawine@1: ;