The following is a simple small addition-stack computer
#include <stdio.h> #include <stdlib.h>/////////////////////////////////////////////////Data structures For the Sum language.enum exp_kind_t {exp_int, exp_sum};struct exp_t{enum exp_kind_t Kind;}; struct exp_int{enum exp_kind_t Kind; int i;}; struct exp_sum{enum exp_kind_t Kind; struct exp_t *left; struct exp_t *right;};/ /"constructors" struct exp_t *exp_int_new (Int i) {struct Exp_int *p = (Exp_int *) malloc (sizeof (exp_int)); P->kind = Exp_int; P->i = i; return (struct exp_t *) p;} struct exp_t *exp_sum_new (struct exp_t *left, struct exp_t *right) {struct Exp_sum *p = (exp_sum *) malloc (sizeof (exp_s UM)); P->kind = Exp_sum; P->left = left; P->right = right; return (struct exp_t *) p;} "Printer" void Exp_print (struct exp_t *exp) {switch (exp->kind) {case exp_int:{struct exp_int *p = (struct EXP _int *) exp; printf ("%d", p->i); Break } case exp_sum:{struct exp_sum *p = (struct exp_sum *) EXP; Exp_print (P->left);printf ("+"); Exp_print (P->right); Break } Default:break; }}////////////////////////////////////////////////Data structures for the Stack language.enum stack_kind_t {STACK_ADD , stack_push};struct stack_t{enum stack_kind_t Kind;}; struct stack_add{enum stack_kind_t Kind;}; struct stack_push{enum stack_kind_t Kind; int i;};/ /"constructors" struct stack_t *stack_add_new () {struct Stack_add *p = (Stack_add *) malloc (sizeof (Stack_add)); P->kind = Stack_add; return (struct stack_t *) p;} struct stack_t *stack_push_new (int i) {struct Stack_push *p = (Stack_push *) malloc (sizeof (Stack_push)); P->kind = Stack_push; P->i = i; return (struct stack_t *) p;} Instruction liststruct list_t{struct stack_t *instr; struct list_t *next;}; struct list_t *list_new (struct stack_t *instr, struct list_t *next) {struct list_t *p = (list_t *) malloc (sizeof (list_t )); P->instr = InStr; P->next = Next; return p;} "Printer" void List_reverse_print (struct List_t *list) {if (list = = NULL) return; List_reverse_print (List->next), if (List->instr->kind = = Stack_push) {printf ("PUSH%d\n", ((Stack_push *) ( LIST->INSTR))->i);} Else{puts ("ADD");}} A compiler from Sum to stackstruct list_t *all = 0;void emit (struct stack_t *instr) {all = List_new (instr, All);} void compile (struct exp_t *exp) {switch (exp->kind) {case exp_int:{struct exp_int *p = (struct exp_int *) Exp; Emit (Stack_push_new (p->i)); Break } Case exp_sum:{//TODO (); Exp_sum * t = (exp_sum *) Exp; compile (t->left); compile (t->right); Emit (Stack_add_new ()); Break } Default:break; }}////////////////////////////////////////////////////Program Entryint Main () {printf ("Compile starting\n"); Build an expression tree://+/////+ 4/////2 3 struct exp_t *exp = exp_sum_new (Exp_sum_new (exp_int_new (2) , Exp_int_new (3)), Exp_int_new (4)); Exp_sum_new (Exp_int_new (4), NULL); Print out this tree:printf ("The Expression is:\n"); Exp_sum *p = (exp_sum *) Exp; if (P->left = = NULL) {printf ("%d\n", ((Exp_int *) (p->right))->i); printf ("PUSH%d\n", ((Exp_int *) (p->right))->i); } else if (p->right = = NULL) {printf ("%d\n", ((Exp_int *) (p->left))->i); printf ("PUSH%d\n", ((Exp_int *) (p->left))->i); } else {Exp_print (exp);//compile this tree-to-Stack machine instructionsputs (""); compile (exp);//Print out the Gener Ated Stack Instructons:list_reverse_print (All); } printf ("\ncompile finished\n"); return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
Compiler practice one of the add-on-stack computers