Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //globalne promenljive:
- int case_count = 0;
- int case_array[100];
- int switch_id = -1;
- //novi tokeni
- %token _SWITCH
- %token _CASE
- %token _BREAK
- %token _DEFAULT
- %token _COLON
- //tipovi pojmova
- %type <i> default_statement
- //gramatika:
- switch_statement
- : _SWITCH _LPAREN _ID
- {
- if( (switch_id = lookup_id($3, LOCAL_VAR)) == -1)
- printerror("'%s' undeclared", $3);
- lab_num = ++false_lab_num;
- gen_num_lab("switch", lab_num);
- code("\n\t\t\tJMP \t@test%d", lab_num);
- }
- _RPAREN _LBRACKET case_statements default_statement _RBRACKET
- {
- code("\n\t\t\tJMP \t@exit%d", lab_num);
- gen_num_lab("test", lab_num);
- int i;
- for(i = 0; i < case_count; i++) {
- gen_cmp(switch_id, case_array[i]);
- case_array[i] = -1; //ponisti sadrzaj
- code("\n\t\t\tJEQ \t");
- code("@case%d_%d", lab_num, i);
- }
- if($8)
- code("\n\t\t\tJMP \t@default%d", lab_num);
- gen_num_lab("exit", lab_num);
- case_count = 0;
- }
- ;
- case_statements
- : case_statement
- | case_statements case_statement
- ;
- case_statement
- : _CASE constant _COLON
- {
- code("\n@case%d_%d:", lab_num, case_count);
- case_array[case_count] = $2;
- case_count++;
- }
- statement break_statement
- ;
- break_statement
- :
- | _BREAK _SEMICOLON
- { code("\n\t\t\tJMP \t@exit%d", lab_num); }
- ;
- default_statement
- :
- { $$ = 0; }
- | _DEFAULT _COLON
- { gen_num_lab("default", lab_num); }
- statement
- { $$ = 1; }
- ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement