... 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

Interpreter

Einfacher Interpreter

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct
{
        char* varname;
        char* value;
} var;
 
var*   variables;
int            var_cnt         = 0;
 
int putvar( char* varname, char* value )
{
        int            i;
 
        strupr( varname );
 
        /* Suche Speicherplätze und fülle mit neuen Wert,
         falls schon vorhanden */
        for( i = 0; i < var_cnt; i++ )
        {
                if( strcmp( variables[i].varname, varname ) == 0 )
                {
                        if( variables[i].value != (char*) NULL )
                                free( variables[i].value );
 
                        variables[i].value = strdup( value );
                        return 0;
                }
 
        }
 
        /* Neue Variable anlegen */
        if( var_cnt == 0 )
                variables = (var*)malloc( sizeof( var ) );
        else
                variables = (var*)realloc( (var*) variables,
                        (var_cnt + 1) * sizeof( var ) );
 
        variables[ var_cnt ].varname = strdup( varname );
        variables[ var_cnt ].value = strdup( value );
        var_cnt++;
}
 
char* getvar( char* varname )
{
        int            i;
 
        strupr( varname );
 
        /* Suche Speicherplätze und gebe Wert zurück */
        for( i = 0; i < var_cnt; i++ )
        {
                if( strcmp( variables[i].varname, varname ) == 0 )
                {
                        return variables[i].value;
                } 
        }
 
        return "";
}
 
 
char* getnexttoken( char** line )
{
        char* start;
 
        while( **line == '\t' || **line == ' ' )
                (*line)++;
 
        start = *line;
 
        do
        {
                (*line)++;
        }
        while( **line != ' ' && **line != '\n' );
 
        **line = '\0';
        (*line)++;
 
        return start;
}
 
char* getargument( char* line )
{
        char*         arg;
        static char   str             [ 80 + 1 ];
 
        arg = getnexttoken( &line );
        strupr( arg );
 
        /* Argument ermitteln und verarbeiten */
        if( strcmp( arg, "INPUT" ) == 0 )
        {
                gets( str );
                return str;
        }
        else if( strcmp( arg, "VALUE" ) == 0 )
                return getvar( getnexttoken( &line ) );
        else if( strcmp( arg, "TEXT" ) == 0 )
                return line;
        else
                return ""; 
}
 
int execute( char* line )
{
        char* statement;
        char* var;
        char   value           [ 80 + 1 ];
        int    calcvalue       = 0;
 
        statement = getnexttoken( &line );
        strupr( statement );
 
        /* Anweisungen verarbeiten */
        if( strcmp( statement, "PRINT" ) == 0 )
                printf("%s", getargument( line ) );
        else if( strcmp( statement, "STORE" ) == 0 )
        {
                var = getnexttoken( &line );
                putvar( var , getargument( line ) );
        }
        else if( strcmp( statement, "CLS" ) == 0 )
                system("cls");
        else if( strcmp( statement, "NEWLINE" ) == 0 )
                printf("\n");
        else if( strcmp( statement, "ADD" ) == 0 || strcmp( statement, "SUBSTRACT") == 0 ||
                strcmp( statement, "DIVIDE") == 0 || strcmp( statement, "MULTIPLY") == 0 )
        {
                var = getnexttoken( &line );
 
                if( strcmp( statement, "ADD" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) + atoi( getargument( line ) );
                else if( strcmp( statement, "SUBSTRACT" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) - atoi( getargument( line ) );
                else if( strcmp( statement, "DIVIDE" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) / atoi( getargument( line ) );
                else
                        calcvalue = atoi( getvar( var ) ) * atoi( getargument( line ) );
 
                sprintf(value, "%d", calcvalue );
                putvar( var, value );               
        }
        else
        {
                return -1;
        }
 
        return 0;
}
 
int main( int argc, char** argv )
{
        FILE*  source          = (FILE*)NULL;
        char   line            [ 1024 + 1 ];
 
        if( argc < 2 )
        {
                printf("Verwendung:\t\tLITERAL <dateiname>\n");
                return -1;
        }
 
        source = fopen( argv[1], "rt" );
        if( source != (FILE*) NULL )
        {
                while( fgets( line, 1024, source ) != (char*)NULL )
                {
                        line[ strlen( line ) - 1 ] = '\0';
                        if( execute( line ) < 0 )
                                break;
                }
 
                fclose( source );
        }
        else
        {
                printf("Fehler: Datei nicht gefunden.");
                return -1;
        }
 
        return 0;
}

Beispielprogramm

cls
print text Geben Sie bitte einen Wert ein: 
store wert1 input
print text Geben Sie bitte einen weiteren Wert ein: 
store wert2 input
multiply wert1 value wert2
print text Das Ergebnis der Berechnung lautet: 
print value wert1
newline

Ausgabe

Geben Sie bitte einen Wert ein: 5
Geben Sie bitte einen weiteren Wert ein: 4
Das Ergebnis der Berechnung lautet: 20








Copyright © 2018

Impressum