/media/sda-magnetic/david/Dok-15-2023-11-27/informatik/ASM-DIAGRAM-GENERATOR-2024-01-28/bakusnaurrmips01.c


/*
 * 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, $r2\n");
    }
    else
        tokenback ();
return;
}

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

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

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

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