php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.06.2005, 13:15  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard Problem mit einer rekursiven Funktion in einer Klasse

Hallo,

mein Problem ist schwer zu erklären, aber ich versuch's mal:
Ich bin dabei, einen Parser zu entwickeln, der eine formale Grammatik analysiert und in PHP abbildet. Formale Grammatiken bilden quasi einen Baum ab. Zum Verständnis folgendes Beispiel, wie meine Grammatik (die stets als String vorliegt) aussieht:
[startplatzhalter] -> [platzhalter1], [platzhalter2]
[platzhalter1] -> [platzhalter3]
[platzhalter2] -> [platzhalter5], [platzhalter6], [platzhalter7]
usw.
Der String wird nun Zeilenweise zerlegt und das entstandene Array wird rekursiv analysiert.
Das funktioniert auch alles. Nun will ich noch ein paar Fehlererkennungsmaßnahmen programmieren, um bei fehlerhaften Grammatiken eine Meldung ausgeben zu können. Dazu hatte ich die 3. Zeile manipuliert, dass sie nicht mit '[' beginnt.
Rein theoretisch müsste folgendes passieren:
Bei der Analyse von Zeile 3 müsste das Skript merken, dass sie nicht mit '[' beginnt und eine Fehlermeldung ausgeben bzw. eine Fehlermeldung dem Fehlerarray hinzufügen. Das passiert auch, aber: Die Meldung kommt ganze 3x im Array vor. Das verstehe ich aber nicht.
Eigentlich müsste doch, so bald der Fehler auftritt, die Funktion per return verlassen werden und bei jedem Funktionsneu-Eintritt erkannt werden, dass das Fehler-Array nicht mehr leer ist, was dann zum sorfortigen Verlassen der Funktion führt. Testausgaben zeigen aber, dass die Funktion trotzdem mehrere Male (eben 3x) komplett durchlaufen wird, weil das Fehler-Array am Funktionsanfang stets leer ist. Erst nach dem Dritten Durchlauf der Funktion scheinen 3 (gleiche) Fehlermeldungen angekomen zu sein.
Hat jemand eine Idee, was das sein kann? Kann es sein, dass die Rekursivität das Schreiben in die Klassenvariable (Fehler-Array) behindert/verzögert?

Mein Quelltext ist sehr umfangreich. Ich habe ihn nur schematisch aufgeführt (also massiv gekürzt). Er ist also nicht alleine Lauffähig.


PHP-Code:
<?php


class konf_control{
   var 
$msg_err   = array(); // fatalere Fehlermeldungen

   
function vorlageEinlesen(){
         
$this->parsen(1$platzhalter);  // Parser mit Ebene 1; Start-Platzhalter aufrufen
   
}


