Εκφράσεις
Η παραγωγή του τελικού κώδικα για τον υπολογισμό εκφράσεων
μπορεί να γίνει εύκολα με τη χρήση ενός μοντέλου στοίβας.
Σύμφωνα με το μοντέλο αυτό κάθε τελεστής λαμβάνει τους
τελεστέους από τη στοίβα και μεταφέρει το αποτέλεσμα πίσω
στη στοίβα.
Η διαδικασία αυτή ακολουθείται αναδρομικά για όλα τα στοιχεία
του συντακτικού δένδρου.
Στο τέλος του υπολογισμού της έκφρασης πρέπει το αποτέλεσμα
που έχει μείνει στη στοίβα να αφαιρεθεί.
Η υλοποίηση αυτή είναι κατάλληλη για αρχιτεκτονικές επεξεργαστών
που βασίζονται σε στοίβα όπως η 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)