sawine@1: %{ sawine@1: #include sawine@1: #include sawine@1: #include sawine@1: #include "semantic_helper.hh" sawine@1: sawine@1: #define MAX_ID_TABLE_NO 1024 sawine@1: char* id_table[MAX_ID_TABLE_NO]; sawine@1: int id_table_no; sawine@1: ErrorType* errors; sawine@1: int maxErrorNo; sawine@1: int errorNo; sawine@1: int yylex(); sawine@1: int yywrap(); sawine@1: int yyerror(const char *str); sawine@1: void yyrestart(FILE* file); sawine@1: %} 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: %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 GATE sawine@1: %token INTERNAL sawine@1: %token GLOBAL 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 DEPTIME sawine@1: %token ARRTIME sawine@1: %token GATETIME sawine@1: %token FL 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 time_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: prog: | prog rule { } sawine@1: | error ')' { yyerrok; yyclearin;} sawine@1: ; sawine@1: rule: pttrn { if (!pattern($1)) sawine@1: printf("Error: %s\n", last_error()); } sawine@1: | constrnt { if (!constraint($1)) sawine@1: printf("Error: %s\n", last_error()); } sawine@1: | flowp { if (!flowpoint($1)) sawine@1: printf("Error: %s\n", last_error()); } sawine@1: | COM { comment(); } sawine@1: ; sawine@1: flowp: FLOWP STRING '(' flowp_entry ')' { $$ = $2; } sawine@1: ; sawine@1: flowp_entry: pttrn_lbl ':' constrnt_lbl sawine@1: ; sawine@1: pttrn_lbl: STRING { if (!pattern_id($1)) sawine@1: printf("Error: %s\n", last_error()); } sawine@1: ; sawine@1: constrnt_lbl: STRING { if (!constraint_id($1)) sawine@1: printf("Error: %s\n", last_error()); } sawine@1: ; sawine@1: constrnt: CONSTRNT STRING '(' cterm ')' { $$ = $2; } sawine@1: ; sawine@1: cterm: TIMESEP AT string IS INTEGER si_unit sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: 0, 0, 0); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: 0, 0, 0); } sawine@1: | TIMESEP AT string IS INTEGER si_unit sawine@1: FROM INTEGER UNTIL INTEGER sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, sawine@1: $10, 0); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit sawine@1: FROM INTEGER UNTIL INTEGER sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: $8, $10, 0); } sawine@1: | TIMESEP AT string IS INTEGER si_unit AT FL int_array sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: 0, 0, $9); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit sawine@1: AT FL int_array sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: 0, 0, $9); } sawine@1: | TIMESEP AT string IS INTEGER si_unit sawine@1: FROM INTEGER UNTIL INTEGER AT FL int_array sawine@1: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, sawine@1: $10, $13); } sawine@1: | TIMESEP AT string_array IS INTEGER si_unit sawine@1: FROM INTEGER UNTIL INTEGER AT FL int_array sawine@1: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, sawine@1: $8, $10, $13); } sawine@1: | cterm AND cterm { and_term(); } sawine@1: ; sawine@1: si_unit: STRING { if (!strcmp($1, "s")) { $$ = 1; } sawine@1: else if (!strcmp($1, "min")) { $$ = 60; } } sawine@1: ; sawine@1: pttrn: PATTERN STRING '(' term ')' { $$ = $2; } sawine@1: | PATTERN '(' term ')' { $$ = get_pattern_id(); } sawine@1: ; sawine@1: term: int_pt int_op INTEGER sawine@1: { intpt_int_term($2, $1, $3); } sawine@1: | time_pt int_op INTEGER sawine@1: { time_pt_int_term($2, $1, $3); } sawine@1: | char_pt string_op string sawine@1: { charpt_char_term($2, $1, $3); } sawine@1: | string_pt string_op string sawine@1: { stringpt_string_term($2, $1, $3); } sawine@1: | string_array_pt string_array_op string_array sawine@1: { stringarraypt_stringarray_term($2, $1, $3); } sawine@1: | string_array string_array_op string_array_pt sawine@1: { if ($2 == OT_IN_C) { $2 = OT_IN_P; } sawine@1: else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; } sawine@1: stringarraypt_stringarray_term($2, $3, $1); } sawine@1: | string string_string_array_op string_array_pt sawine@1: { if ($2 == OT_IN_C) { $2 = OT_IN_P; } sawine@1: else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; } sawine@1: stringarraypt_string_term($2, $3, $1); } sawine@1: | string string_string_array_op char_array_pt sawine@1: { if ($2 == OT_IN_C) { $2 = OT_IN_P; } sawine@1: else if ($2 == OT_NOTIN_C) { $2 = OT_NOTIN_P; } sawine@1: chararraypt_char_term($2, $3, $1); } sawine@1: | term OR term { or_term(); } sawine@1: | term AND term { and_term(); } sawine@1: | NOT term sawine@1: | '(' term ')' 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: string_op: IS { $$ = OT_IS; } sawine@1: | IS NOT { $$ = OT_ISNOT; } 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: string_string_array_op: IN { $$ = OT_IN_P; } sawine@1: | NOT IN { $$ = OT_NOTIN_P; } sawine@1: ; sawine@1: int_array: '[' ints ']' { $$ = integer_array(); } sawine@1: ; sawine@1: ints: | ints ',' int sawine@1: | ints int sawine@1: ; sawine@1: int: INTEGER { integer($1); $$ = $1; } sawine@1: ; sawine@1: string_array: '[' strings ']' { $$ = string_array(); } sawine@1: ; sawine@1: strings: | strings ',' string sawine@1: | strings string sawine@1: ; sawine@1: int_pt: TAS { $$ = PT_TAS; } sawine@1: | INTERNAL { $$ = PT_INTERNAL; } sawine@1: | GLOBAL { $$ = PT_GLOBAL; } sawine@1: ; sawine@1: time_pt: DEPTIME { $$ = PT_DEPTIME; } sawine@1: | ARRTIME { $$ = PT_ARRTIME; } sawine@1: | GATETIME { $$ = PT_GATETIME; } 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: | GATE { $$ = PT_GATE; } sawine@1: | FRUL { $$ = PT_FRUL; } sawine@1: | RFL { $$ = PT_RFL; } sawine@1: | TRAVEL_TYPE { $$ = PT_TRAVEL_TYPE; } sawine@1: ; sawine@1: string_array_pt: ROUTE { $$ = PT_ROUTE; } sawine@1: ; sawine@1: char_array_pt: EQUIP { $$ = PT_EQUIP; } sawine@1: ; sawine@1: string: QUOTE STRING QUOTE { string($2); $$ = $2; } sawine@1: ; sawine@1: %% sawine@1: #include "atccl_parser.c" sawine@1: void clear_id_table() sawine@1: { sawine@1: int i; sawine@1: for (i = 0; i < id_table_no; ++i) sawine@1: { sawine@1: free(id_table[i]); sawine@1: id_table[i] = 0; sawine@1: } sawine@1: id_table_no = 0; sawine@1: } sawine@1: int yywrap() sawine@1: { sawine@1: clear_id_table(); sawine@1: return 1; sawine@1: } sawine@1: int semantic_error(const char* str) sawine@1: { sawine@1: if (errorNo < maxErrorNo) sawine@1: { sawine@1: errors[errorNo].line = -1; sawine@1: strcpy(errors[errorNo].text, ""); sawine@1: strcpy(errors[errorNo].error, str); sawine@1: errorNo++; sawine@1: } sawine@1: return 1; sawine@1: } sawine@1: int yyerror(const char *str) sawine@1: { sawine@1: if (errorNo < maxErrorNo) sawine@1: { sawine@1: errors[errorNo].line = line_no; sawine@1: strcpy(errors[errorNo].text, yytext); sawine@1: strcpy(errors[errorNo].error, str); sawine@1: errorNo++; sawine@1: } sawine@1: return 1; sawine@1: } sawine@1: int parse_syntax(FILE* file, ErrorType* errors_, sawine@1: int maxErrorNo_, int passes) sawine@1: { sawine@1: line_no = 1; sawine@1: errors = errors_; sawine@1: maxErrorNo = maxErrorNo_; sawine@1: errorNo = 0; sawine@1: clear_all(); sawine@1: clear_id_table(); sawine@1: yyrestart(file); sawine@1: yyparse(); sawine@1: sawine@1: if (passes > 1) sawine@1: { sawine@1: if (!complete_semantics()) sawine@1: { sawine@1: semantic_error(last_error()); sawine@1: } sawine@1: } sawine@1: return errorNo; sawine@1: }