Eigener Parser - If Abfragen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Blitzprogger

Betreff: Eigener Parser - If Abfragen

BeitragMi, Okt 28, 2009 21:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie der Titel bereits sagt habe ich bei meinem Projekt einen Parser angefangen, der auch If Abfragen beherrschen soll. Ich wollte dies so lösen:

Ich habe die Programmebene und die Ifebene.
Immer ein If kommt, soll die Programmebene um 1 erhöht werden, ist die Abfrage positiv, so wird auch die Ifebene um 1 erhöht.
Bei einem Endif wird die Programmebene um 1 gesenkt, ist Die Ifebene grösser als die Programmebene, wird sie angeglichen.
Sind die bleiden Ebenen gleich gross, werden die Scripts ausgeführt.

Ich hoffe ich konnte das jetzt einigermassen gut erklären.

Das ganze funktioniert aber nicht ganz wie ich es möchte. Die Ebenen scheinen nicht richtig erkannt zu werden. Ich finde aber nicht heraus wieso.
Wäre froh wenn mir jemand helfen könnte.

Der Code: (Var. bedingung = Proggrammebene)
Code: [AUSKLAPPEN]

If script = 1 And bedingung = if_ebene Then
   If Instr(rl$,"endif") Then
      bedingung = bedingung - 1
      If bedingung < if_ebene Then if_ebene = bedingung
      If bedingung < 0 Then RuntimeError ("Es sind in der Datei "+dat$+" Seite "+diav+" Mehr Endifs als Ifs vorhanden.")
   ElseIf Instr(rl$,"if") And Instr(rl$,"then") Then
      bedingung = bedingung + 1
      tmp2 = 1
      z1 = Instr (rl$," ")
      z3 = Instr (rl$,"then")
      z2 = Instr (rl$,"<>")                : mode = 0
      If z2 = 0 Then z2 = Instr (rl$,"<=") : mode = 1
      If z2 = 0 Then z2 = Instr (rl$,">=") : mode = 2
      If z2 = 0 Then z2 = Instr (rl$,"<<") : mode = 3
      If z2 = 0 Then z2 = Instr (rl$,">>") : mode = 4
      If z2 = 0 Then z2 = Instr (rl$,"==") : mode = 5
      If z2 = 0 Then mode = 6
      werte$ (0) = Trim (Mid (rl$,z1+1,z2-z1-1))
      werte$ (1) = Trim (Mid (rl$,z2+2,z3-z2-2))
      For i = 0 To 1
         name$ = Replace (werte$(i),"0","")
         For ii = 1 To 9
            name$ = Replace (name$,Str(ii),"")
         Next
         If name$ = "" Then
         Else
            found = 0
            For v.var = Each var
               If v\nm$ = werte$ (i) Then
                  found = 1
                  werte$ (i) = v\wert
               EndIf
            Next
            If found = 0 Then werte$ (i) = "0"
         EndIf
      Next
      If mode < 6 Then
         Select mode
            Case 0
               If Int(werte$ (0)) <> Int(werte$ (1)) Then if_ebene = if_ebene + 1
            Case 1
               If Int(werte$ (0)) <= Int(werte$ (1)) Then if_ebene = if_ebene + 1
            Case 2
               If Int(werte$ (0)) >= Int(werte$ (1)) Then if_ebene = if_ebene + 1
            Case 3
               If Int(werte$ (0)) <  Int(werte$ (1)) Then if_ebene = if_ebene + 1
            Case 4
               If Int(werte$ (0)) >  Int(werte$ (1)) Then if_ebene = if_ebene + 1
            Case 5
               If Int(werte$ (0)) =  Int(werte$ (1)) Then if_ebene = if_ebene + 1
         End Select
      EndIf
      tmp2 = 1
        Endif
Endif


mfg
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group