Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %code requires{
- typedef enum { TCHA, TLEITE, TCAFE, TPINGO, TCOPO, TCHOCOLATE} TIPOP;
- }
- %code {
- #include <stdio.h>
- #include "lex.yy.h"
- int numErros = 0;
- void yyerror(char *s);
- void dar_troco(float troco);
- char *nomes[] = { "Cha", "Leite", "Cafe", "Pingo", "Copo", "Chocolate" };
- int tproduto;
- }
- %union{
- float real;
- TIPOP drink;
- }
- %token EURO
- %token <drink> CHA LEITE CAFE PINGO COPO CHOCOLATE
- %token <real> MOEDA
- %type <real> dinheiro
- %type <real> produto
- %start pedido
- %%
- pedido: produto','dinheiro '\n'
- {
- if($1 <= $3) dar_troco($3-$1);
- else printf("Dinheiro insuficiente! \n");
- }
- produto: CAFE { tproduto = 2; $$ = 0.35; }
- | PINGO { tproduto = 3; $$ = 0.35; }
- | CHA { tproduto = 0; $$ = 0.35; }
- | CHOCOLATE { tproduto = 5; $$ = 0.40; }
- | COPO { tproduto = 4; $$ = 0.05; }
- | LEITE { tproduto = 1; $$ = 0.30; }
- dinheiro: EURO MOEDA { $$ = $2; }
- | EURO MOEDA','dinheiro { $$ = $2 + $4; }
- %%
- int main()
- {
- yyparse();
- return 0;
- }
- void yyerror(char *s)
- {
- numErros++;
- printf(" - Erro semântico: %s\n", s);
- }
- void dar_troco(float troco)
- {
- float moedas[] = { 2.00, 1.00, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
- int curr = 0;
- printf("%s", nomes[tproduto]);
- while((troco > 0.0) && (curr <= 7))
- {
- while(troco + 0.00001 >= moedas[curr]) // YES FLOATING POINT!!!!
- {
- troco -= moedas[curr];
- printf(",€%2.2f", moedas[curr]);
- };
- ++curr;
- }
- printf("\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement