Εκφράσεις

Η παραγωγή του τελικού κώδικα για τον υπολογισμό εκφράσεων μπορεί να γίνει εύκολα με τη χρήση ενός μοντέλου στοίβας. Σύμφωνα με το μοντέλο αυτό κάθε τελεστής λαμβάνει τους τελεστέους από τη στοίβα και μεταφέρει το αποτέλεσμα πίσω στη στοίβα. Η διαδικασία αυτή ακολουθείται αναδρομικά για όλα τα στοιχεία του συντακτικού δένδρου. Στο τέλος του υπολογισμού της έκφρασης πρέπει το αποτέλεσμα που έχει μείνει στη στοίβα να αφαιρεθεί.

Η υλοποίηση αυτή είναι κατάλληλη για αρχιτεκτονικές επεξεργαστών που βασίζονται σε στοίβα όπως η Java Virtual Machine και ο επεξεργαστής αριθμών κινητής υποδιαστολής της σειράς Intel Pentium, αλλά μπορεί να χρησιμοποιηθεί και σε αρχιτεκτονικές που βασίζονται σε καταχωρητές. Έτσι η έκφραση b + d υλοποιείται με τη σειρά:

        pushl   b               // Push operands
        pushl   d
        pop     %eax            // Retrieve operand 1
        pop     %ebx            // Retrieve operand 2
        add     %ebx, %eax      // Perform operation
        push    %eax            // Push back result
από κώδικα της μορφής:
void
codegen_add(struct s_tree *left, struct s_tree *right)
{
        codegen(left);
        codegen(right);
        printf("\tpop %%eax\n");
        printf("\tpop %%ebx\n");
        printf("\tadd %%ebx, %%eax\n");
        printf("\tpush %%eax\n");
}

Παράδειγμα:

a = b + c * d;
Δένδρο:
    =
 a      +
     b    *
         c  d
Κώδικας:
        pushl   a
        pushl   b
        pushl   c
        pushl   d
        pop     %eax            // c *  d
        pop     %ebx
        mul     %ebx
        push    %eax
        pop     %eax            // b + (c * d)
        pop     %ebx
        add     %ebx, %eax
        push    %eax
        pop     %esi            // a = ...
        pop     %eax
        mov     %eax, (%esi)