Advertisement
nex036ara

sw_case_generate

Dec 22nd, 2012
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.70 KB | None | 0 0
  1. //globalne promenljive:
  2.   int case_count = 0;
  3.   int case_array[100];
  4.   int switch_id = -1;
  5.  
  6. //novi tokeni
  7. %token _SWITCH
  8. %token _CASE
  9. %token _BREAK
  10. %token _DEFAULT
  11. %token _COLON
  12.  
  13. //tipovi pojmova
  14. %type <i> default_statement
  15.  
  16. //gramatika:
  17.  
  18. switch_statement    
  19.     : _SWITCH _LPAREN _ID
  20.         {
  21.           if( (switch_id = lookup_id($3, LOCAL_VAR)) == -1)
  22.               printerror("'%s' undeclared", $3);
  23.           lab_num = ++false_lab_num;
  24.           gen_num_lab("switch", lab_num);
  25.           code("\n\t\t\tJMP \t@test%d", lab_num);
  26.         }
  27.       _RPAREN  _LBRACKET case_statements default_statement _RBRACKET
  28.         {
  29.           code("\n\t\t\tJMP \t@exit%d", lab_num);
  30.           gen_num_lab("test", lab_num);
  31.           int i;
  32.           for(i = 0; i < case_count; i++) {
  33.             gen_cmp(switch_id, case_array[i]);
  34.             case_array[i] = -1; //ponisti sadrzaj
  35.             code("\n\t\t\tJEQ \t");
  36.             code("@case%d_%d", lab_num, i);
  37.           }
  38.          
  39.           if($8)
  40.             code("\n\t\t\tJMP \t@default%d", lab_num);
  41.           gen_num_lab("exit", lab_num);
  42.           case_count = 0;
  43.         }
  44.     ;
  45.  
  46. case_statements
  47.   : case_statement
  48.   | case_statements case_statement
  49.   ;
  50.  
  51. case_statement
  52.   : _CASE constant _COLON
  53.       {
  54.         code("\n@case%d_%d:", lab_num, case_count);
  55.         case_array[case_count] = $2;
  56.         case_count++;
  57.       }
  58.      statement break_statement
  59.   ;
  60.  
  61. break_statement    
  62.   :
  63.   | _BREAK _SEMICOLON
  64.       { code("\n\t\t\tJMP \t@exit%d", lab_num); }
  65.   ;
  66.  
  67. default_statement    
  68.   :
  69.       { $$ = 0; }
  70.  
  71.   | _DEFAULT _COLON
  72.       { gen_num_lab("default", lab_num); }
  73.     statement
  74.       { $$ = 1; }
  75.   ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement