ReLast - Klassik


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

Datenschutz | Impressum