#include #include #include // ========== INSTRUCTIONS DE TRACE SUR STDERR, FORMATTEES, ==================== // // Exemple Appel : trace2("CompName",$2) // Resultat : // ---------------------------------------------------------------------------- void trace1( char *s ) { fprintf(stderr,"<%s>", s); } void trace2( char *s1, char *s2 ) { fprintf(stderr,"<%s:%s>", s1, s2 ); } void trace3( char *s1, char *s2, char *s3 ) { fprintf(stderr,"<%s:%s>%s", s1, s2, s3 ); } void trace4( char *s1, char *s2, char *s3, char *s4 ) { fprintf(stderr,"<%s:%s%s>%s", s1, s2, s3, s4 ); } // ========== POUR PREPARER LA VALEUR $$ D'UNE TETE DE REGLE ================== // -------------------------------------------------------------------------- // POUR COPIER DANS $$ LA VALEUR DU n-ime TERME DE QUEUE $n // // Exemple d'utilisationdans une regle : // // Operand: Arg // { $$ = copy($1); } // ; // -------------------------------------------------------------------------- char * copy( char * s ) { char *s1 = malloc( strlen(s) + 1 ); strcpy( s1, s ); return s1; } // -------------------------------------------------------------------------- // POUR COPIER DANS $$ UNE CONCATENATION DE TERMES $nn, OU AUTRES CHAINES // // Exemple d'utilisation $$ = c3( "private var ", $3, ":Number" ); // trace2("VarDef",$$); // Exemple de resultat // -------------------------------------------------------------------------- char * c2( char *s1, char *s2 ) { char * s = malloc( strlen(s1) + strlen(s2) + 1 ); strcpy( s, s1 ); strcat( s, s2 ); return s; } char * c3( char *s1, char *s2, char *s3 ) { char * s = malloc( strlen(s1) + strlen(s2) + strlen(s3) + 1 ); strcpy( s, s1 ); strcat( s, s2 ); strcat( s, s3 ); return s; } char *c4( char *s1, char *s2, char *s3, char *s4 ) { return c2( c2(s1,s2), c2(s3,s4) ); } char *c5( char *s1, char *s2, char *s3, char *s4, char *s5 ) { return c2( c3(s1,s2,s3), c2(s4,s5) ); } char *c6( char *s1, char *s2, char *s3, char *s4, char *s5, char *s6 ) { return c2( c3(s1,s2,s3), c3(s4,s5,s6) ); } char *c7( char *s1, char *s2, char *s3, char *s4, char *s5, char *s6 , char *s7 ) { return c2( c3(s1,s2,s3), c4(s4,s5,s6,s7) ); }