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





Nur wenn wir unseren Egoismus ablegen und beginnen, uns in Geduld und Demut dem Wohle anderer zu widmen, werden wir befreit von all unseren Leiden und Zwängen.
- Dalai Lama

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

Impressum