sawine@0: %{ sawine@0: #include sawine@0: #include sawine@0: #include sawine@0: #include "semantic_helper.hh" sawine@0: sawine@0: #define MAX_ID_TABLE_NO 1024 sawine@0: char* id_table[MAX_ID_TABLE_NO]; sawine@0: int id_table_no; sawine@0: sawine@0: ErrorType* errors; sawine@0: int maxErrorNo; sawine@0: int errorNo; sawine@0: sawine@0: int yylex(); sawine@0: int yywrap(); sawine@0: int yyerror(const char *str); sawine@0: void yyrestart(FILE* file); sawine@0: sawine@0: %} sawine@0: sawine@0: %token sawine@0: CONSTRNT PATTERN FLOWP COM sawine@0: QUOTE THAN FROM UNTIL ON sawine@0: sawine@0: %union sawine@0: { sawine@0: int integer; sawine@0: double real; sawine@0: const char* string; sawine@0: } sawine@0: sawine@0: %token INTEGER sawine@0: %token TIME sawine@0: %token REAL sawine@0: %token STRING sawine@0: sawine@0: sawine@0: %token IS sawine@0: %token IN sawine@0: %token GREATER sawine@0: %token LESS sawine@0: %token NOT sawine@0: %token AND sawine@0: %token OR sawine@0: %token AT sawine@0: %token COPX sawine@0: %token ADEP sawine@0: %token ADES sawine@0: %token RWY sawine@0: %token ROUTE sawine@0: %token ATYP sawine@0: %token FLVL sawine@0: %token TAS sawine@0: %token FRUL sawine@0: %token FTYP sawine@0: %token EQUIP sawine@0: %token RFL sawine@0: %token TRAVEL_TYPE sawine@0: %token TIMESEP sawine@0: %token FL sawine@0: sawine@0: %type string sawine@0: %type pttrn sawine@0: %type flowp sawine@0: %type constrnt sawine@0: %type int sawine@0: %type string_array sawine@0: %type int_array sawine@0: %type int_pt sawine@0: %type char_pt sawine@0: %type string_pt sawine@0: %type string_array_pt sawine@0: %type char_array_pt sawine@0: %type int_op sawine@0: %type string_op sawine@0: %type string_array_op sawine@0: %type string_string_array_op sawine@0: %type si_unit sawine@0: sawine@0: %left OR sawine@0: %left AND sawine@0: %right NOT sawine@0: sawine@0: %% sawine@0: prog: | prog rule { } sawine@0: | error ')' { yyerrok; yyclearin;} sawine@0: ; sawine@0: sawine@0: rule: pttrn { if (!pattern($1)) printf("Error: %s\n", last_error()); } sawine@0: | constrnt { if (!constraint($1)) printf("Error: %s\n", last_error()); } sawine@0: | flowp { if (!flowpoint($1)) printf("Error: %s\n", last_error()); } sawine@0: | COM { comment(); } sawine@0: ; sawine@0: sawine@0: flowp: FLOWP STRING '(' flowp_entry ')' { $$ = $2; } sawine@0: ; sawine@0: sawine@0: flowp_entry: pttrn_lbl ':' constrnt_lbl sawine@0: ; sawine@0: sawine@0: pttrn_lbl: STRING { if (!pattern_id($1)) printf("Error: %s\n", last_error()); } sawine@0: ; sawine@0: sawine@0: constrnt_lbl: STRING { if (!constraint_id($1)) printf("Error: %s\n", last_error()); } sawine@0: ; sawine@0: sawine@0: constrnt: CONSTRNT STRING '(' cterm ')' { $$ = $2; } sawine@0: ; sawine@0: sawine@0: cterm: TIMESEP AT string IS INTEGER si_unit sawine@0: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); } sawine@0: | TIMESEP AT string_array IS INTEGER si_unit sawine@0: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, 0); } sawine@0: | TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER sawine@0: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); } sawine@0: | TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER sawine@0: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, 0); } sawine@0: sawine@0: | TIMESEP AT string IS INTEGER si_unit AT FL int_array sawine@0: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); } sawine@0: | TIMESEP AT string_array IS INTEGER si_unit AT FL int_array sawine@0: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, 0, 0, $9); } sawine@0: | TIMESEP AT string IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array sawine@0: { intpt_string_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); } sawine@0: | TIMESEP AT string_array IS INTEGER si_unit FROM INTEGER UNTIL INTEGER AT FL int_array sawine@0: { intpt_stringarray_int_cterm(PT_TIMESEP, $3, $5 * $6, $8, $10, $13); } sawine@0: sawine@0: | cterm AND cterm sawine@0: { and_term(); } sawine@0: ; sawine@0: sawine@0: si_unit: STRING sawine@0: { sawine@0: if (!strcmp($1, "s")) { $$ = 1; } sawine@0: else if (!strcmp($1, "min")) { $$ = 60; } sawine@0: } sawine@0: ; sawine@0: sawine@0: pttrn: PATTERN STRING '(' term ')' { $$ = $2; } sawine@0: | PATTERN '(' term ')' { $$ = get_pattern_id(); } sawine@0: ; sawine@0: sawine@0: term: int_pt int_op INTEGER sawine@0: { intpt_int_term($2, $1, $3); } sawine@0: sawine@0: | char_pt string_op string sawine@0: { charpt_char_term($2, $1, $3); } sawine@0: sawine@0: | string_pt string_op string sawine@0: { stringpt_string_term($2, $1, $3); } sawine@0: sawine@0: | string_array_pt string_array_op string_array sawine@0: { stringarraypt_stringarray_term($2, $1, $3); } sawine@0: sawine@0: | string_array string_array_op string_array_pt sawine@0: { sawine@0: if ($2 == OT_IN_C) sawine@0: { sawine@0: $2 = OT_IN_P; sawine@0: } sawine@0: else if ($2 == OT_NOTIN_C) sawine@0: { sawine@0: $2 = OT_NOTIN_P; sawine@0: } sawine@0: stringarraypt_stringarray_term($2, $3, $1); sawine@0: } sawine@0: sawine@0: | string string_string_array_op string_array_pt sawine@0: { sawine@0: if ($2 == OT_IN_C) sawine@0: { sawine@0: $2 = OT_IN_P; sawine@0: } sawine@0: else if ($2 == OT_NOTIN_C) sawine@0: { sawine@0: $2 = OT_NOTIN_P; sawine@0: } sawine@0: stringarraypt_string_term($2, $3, $1); sawine@0: } sawine@0: sawine@0: | string string_string_array_op char_array_pt sawine@0: { sawine@0: if ($2 == OT_IN_C) sawine@0: { sawine@0: $2 = OT_IN_P; sawine@0: } sawine@0: else if ($2 == OT_NOTIN_C) sawine@0: { sawine@0: $2 = OT_NOTIN_P; sawine@0: } sawine@0: chararraypt_char_term($2, $3, $1); sawine@0: } sawine@0: sawine@0: | term OR term sawine@0: { or_term(); } sawine@0: sawine@0: | term AND term sawine@0: { and_term(); } sawine@0: sawine@0: | NOT term sawine@0: | '(' term ')' sawine@0: ; sawine@0: sawine@0: int_op: IS { $$ = OT_IS; } sawine@0: | IS NOT { $$ = OT_ISNOT; } sawine@0: | GREATER THAN { $$ = OT_GREATER; } sawine@0: | LESS THAN { $$ = OT_LESS; } sawine@0: ; sawine@0: sawine@0: string_op: IS { $$ = OT_IS; } sawine@0: | IS NOT { $$ = OT_ISNOT; } sawine@0: ; sawine@0: sawine@0: string_array_op:IS { $$ = OT_IS; } sawine@0: | IS NOT { $$ = OT_ISNOT; } sawine@0: | IN { $$ = OT_IN_P; } sawine@0: | NOT IN { $$ = OT_NOTIN_P; } sawine@0: ; sawine@0: sawine@0: string_string_array_op: IN { $$ = OT_IN_P; } sawine@0: | NOT IN { $$ = OT_NOTIN_P; } sawine@0: ; sawine@0: sawine@0: int_array: '[' ints ']' { $$ = integer_array(); } sawine@0: ; sawine@0: sawine@0: ints: | ints ',' int sawine@0: | ints int sawine@0: ; sawine@0: sawine@0: int: INTEGER { integer($1); $$ = $1; } sawine@0: ; sawine@0: sawine@0: string_array: '[' strings ']' { $$ = string_array(); } sawine@0: ; sawine@0: sawine@0: strings: | strings ',' string sawine@0: | strings string sawine@0: ; sawine@0: sawine@0: int_pt: TAS { $$ = PT_TAS; } sawine@0: ; sawine@0: sawine@0: char_pt: FTYP { $$ = PT_FTYP; } sawine@0: sawine@0: string_pt: ADEP { $$ = PT_ADEP; } sawine@0: | ADES { $$ = PT_ADES; } sawine@0: | RWY { $$ = PT_RWY; } sawine@0: | ATYP { $$ = PT_ATYP; } sawine@0: | COPX { $$ = PT_COPX; } sawine@0: | FRUL { $$ = PT_FRUL; } sawine@0: | RFL { $$ = PT_RFL; } sawine@0: | TRAVEL_TYPE { $$ = PT_TRAVEL_TYPE; } sawine@0: ; sawine@0: sawine@0: string_array_pt:ROUTE { $$ = PT_ROUTE; } sawine@0: ; sawine@0: sawine@0: char_array_pt: EQUIP { $$ = PT_EQUIP; } sawine@0: ; sawine@0: sawine@0: string: QUOTE STRING QUOTE { string($2); $$ = $2; } sawine@0: ; sawine@0: %% sawine@0: sawine@0: #include "atccl_parser.c" sawine@0: sawine@0: void clear_id_table() sawine@0: { sawine@0: int i; sawine@0: for (i = 0; i < id_table_no; ++i) sawine@0: { sawine@0: free(id_table[i]); sawine@0: id_table[i] = 0; sawine@0: } sawine@0: id_table_no = 0; sawine@0: } sawine@0: sawine@0: int yywrap() sawine@0: { sawine@0: clear_id_table(); sawine@0: return 1; sawine@0: } sawine@0: sawine@0: int semantic_error(const char* str) sawine@0: { sawine@0: if (errorNo < maxErrorNo) sawine@0: { sawine@0: errors[errorNo].line = -1; sawine@0: strcpy(errors[errorNo].text, ""); sawine@0: strcpy(errors[errorNo].error, str); sawine@0: errorNo++; sawine@0: } sawine@0: return 1; sawine@0: } sawine@0: sawine@0: int yyerror(const char *str) sawine@0: { sawine@0: if (errorNo < maxErrorNo) sawine@0: { sawine@0: errors[errorNo].line = line_no; sawine@0: strcpy(errors[errorNo].text, yytext); sawine@0: strcpy(errors[errorNo].error, str); sawine@0: errorNo++; sawine@0: } sawine@0: return 1; sawine@0: } sawine@0: sawine@0: int parse_syntax(FILE* file, ErrorType* errors_, int maxErrorNo_, int passes) sawine@0: { sawine@0: line_no = 1; sawine@0: errors = errors_; sawine@0: maxErrorNo = maxErrorNo_; sawine@0: errorNo = 0; sawine@0: sawine@0: clear_all(); sawine@0: clear_id_table(); sawine@0: yyrestart(file); sawine@0: yyparse(); sawine@0: sawine@0: if (passes > 1) sawine@0: { sawine@0: if (!complete_semantics()) sawine@0: { sawine@0: semantic_error(last_error()); sawine@0: } sawine@0: } sawine@0: return errorNo; sawine@0: }