#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MODE_POSTFIX 0
#define MODE_ASSEMBLY 1
#define MAX_EXPRESSION_LENGTH 20
char lookahead;
int pos;
int compile_mode;
char expression[MAX_EXPRESSION_LENGTH+1];
void error() {
printf("Syntaxfehler!\n");
}
void match( char t ) {
if( lookahead == t ) {
lookahead = expression[++pos];
}
else
error();
}
void digit() {
switch( lookahead ) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
printf( compile_mode == MODE_POSTFIX ? "%c " : "\tPUSH %c\n", lookahead );
match( lookahead );
break;
default:
error();
break;
}
}
void term() {
digit();
while( 1 ) {
switch( lookahead ) {
case '*':
match('*');
digit();
printf( "%s", compile_mode == MODE_POSTFIX
? "* " : "\tPOP B\n\tPOP A\n\tMUL A, B\n\tPUSH A\n" );
break;
case '/':
match('/');
digit();
printf( "%s", compile_mode == MODE_POSTFIX
? "/ " : "\tPOP B\n\tPOP A\n\tDIV A, B\n\tPUSH A\n" );
break;
default:
return;
}
}
}
void expr() {
term();
while( 1 ) {
switch( lookahead ) {
case '+':
match('+');
term();
printf( "%s", compile_mode == MODE_POSTFIX
? "+ " : "\tPOP B\n\tPOP A\n\tADD A, B\n\tPUSH A\n" );
break;
case '-':
match('-');
term();
printf( "%s", compile_mode == MODE_POSTFIX
? "- " : "\tPOP B\n\tPOP A\n\tSUB A, B\n\tPUSH A\n");
break;
default:
return;
}
}
}
int main ( int argc, char** argv ) {
printf("Bitte geben Sie einen Ausdruck in Infix-Notation ein:\n\n\t");
fgets( expression, MAX_EXPRESSION_LENGTH, stdin );
printf("\nKompilierter Ausdruck in Postfix-Notation:\n\n\t");
compile_mode = MODE_POSTFIX;
pos = 0;
lookahead = *expression;
expr();
printf("\n\nKompilierter Ausdruck in Assemblersprache:\n\n");
compile_mode = MODE_ASSEMBLY;
pos = 0;
lookahead = *expression;
expr();
return 0;
}
Bitte geben Sie einen Ausdruck in Infix-Notation ein:
5+3*2-9
Kompilierter Ausdruck in Postfix-Notation:
5 3 2 * + 9 -
Kompilierter Ausdruck in Assemblersprache:
PUSH 5
PUSH 3
PUSH 2
POP B
POP A
MUL A, B
PUSH A
POP B
POP A
ADD A, B
PUSH A
PUSH 9
POP B
POP A
SUB A, B
PUSH A
Copyright © 2025