Writing Programms for MIPS

Ich schreibe jetzt einen Parser für arithmetische Ausdrücke in der Bakus Naurr Form. das übliche. Zurückgeben wird er aber keinen Wert, sondern eine Ausgabe in MIPS Assembler

So weit bin ich bisher
/*
 * expr ::= term + expr | term
 * term ::= factor * term | factor
 * factor ::= num | (expr)
 */
#include <stdio.h>

int tokennext ();
void tokenback ();
void expr ();
void term ();
void factor ();

char *s = "(4+3)*2";
int i = 0;

int tokennext () {
    return s [i++];
}

void tokenback () {
    i--;
}

void expr () {
    term ();
    if (tokennext () == '+') {
        expr ();
        printf ("add \$r1, \$r1, \$r2n");
    }
    else
        tokenback ();
return;
}

void term () {
    factor ();
    if (tokennext () == '*') {
        term ();
        printf ("mult \$r2, \$r2, \$r3n");
    }
    else
        tokenback ();
return;
}

void factor () {
    int ch;
    ch = tokennext ();

    if ((ch >= '0') \&amp;\&amp; (ch <= '9'))
        printf ("li \$r3, %cn", ch);
    else if (ch == '(') {
        expr ();
        printf ("move \$r1, \$r3n");
    }
return;
}

int main (void) {
    printf (".textn");
    printf ("main:n");
    expr ();
return 0;
}

An den Registern müssen wir noch arbeiten

david@laptop-peaq:~\$ gcc bakusnaurrmips01.c
david@laptop-peaq:~\$ ./a.out
.text
main:
li \$r3, 4
li \$r3, 3
add \$r1, \$r1, \$r2
move \$r1, \$r3
david@laptop-peaq:~\$