#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; }
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
Geben Sie bitte einen Wert ein: 5 Geben Sie bitte einen weiteren Wert ein: 4 Das Ergebnis der Berechnung lautet: 20
Copyright © 2024