Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

IF-Schleife Programmieren

Empfohlene Antworten

Veröffentlicht

Hallo Programmers,

mal wieder ne doofe Frage:

Wie kann ich eine IF-Schleife programmieren. (SourceCode wäre sinnvoll).

Zum Inhalt:

in einer Datei lese ich Zeichen für Zeichen aus und setze die ausgelesenen Zeichen zu token zusammen. Nun kommt folgender Ausdruck:

if wert = 4;

if wert_zaehler = 5;

? "richtig.";

endif

if wert = 3;

? "r2";

endif

? "Wert beträgt drei (3) -> " + wert;

endif

Vielen Dank für Hilfe.

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von paule22:

<STRONG>Wie kann ich eine IF-Schleife programmieren.

</STRONG>

Hallo

ich glaub du hast die Frage falsch verstanden?

Ich baue gerade einen eigenen Compiler in der der Ausdruck

IF expr = wert

IF expr2 = wert2

ENDIF

ENDIF

vorkommt.

IF und ENDIF werden als token ausgelesen.

expr als Expression/Variable behandelt, wert gibt den Bedingungswert wieder.

Leider ist es mir bis dato nicht gelungen einen vernüftigen IF-Handler-Procedure zu schreiben.

Müsste doch das einfachste der Welt sein ??????

Also weiter Vielen Dank für Hilfe ....

der code dazu schaut in etwa wie folgt aus ...

int handle_procedure(void)

{

TStringList *local_variables = new TStringList();

AnsiString saved_token;

static int if_rec = 0;

int rec = 0;

for (; ;)

{

next_token:

int code = get_token();

switch (code)

{

case DT_FORM:

{

switch (lex())

{

case POINT_TOKEN:

{

if (handle_formstatement() == RET_FAIL)

return RET_FAIL;

}

break;

default:

return fatal("Hier wird ein Punkt (.) erwartet.");

break;

}

}

break;

case DT_PRINT:

{

dt_printgoto:

AnsiString output_string;

for (; ;)

{

switch (lex())

{

case ENDFILE:

{ dt_printeof:

return fatal("Ende der Datei erreicht. Zeile nicht korrekt abgeschlossen.");

}

break;

case '+':

{

switch (lex())

{

case ENDFILE: goto dt_printeof; break;

case IDENTIFIER: goto dt_printid ; break;

case '\"': goto dt_printgf ; break;

default:

{

return fatal("Ausdruck erwartet. Zeile nicht korrekt abgeschlossen.");

}

break;

}

}

break;

case IDENTIFIER:

{

dt_printid:

if (can_exec && !if_stmt)

{

AnsiString str;

str = "procedure_local_";

str += strlwr(token_buffer.c_str());

if (!(var_ptr = get_variable(str.c_str())))

return fatal("LOCAL Variable nicht definiert/bekannt.");

if (var_ptr->type == VARTYPE_VALUE ) { output_string += FloatToStr(var_ptr->var_value) ; } else

if (var_ptr->type == VARTYPE_STRING) { output_string += var_ptr->var_string; }

}

}

break;

case '\"':

{

dt_printgf:

char *puffer = new char[2048*2];

int pos = 0;

int c;

while ((c = fgetc(input_file)) != '"')

{

if (c == EOF) return fatal("Ende der Datei erreicht.");

if (c == '\n') return fatal("Textstring wurde nicht richtig abgeschlossen.");

else {

if (pos > (2048*2)-1)

return fatal("Stringpuffer ist voll.");

puffer[pos++] = c;

} puffer[pos] = '\0';

}

output_string += puffer;

}

break;

case ';':

goto dt_printend;

break;

default:

{

return fatal("Zeile muss mit einen Semikolon ( ;) enden.");

}

break;

}

}

dt_printend:

if (can_exec && !if_stmt)

output_form->Memo1->Lines->Add(output_string);

}

break;

case DT_ENDIF:

{

AnsiString str;

str = "endif: ";

str += if_rec;

ShowMessage(str);

if (!if_rec) return fatal("ENDIF ohne IF-Bedingung nicht erlaubt.");

if_rec--;

if (rec) {

rec = 0;

if (!if_rec)

if_stmt = 0;

ShowMessage("endifENDIF");

return RET_OK;

}

if (!if_rec)

if_stmt = 0;

if (can_exec)

return RET_OK;

}

break;

case DT_IF:

{

if_rec++;

switch (get_token())

{

case DT_USERDEF:

{

saved_token = strlwr(token_buffer.c_str());

if (can_exec && !if_stmt)

{

AnsiString str;

str = "procedure_local_";

str += saved_token;

if (!(var_ptr = get_variable(str.c_str())))

return fatal("IF-Variable ist nicht definiert/bekannt.");

// ------------------------

// IF <variable> = EXPR ...

// ------------------------

if (var_ptr->type == VARTYPE_VALUE)

{

double wert1 = var_ptr->var_value;

int code = lex();

if (code == EQUALSIGN)

{

double wert2 = handle_expr(EP_NORMAL);

if (ptr__error) {

ptr__error = 0;

return RET_FAIL;

} ptr__error = 0;

if (wert1 == wert2)

{

ShowMessage("wert ist gleich");

can_exec = 1;

if_stmt = 0;

if (handle_procedure() == RET_FAIL)

return RET_FAIL;

}

else {

can_exec = 1;

if_stmt = 1;

if (handle_procedure() == RET_FAIL)

return RET_FAIL;

}

if (handle_procedure() == RET_FAIL)

return RET_FAIL;

}

else if (code == '>')

{

double wert2 = handle_expr(EP_NORMAL);

if (ptr__error) {

ptr__error = 0;

return RET_FAIL;

} ptr__error = 0;

if (wert1 > wert2)

{

ShowMessage("wert ist grӇer");

can_exec = 1;

if (handle_procedure() == RET_FAIL)

return RET_FAIL;

ShowMessage("reci RETURN-IF");

}

else {

can_exec = 0;

if (handle_procedure() == RET_FAIL)

return RET_FAIL;

}

}

else if (code == '<')

{

double wert2 = handle_expr(EP_NORMAL);

if (ptr__error) {

ptr__error = 0;

return RET_FAIL;

} ptr__error = 0;

if (wert1 < wert2)

{

ShowMessage("wert ist kleiner");

can_exec = 1;

}

else {

can_exec = 0;

}

}

}

// --------------------------

// IF <variable> = STRING ...

// --------------------------

else if (var_ptr->type == VARTYPE_STRING)

{

AnsiString str1;

str1 = var_ptr->var_string;

int code = lex();

if (code == EQUALSIGN)

{

}

}

else

return fatal("Typ der Variablen kann nicht bestimmt werden.");

}

// ------------------

else {

int c;

int code = lex();

if (code != EQUALSIGN) return fatal("Gleichheitszeichen (=) hier erwartet.");

c = skip_white_space();

if (c >= '0' && c <= '9')

{

ungetc(c,input_file);

double wert = handle_expr(EP_NORMAL);

if (ptr__error) {

ptr__error = 0;

return RET_FAIL;

} ptr__error = 0;

if (can_exec)

{

ShowMessage("DDD");

ShowMessage(saved_token);

ShowMessage(wert);

rec = 1;

goto next_token;

}

}

else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_')

{

ungetc(c,input_file);

get_token();

}

}

}

break;

default:

{

return fatal("reservierte SchlÂsselw”rter dÂrfen hier nicht verwendet werden.");

}

break;

}

}

break;

...

}

ich bin schon am verzweifeln ...

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.