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.


Hidden - Sa 19.06.10 14:00

Hallo,

Ein bisschen präziser, bitte: Was passiert denn statt dessen? Wird der Code erfolgreich compilliert, oder gibt es Compiler-Fehler oder Warnungen?

Wenn ich auf den Titel antworten sollte, würde ich das mit diesem Link tun: Skriptsprachen-Tutorial auf delphigl.com [http://wiki.delphigl.com/index.php/Tutorial_Scriptsprachen_Teil_1]. Den Aufbau des Parsers kannst du vermutlich von dort übernehmen. :)

lg,

PS: Skriptsprache bin ich auch gerade dran, Parser kommt nächste Woche oder so. :D


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 user profile iconHidden 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

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconflorida hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconHidden :zustimm:
solang user profile iconflorida 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 user profile iconFlamefire 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

user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFlamefire hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconFlamefire
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.


JonS - So 20.06.10 11:02

Die Script-Sprache von DelphiGL als Download: Link [http://files.delphigl.com/new/tut_scriptlang.zip]

wfg Jon S.


ALF - So 20.06.10 11:12

Hi, user profile iconflorida 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

user profile iconflorida hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconflorida 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
.... //mache was 
....
end
else
if anderer_suchstring = string then
begin
.....//mache was
.....
end
else
begin
..... //nichts gefunden
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

user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:
PS: Skriptsprache bin ich auch gerade dran, Parser kommt nächste Woche oder so. :D


Hey, ich auch. :wink: