... just another site around the web ...





Möge eine Gesellschaft, die sich einzig auf die Macht des Geldes stützt, erzittern, wenn sie die Ohnmacht der Justiz gegenüber den Verflechtungen eines Systems erkennt, das den Erfolg, der alle Mittel heiligt, zum Gott erhebt.
- Honore de Balzac

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

Datenschutz | Impressum