Entwickler-Ecke
Sonstiges (Delphi) - Aufbau eines Parsers
florida - Sa 19.06.10 13:53
Titel: Aufbau eines Parsers
Jetzt habe ich noch eine Frage diesbezüglich des vorher erwähnten Programmes, was auch nicht die Letzte für heute sein wird. :wink:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| for I := 0 to Editor.Lines.Count - 1 do begin if Editor.Lines[I] = 'text' then begin Editor.Perform(WM_VSCROLL, SB_LINEDOWN, 0); ParserLbl.Caption := '1'; end ParserLbl.Caption := '0'; else if Editor.Lines[I] = 'caption' then begin Editor.Perform(WM_VSCROLL, SB_LINEDOWN, 0); ParserLbl.Caption := '1'; end; if parserlbl.Caption = '1' then begin wertlbl.Caption := Editor.Lines[I]; end end; |
Hiermit soll jetzt erreicht werden, dass z.B. das Wort "text" gelesen wird, wobei einem anderen Label die Nummer "1" gegeben wird, falls "text" richtig geschrieben worden ist. Hinterher soll das Label gleich wieder die Zahl "0" bekommen und falls "caption" richtig geschrieben worden ist, wird dem Label gleich wieder die Zahl "1" gegeben.
Nach meiner Art und Weise funktioniert es aber nicht.
ALF - Sa 19.06.10 14:07
Einen Parser in der Art, mh...
Aber 2 Fehler kann ich Dir nennen: aber so wird es besser sein
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for I := 0 to Editor.Lines.Count - 1 do begin ParserLbl.Caption := '0'; ..... ..... end; |
Dort wo Du es hast löschen!
Ich würde diesen Ansatz als Parser mal überdenken! :wink:
Schau dir mal den Link von
Hidden an
Gruss Alf
florida - Sa 19.06.10 14:25
Also, es soll kein richtiger Parser werden.
Er soll nur kontrollieren, ob "text" z.B. richtig geschrieben worden ist. Erst wenn es der Fall ist, erscheint die "1" und es wird weiter gesprungen. In diesem Fall zu "caption".
Und Fehler- oder Warnmeldungen gab es keine.
ALF - Sa 19.06.10 14:32
Du weist aber, das dies nur funktioniert, wenn nur ein Wort/Zeile ist. Sollten mehrere Wörter in eine Zeile stehen, geht das vergleichen so nicht!
Gruss Alf
florida - Sa 19.06.10 14:37
Ich mache es ja auch nur mit einem Wort.
Flamefire - Sa 19.06.10 14:48
Was willst du denn genau machen?
Aus deinen Aussagen ist das nicht klar verständlich und auch nicht, warum du unbedingt durch das memo scrollen musst. Genausowenig, warum du eine Caption setzt, die ständig geändert wird.
Was soll wann passieren?
Und warum missachtest du Compiler fehler? die sagen doch schon, was da falsch ist.
Hidden - Sa 19.06.10 15:11
ALF hat folgendes geschrieben : |
| Du weist aber, das dies nur funktioniert, wenn nur ein Wort/Zeile ist. Sollten mehrere Wörter in eine Zeile stehen, geht das vergleichen so nicht |
florida hat folgendes geschrieben : |
| Ich mache es ja auch nur mit einem Wort. |
Abhilfe schafft wie gesagt der
Scanner aus dem Link oben: Der Frisst einen Text als ganzes, und wirft dem Parser dann einzeln die Schlüsselwörter zu. Kein so schlechtes Konzept, wie ich eigentlich finde. :gruebel:
lg,
ALF - Sa 19.06.10 15:20
Hidden :zustimm:
solang
florida aber nicht kongret sagt, was er so im einzelnem machen will bzw. was sein Prog vielleicht machen soll, sehe ich dies als Lerneffekt für ihn an. Obwohl es ja auch hier die Suche bzw. die F1 Taste in Delphi gibt! :wink:
Gruss Alf
florida - Sa 19.06.10 15:20
Ja, aber beim Parser usw. gibt es dann Dateien wie errors.pas,..., die nirgendswo auffindbar sind.
Flamefire - Sa 19.06.10 15:22
Copy&Paste schadet.
Gehirn einschalten, Klar machen, was man will, eigenes machen, Fehlermeldungen lesen und verstehen, Fehler finden, Fehler beheben. Fertig.
Hidden - Sa 19.06.10 15:28
Hi :)
Grundsätzlich, muss ich da
Flamefire zustimmen. Um den Parser einfach mal in Aktion zu sehen, könnte es aber nicht schaden, wenn die Dateien da wären.
Ich nehme mal an, dass sie eventuell deshalb absichtlich entfernt wurden :P
Hast du verstanden, wie der Scanner funktioniert? Wenn du keinen ganzen Parser bauen willst, kannst du ja einfach mal das Konzept des Scanners übernehmen :)
lg,
Flamefire - Sa 19.06.10 15:46
Die Dateien sind da...Man müsste nur mal zum Download runterscrollen.
Aber wer Compilerfehler komplett ignoriert (oder es für unnötig hällt sie hier zu erwähnen)...
ALF - Sa 19.06.10 16:33
Flamefire hat folgendes geschrieben : |
| Aber wer Compilerfehler komplett ignoriert (oder es für unnötig hällt sie hier zu erwähnen)... |
Bis dato hat er ja keine gehabt :wink:
Nur sein Konzept ist etwas mh... :gruebel: würde ich sagen.
Solange er aber nichts dazu sagt, kann man ja nur auf sein code eingehen und die logischen Fehler aufzeigen oder ihm eine Zeile geben wie es besser gehen könnte!
Gruss Alf
Flamefire - Sa 19.06.10 16:42
ALF hat folgendes geschrieben : |
Flamefire hat folgendes geschrieben : | | Aber wer Compilerfehler komplett ignoriert (oder es für unnötig hällt sie hier zu erwähnen)... | Bis dato hat er ja keine gehabt :wink:
|
Falsch: Sein Code aus dem Eröffnungspost compiliert nichtmacht. Fehler in Z.8
Und wie du merkst: Kein Wort davon
ALF - Sa 19.06.10 16:55
Vielleicht kopierfehler :mrgreen:
Ansonsten richtig
Flamefire
Gruss ALf
F34r0fTh3D4rk - Sa 19.06.10 17:35
Wenn du '1' ins Label schreibst und danach sofort wieder '0', wirst du niemals sehen, ob da jemals eine 1 gestanden hat. Das Label würde de facto die ganze Zeit eine 0 anzeigen.
florida - So 20.06.10 07:26
| Zitat: |
Wenn du '1' ins Label schreibst und danach sofort wieder '0', wirst du niemals sehen, ob da jemals eine 1 gestanden hat. Das Label würde de facto die ganze Zeit eine 0 anzeigen.
|
Ja, aber das ist ja meine Frage. Wie kann ich das eben schaffen, dass nicht gleich wieder die 0 kommt.
jaenicke - So 20.06.10 09:06
Wenn du die einzelnen Fundstellen durchgehen willst um vom Benutzer gesehen zu werden, dann bringt dir eine Schleife nichts, die einfach stupide alle Fundstellen durchgeht. Denn du willst ja immer nur die nächste Fundstelle anspringen.
Dementsprechend reicht es auch, wenn du dir jeweils die aktuelle Zeile merkst und bei dem entsprechenden Befehl vom Benutzer weitersuchst bis zur nächsten Fundstelle.
ALF - So 20.06.10 11:12
Hi,
florida verstehe doch bitte mal richtig. Das was dein Prog eigentlich mal machen soll, hast Du ja noch nicht gesagt. Nun versuchen wir Dir sinnvoll zu helfen, können aber nicht nachvollziehen was Du eigentlich machen willst.
1. Was sol in Dein Memo irgenwann eingelesen werden?
1a. eine Textdatei oder ein Script
1b. oder soll da schon alles drinstehen was durchsucht werden soll? also fertige Vorgabe, alphabetisch sortiert!
2. Soll der User nun in einem Editfeld was eingeben
2a. damit es überprüft wird ob er es richtig geschrieben hat bzw. ob es vorhanden ist, auch Gross/Kleinschreibung?
2b. soll der user darüber informiert werden wenn vorhanden (also richtig), was soll dann passieren
2c. nicht vorhanden oder falsche Eingabe, was soll dann passieren
3. Was ist evtl das Ergebnis des ganzen?
Verstehe dies bitte nicht falsch!
Nur so können wir auch sinnvoll helfen wenn man wenigstens weiss um was es an
dieser Stelle geht!
Gruss Alf
F34r0fTh3D4rk - So 20.06.10 12:36
florida hat folgendes geschrieben : |
| Zitat: |
Wenn du '1' ins Label schreibst und danach sofort wieder '0', wirst du niemals sehen, ob da jemals eine 1 gestanden hat. Das Label würde de facto die ganze Zeit eine 0 anzeigen.
|
Ja, aber das ist ja meine Frage. Wie kann ich das eben schaffen, dass nicht gleich wieder die 0 kommt. |
Probier mal nach jedem setzen der Caption:
Delphi-Quelltext
1: 2:
| sleep(1000); Application.ProcessMessages(); |
Das ist zwar keine elegante Lösung, aber sicherlich die, die dir am ehesten zum Erfolg verhilft.
Hidden - So 20.06.10 12:53
Hi :)
Ich glaube nicht, dass es hilft, das falsche Konzept komplizierter zu machen :gruebel: Da muss einfach noch ein else mit rein, oder
florida mal in Umgangssprache angeben, was der Code tun soll.
lg,
florida - Mo 21.06.10 10:08
Delphi-Quelltext
1: 2:
| sleep(1000); Application.ProcessMessages(); |
Dies hilft zwar leider auch nichts, aber ich werde heute Nachmittag mal mit meinem Vati überlegen, wie ich dies in Angriff nehmen könnte.
Hinterher werde ich euch Auskunft geben, falls eine Methode in Sicht ist. :wink:
florida - Di 22.06.10 17:06
Ich würde denken, dass es auch mit meiner Methode funktionieren könnte. Nur die Praxis macht wieder mal Probleme.
Nochmal zum Mitschreiben: :wink:
Wenn das Programm mitbekommt, dass der erste Befehl richtig eingegeben wurden ist, dann muss bei ParserLbl eine "1" erscheinen, aber wenn der erste Befehl falsch geschrieben worden ist, dann muss bei ParserLbl eine "0" stehen. So muss es dann alle weiteren Befehle ebenfalls korrigieren.
ALF - Di 22.06.10 17:37
Dein Ansatz dafür ist Falsch!
Du wirst doch nicht etwa alle zu suchenen Strings, so wie in Dein Beispiel reinschreiben, und dann Permanent mit if gefunden setzte label auf 1, und weiter unten dann die Ausgabe, if label =1 dann gebe Zeile aus machen!
Setzte Deine Ausgabe 'if gefunden dann gib Zeile aus' gleich richtig, dann erspartst Du dir das andere!
Und Schau mal in der DH bei 'if else' rein, wie man es richtig umsetzt!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| if suchstring = string then begin .... .... end else if anderer_suchstring = string then begin .......... end else begin ..... end |
das sind aber nur 2 Suchstrings! Weist Du wie es aussieht, wenn Du 10 oder mehr suchen willst!
kannst Du kaum noch überblicken!
Darum auch meine Frage über Dein Prog, weiter oben, auf das Du leider nicht geantwortet hast für eine bessere Lösung!
Gruss Alf
Jakob_Ullmann - Di 22.06.10 18:20
Hidden hat folgendes geschrieben : |
| PS: Skriptsprache bin ich auch gerade dran, Parser kommt nächste Woche oder so. :D |
Hey, ich auch. :wink:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!