/* Affichage recursif d'un arbre representant une expression. */ void pprint(TreeP tree) { if (! Pprint ) return; if (tree == NIL(Tree)) { printf("Unknown"); return; } switch (tree->op) { case ID:case STR: case VARDECL: printf("%s", tree->u.str); break; case CST: printf("%d", tree->u.val); break; case EQ: pprintTree2(tree, " = "); break; case NE: pprintTree2(tree, " <> "); break; case GT: pprintTree2(tree, " > "); break; case GE: pprintTree2(tree, " >= "); break; case LT: pprintTree2(tree, " < "); break; case LE: pprintTree2(tree, " <= "); break; case ADD: pprintPrefixTree2(tree, " + "); break; case SUB: pprintPrefixTree2(tree, " - "); break; case MUL: pprintPrefixTree2(tree, " * "); break; case DIV: pprintPrefixTree2(tree, " / "); break; case AND: pprintPrefixTree2(tree, " and "); break; case OR: pprintPrefixTree2(tree, " or "); break; case BINAND:pprintPrefixTree2(tree, " binand "); break; case BINOR: pprintPrefixTree2(tree, " binor "); break; case BINXOR:pprintPrefixTree2(tree, " xor "); break; case AFF: pprintAffectation(tree); break; case PAR: printf("("); pprint(getChild(tree, 0)); printf(")"); break; case INSTRL:pprintTree2(tree, " \n "); break; case ARGL: pprintTree2(tree, ", "); break; case PUT: pprintPUT(tree);break; case GET: pprintGet(); break; case NOT: pprintUnaire(tree, " !"); break; case PLUS: pprintUnaire(tree, " +"); break; case MINUS: pprintUnaire(tree, " -"); break; case IF: pprintIf(tree); break; case POUR: pprintPour(tree); break; case TANTQUE:pprintTantQue(tree);break; case FAIRE: pprintFaireTantQue(tree);break; default: /* On signale le probleme mais on ne quitte pas le programme pour autant * car ce n'est pas dramatique ! */ fprintf(stderr, "Erreur! pprint : etiquette d'operator inconnue(print.c): %d\n", tree->op); setError(UNEXPECTED); } }
/* Affichage recursif d'un arbre representant une expression. */ void pprint(TreeP tree) { if (! verbose ) return; if (tree == NIL(Tree)) { printf("Unknown"); return; } if(DEBUG){ ++nbrParentheses; printf("\n"); int i; for(i = 0; i < nbrParentheses; i++){ printf(" "); }; printf("("); } switch (tree->op) { case ID: printf("%s", tree->u.str); break; case CST: printf("%d", tree->u.val); break; case STR: printf("%s", tree->u.str); break; case EQ: pprintTree2(tree, " = "); break; case NE: pprintTree2(tree, " <> "); break; case GT: pprintTree2(tree, " > "); break; case GE: pprintTree2(tree, " >= "); break; case LT: pprintTree2(tree, " < "); break; case LE: pprintTree2(tree, " <= "); break; case ADD: pprintTree2(tree, " + "); break; case SUB: pprintTree2(tree, " - "); break; case UMINUS: pprintTree1(tree, " - "); break; case MUL: pprintTree2(tree, " * "); break; case DIV: pprintTree2(tree, " / "); break; case IF: pprintIf(tree); break; case WHILE: pprintWhile(tree); break; case CONCAT: pprintTree2(tree, " & "); break; case THIS: printf("this"); break; case BLOC: pprintBloc(tree); break; case AFF: pprintAff(tree); break; case NOM: printf("%s", tree->u.str); break; case EVOID: break; case LIST: pprintList(tree); break; case INSTR: pprintInstr(tree); break; case DEC: pprintDec(tree); break; case SEL: pprintTree2(tree, "."); break; case MES: pprintMes(tree); break; case NEW: pprintNew(tree); break; case YIELD: pprintYield(tree); break; case VAR: pprintTree2(tree, ":"); break; case FINBLOC: if(DEBUG) printf("A FAIRE: FINBLOC "); break; default: /* On signale le probleme mais on ne quitte pas le programme pour autant */ fprintf(stderr, "Erreur! pprint : etiquette d'operator inconnue: %d\n", tree->op); setError(UNEXPECTED); } if(DEBUG){ printf(")"); nbrParentheses--; } }