Writing Programms for MIPS
Verfasst: Di Dez 19, 2023 6:55 am
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
An den Registern müssen wir noch arbeiten
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;
}
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:~$