Παράσταση του συντακτικού δένδρου
- Το συντακτικό δένδρο που δημιουργεί ο συντακτικός αναλυτής
παριστάνεται συχνά ως μια δενδρική δομή.
- Κάθε κόμβος του δένδρου πρέπει να περιέχει κάποιο στοιχείο για
το είδος του και τα παιδιά του.
- Ένας συνηθισμένος τρόπος υλοποίησης στη C περιλαμβάνει:
- τον ορισμό απαρίθμησης για τα είδη των κόμβων
- τον ορισμό μιας κοινής δομής για όλους τους κόμβους
- τον ορισμό μέσα στη δομή μιας ένωσης για τις διαφορές
ανάμεσα στους κόμβους
- τη χρήση δεικτών για την παράσταση των συνδέσεων ανάμεσα στους
γονείς και τα παιδιά.
- Συχνά ορίζουμε ειδικές συναρτήσεις για τη δημιουργία τμημάτων του
δένδρου.
Παράδειγμα ορισμού (tree.h)
/*
* Tree type and building function declarations
*
* D. Spinellis, November 1999
*
* $Id: tree.h 1.1 1999/11/09 23:32:12 dds Exp $
*
*/
enum e_nodetype {
ent_binop, /* Binary operator expr */
ent_unop, /* Unary operator expr */
ent_digit /* Digit expr */
};
struct s_tree {
enum e_nodetype nt; /* Expression type */
union {
struct s_binop {
struct s_tree *left, *right;
char op;
} binop; /* Binary operator expr */
struct s_unary {
struct s_tree *expr;
char op;
} unop; /* Unary operator expr */
int digit; /* Digit expression */
} u;
};
struct s_tree * mk_binop(struct s_tree *left, char op, struct s_tree *right);
struct s_tree * mk_unop(char op, struct s_tree *expr);
struct s_tree * mk_digit(char c);
Παράδειγμα συναρτήσεων δημιουργία και εκτύπωσης (tree.c)
/*
* Tree building functions
*
* D. Spinellis, November 1999
*
* $Id: tree.c 1.2 1999/11/10 09:15:35 dds Exp $
*
*/
#include <stdlib.h>
#include "tree.h"
struct s_tree *
mk_binop(struct s_tree *left, char op, struct s_tree *right)
{
struct s_tree *t = malloc(sizeof(struct s_tree));
t->nt = ent_binop;
t->u.binop.left = left;
t->u.binop.op = op;
t->u.binop.right = right;
return (t);
}
struct s_tree *
mk_unop(char op, struct s_tree *expr)
{
struct s_tree *t = malloc(sizeof(struct s_tree));
t->nt = ent_unop;
t->u.unop.op = op;
t->u.unop.expr = expr;
return (t);
}
struct s_tree *
mk_digit(char c)
{
struct s_tree *t = malloc(sizeof(struct s_tree));
t->nt = ent_digit;
t->u.digit = c -'0';
return (t);
}
/*
* Indent output by the indent ammount given
*/
static void
indent(int level)
{
int i;
for (i = 0; i < level; i++)
printf(" ");
}
/*
* Dump an expression tree to the standard output
*/
void
dumptree(struct s_tree *t)
{
static int il = 0; /* Indent level */
il++;
switch (t->nt) {
case ent_binop:
dumptree(t->u.binop.left);
indent(il); printf("%c\n", t->u.binop.op);
dumptree(t->u.binop.right);
break;
case ent_unop:
indent(il); printf("%c\n", t->u.unop.op);
dumptree(t->u.unop.expr);
break;
case ent_digit:
indent(il); printf("%d\n", t->u.digit);
break;
}
il--;
}