3.8 Арифметика

Предыдущая  Содержание  Следующая V*D*V

Если мы хотим выполнять арифметические действия, то позволяем исполнительным функциям возвращать значения типа double, которые будут напечатаны в process():

 

static double exec (const void * tree)

{

    return (* (struct Type **) tree) -> exec(tree);

}

 

void process (const void * tree)

{

    printf("\t%g\n", exec(tree));

}

 

Для каждого типа узла требуется одна исполнительная функция, который вычисляет и возвращает значение для данного узла. Вот два примера:

 

static double doVal (const void * tree)

{

    return ((struct Val *) tree) -> value;

}

 

static double doAdd (const void * tree)

{

    return exec(((struct Bin *) tree) -> left) +

            exec(((struct Bin *) tree) -> right);

}

 

static struct Type _Add = { mkBin, doAdd, freeBin };

static struct Type _Value = { mkVal, doVal, free };

 

const void * Add = & _Add;

const void * Value = & _Value;

 

Предыдущая  Содержание  Следующая