   function 
parsen($ebene=1,$platzhalter=''){
      if (
count($this->msg_err)) return; // trat irgendwo ein Fehler auf, hier nicht erst weiter machen

      // Sub-Platzhalter finden:
      
foreach ($this->rules as $zeile){
         
$zeichen1 substr($zeile,0,1);   // 1. Zeichen

         
if ($zeichen1=='['){  // es wurde irgendEIN Platzhalter gefunden
              
.....
               
// nachdem alle Subplatzhalter der Zeile gefunden
               
foreach($found_alle as $einer){
                  
$this->parsen($ebene+1$pHalter); // Funktion erneut aufrufen
               
}


          } 
// Ende "wenn 1. Zeichen ein $ oder ["
         
else{
            
$this->msg_err[] = 'Zeile '.$zeilennr.' der Regelbeschreibung beginnt nicht mit [ oder $';
            return;
         }
      } 
// Ende foreach (alle Zeilen durchlaufen)
   
// Ende Funktion
// Klassenende


?>
ajo_silent ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.06.2005, 14:16  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

reguläre sprachen .... reguläre ausdrücke .... klingelt's ?
axo ist offline   Mit Zitat antworten
Alt 13.06.2005, 14:24  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

Nicht wirklich. Helfen die mir hier weiter? Mein Problem ist nicht die Erkennung der zu "parsenden" Struktur, sondern die Fehlerausgabe, die zu oft geschieht.

Ajo
ajo_silent ist offline   Mit Zitat antworten
Alt 13.06.2005, 14:55  
Gast
 
Beiträge: n/a
Standard

Versuchs mal mit nem Abbruch innerhalb deiner foreach-Schleife.
Code:
foreach ($this->rules as $zeile){ 
   if (count($this->msg_err)) return;
  ...
  Mit Zitat antworten
Alt 13.06.2005, 15:17  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

Meine Güte. Das hat echt geholfen! Jetzt geht's.
Aber warum ist das so? Mit dem return verlasse ich doch die Funktion und dürfte doch dann nie wieder rein kommen...

Aber Danke schon mal für die Hilfe
ajo_silent ist offline   Mit Zitat antworten
Alt 13.06.2005, 15:58  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von ajo_silent
Meine Güte. Das hat echt geholfen! Jetzt geht's.
Aber warum ist das so? Mit dem return verlasse ich doch die Funktion und dürfte doch dann nie wieder rein kommen...
bedingt richtig.
du parst aber mit foreach() eine komplette ebene, und wenn teil 1 der ebene einen fehler findet, wird teil2, teil3, teiln der ebene aber trotzdem noch durchgeparst, der rekursionsabbruch findet damit erst in der nächsten ebene statt.

damit ist die antwort des besserwissers korrekt.

naja, zu den regulären ausdrücken - forget it again. zur fehlerbehandlung hätte dir das natürlich nicht geholfen, hätte aber evtl. die komplexität deines algorithmus vereinfacht, denn das parsing 'syntax ok / syntax nicht ok' kannst du komplett mit dem ver-und-en und ver-oder-n von relativ einfachen regulären ausdrücken erledigen, d.h. zum schluss brauchst du nur ein einziges preg-match nehmen und weißt sofort, ob die syntax ok ist oder nicht. und mit den subpatterns kannst du dann evtl. auch debuggen, allerdings würde das deine bereits angefangene struktur komplett verändern.

einfach weitermachen
axo ist offline   Mit Zitat antworten
Alt 13.06.2005, 16:40  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 104
ajo_silent
Standard

Zitat:
Zitat von axo
du parst aber mit foreach() eine komplette ebene, und wenn teil 1 der ebene einen fehler findet, wird teil2, teil3, teiln der ebene aber trotzdem noch durchgeparst, der rekursionsabbruch findet damit erst in der nächsten ebene statt.
Nach langem Nachdenken hab ich's endlich geschnallt: Wenn er den Platzhalter gefunden hat, läuft er wegen dem foreach noch alle weiteren Zeilen durch. Ergo trifft er jedes mal auf die fehlerhafte Zeile.
Ich habs jetzt so modifiziert:

PHP-Code:
<?php
wenn gesuchter Platzhalter gefunden

  
// mache was...
  
break; // damit er nicht unnötig alle weiteren Zeilen durchforstet
}
?>
Dadurch kann ich jetzt die Abfrage, ob im Fehler-Array was drin ist direkt unter dem Funktionsbeginn ODER unter dem Foreach-Schleifen-Anfang schreiben. Es wird nur 1 Fehler angezeigt, also wie gewünscht.

Danke noch mal
ajo_silent ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zugriff auf eine Klasse innerhalb einer Funktion -&amp;gt; Fehle PHP-Fortgeschrittene 23 05.02.2006 13:02
Problem mit Funktion PHP Tipps 2006 4 15.01.2006 15:08
[Erledigt] Multidimensionales Array in Klasse Problem PHP-Fortgeschrittene 11 07.01.2006 22:26
aus einer funktion auf funktion anderer klasse zugreifen seejay PHP Tipps 2006 3 05.01.2006 10:37
problem mit einer methode in einer klasse PHP Tipps 2007 4 18.12.2005 16:14
Problem mit mysql_fetch_array in Klasse PHP Tipps 2005-2 3 16.08.2005 09:14
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
Ausgabe Var einer Klasse geht nicht mit externer Funktion HL1234 PHP-Fortgeschrittene 2 01.08.2005 19:40
funktion in klasse ruft funktion in anderer klasse auf phpfortgeschrittener PHP Tipps 2005 6 17.04.2005 17:47
Problem mit einer Error-loggin funktion Igäl PHP Tipps 2005 5 06.04.2005 12:42
problem mit update funktion aircrash PHP Tipps 2004-2 3 17.11.2004 16:55
Problem beim Registrieren von Session-Variablen in Klasse zwelch PHP-Fortgeschrittene 6 18.10.2004 08:07
Problem bei einer Klasse mit "hat" beziehung PHP Tipps 2004 4 06.10.2004 21:29
Problem mit optionalen Parametern bei Funktion in Klasse RudiS PHP-Fortgeschrittene 6 24.09.2004 09:03
Problem mit mail() - Funktion PHP Tipps 2004 2 06.07.2004 18:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php rekursion abbrechen, php rekursive funktion abbrechen, rekursive reguläre ausdrücke, php rekursive ausdrücke, rekursion abbrechen php, rekursive funktion in klasse, rekursive funktion in klassen, return bei rekursiver funktion, rekursive methode in klasse php, php rekursive funktion css klasse, rekursive funktion return, rekursive funktion break, php primzahl, php class funktion rekursiv, php rekursiver ausdruck, php problem function gibt return nicht wieder, php klassen rekursive funktion, rekursive funktion in klasse funktioniert nicht, php problem function arrays leer, php rekursiv aktuellen durchlauf abbrechen

Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.