ReLast - Klassik


Compiler


Einfacher Compiler

#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;
}

Beispielablauf

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 © 2024

Datenschutz | Impressum