Seite 1 von 1

Writing Programms for MIPS

Verfasst: Di Dez 19, 2023 6:55 am
von davidvajda.de
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

Code: Alles auswählen

/*
 * 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;
}
An den Registern müssen wir noch arbeiten

Code: Alles auswählen

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:~$