Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.49 KB | None | 0 0
  1. %code requires{
  2. typedef enum { TCHA, TLEITE, TCAFE, TPINGO, TCOPO, TCHOCOLATE} TIPOP;
  3. }
  4.  
  5. %code {
  6. #include <stdio.h>
  7. #include "lex.yy.h"
  8.  
  9. int numErros = 0;
  10. void yyerror(char *s);
  11.  
  12. void dar_troco(float troco);
  13. char *nomes[] = { "Cha", "Leite", "Cafe", "Pingo", "Copo", "Chocolate" };
  14. int tproduto;
  15. }
  16.  
  17. %union{
  18. float real;
  19. TIPOP drink;
  20. }
  21.  
  22. %token EURO
  23. %token <drink> CHA LEITE CAFE PINGO COPO CHOCOLATE
  24. %token <real> MOEDA
  25. %type <real> dinheiro
  26. %type <real> produto
  27.  
  28. %start pedido
  29.  
  30. %%
  31.  
  32. pedido: produto','dinheiro '\n'
  33. {
  34. if($1 <= $3) dar_troco($3-$1);
  35. else printf("Dinheiro insuficiente! \n");
  36. }
  37.  
  38. produto: CAFE { tproduto = 2; $$ = 0.35; }
  39. | PINGO { tproduto = 3; $$ = 0.35; }
  40. | CHA { tproduto = 0; $$ = 0.35; }
  41. | CHOCOLATE { tproduto = 5; $$ = 0.40; }
  42. | COPO { tproduto = 4; $$ = 0.05; }
  43. | LEITE { tproduto = 1; $$ = 0.30; }
  44.  
  45. dinheiro: EURO MOEDA { $$ = $2; }
  46. | EURO MOEDA','dinheiro { $$ = $2 + $4; }
  47.  
  48. %%
  49.  
  50. int main()
  51. {
  52. yyparse();
  53. return 0;
  54. }
  55.  
  56. void yyerror(char *s)
  57. {
  58. numErros++;
  59. printf(" - Erro semântico: %s\n", s);
  60. }
  61.  
  62. void dar_troco(float troco)
  63. {
  64. float moedas[] = { 2.00, 1.00, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
  65. int curr = 0;
  66. printf("%s", nomes[tproduto]);
  67. while((troco > 0.0) && (curr <= 7))
  68. {
  69. while(troco + 0.00001 >= moedas[curr]) // YES FLOATING POINT!!!!
  70. {
  71. troco -= moedas[curr];
  72. printf(",€%2.2f", moedas[curr]);
  73. };
  74. ++curr;
  75. }
  76.  
  77. printf("\n");
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement