Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fremde Syntax überpüfen (Parser ?) (https://www.delphipraxis.net/158569-fremde-syntax-ueberpuefen-parser.html)

RWarnecke 22. Feb 2011 16:42

Fremde Syntax überpüfen (Parser ?)
 
Hallo zusammen,

ich muss in einem Programm eine fremde Syntax überprüfen. Ich habe dazu keinerlei fremdes Werkzeug was ich dazu nutzen könnte. Ich habe zum Beispiel den folgenden Befehl :
Code:
Befehl1 'test.exe' 'parameter' /Param1 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
Befehl1 'test.exe' 'parameter' /Param9 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
Befehl1 'test.exe' 'parameter' /Param10 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
Befehl1 'test.exe' 'parameter' /Param11 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
In dieser Syntax ist Param1, Param9, Param10, Param11 in einer ODER-Verknüpfung und Param7 ist in Abhängigkeit von Param6. Param2 bis Param8 sind optional. Die Mindestanforderung sind nur Param1 oder Param9 oder Param10 oder Param11.

Es gibt noch mehrere solcher Befehle. Meine Frage ist jetzt, wie kann ich am besten die Syntax überprüfen ? Ich habe dabei schon an einen Parser gedacht, nur leider verstehe ich das Prinzip nicht wie ein Parser arbeitet und wie ich diesen in mein Programm einpflegen kann. Vielleicht kann mir das ja auch jemand anhand diesem Beispiel erklären.

Links zu Tutorials und/oder Beispiele sind jederzeit willkommen ;-)

Edit: Das Leerzeichen bei Befehl 1 entfernt.

Aphton 22. Feb 2011 16:45

AW: Fremde Syntax überpüfen (Parser ?)
 
Beispiele von deiner Seite sind auch jederzeit willkommen =)
(das Ganze ist ein bisschen zu trocken!)

RWarnecke 22. Feb 2011 16:53

AW: Fremde Syntax überpüfen (Parser ?)
 
Zitat:

Zitat von Aphton (Beitrag 1083574)
Beispiele von deiner Seite sind auch jederzeit willkommen =)
(das Ganze ist ein bisschen zu trocken!)

Wieso zu trocken ?

shmia 22. Feb 2011 17:15

AW: Fremde Syntax überpüfen (Parser ?)
 
Zitat:

Zitat von RWarnecke (Beitrag 1083571)
ich muss in einem Programm eine fremde Syntax überprüfen

Was bedeutet Syntax überprüfen?
Es geht irgendwie um Übergabeparameter eines Programms namens "test.exe"; das ist soweit klar, aber alles andere ist Unklar. :glaskugel:
Bist du im Besitz des Sourcecode von "test.exe"?
Soll die Prüfung durch einen automatischen Test erfolgen oder soll die Prüfung manuell stattfinden?
Suchst du nach einem Algorithmus, der alle möglichen Kombinationen von Übergabeparametern liefert?

Assarbad 22. Feb 2011 17:17

AW: Fremde Syntax überpüfen (Parser ?)
 
@Rolf: genaugenommen möchtest du also nicht eine syntaktische (Regeln) Prüfung vornehmen, sondern eine semantische (Bedeutung), oder sehe ich das falsch?

RWarnecke 22. Feb 2011 17:32

AW: Fremde Syntax überpüfen (Parser ?)
 
Zitat:

Zitat von shmia (Beitrag 1083594)
Was bedeutet Syntax überprüfen?

Ob die Parameter Param1 bis Param11 richtig angewendet werden oder nicht.
Zitat:

Zitat von shmia (Beitrag 1083594)
Soll die Prüfung durch einen automatischen Test erfolgen oder soll die Prüfung manuell stattfinden?

Macht das einen Unterschied, ob automatisch oder manuell ?
Zitat:

Zitat von shmia (Beitrag 1083594)
Suchst du nach einem Algorithmus, der alle möglichen Kombinationen von Übergabeparametern liefert?

Nicht liefert sondern überpüft.
Zitat:

Zitat von Assarbad (Beitrag 1083596)
@Rolf: genaugenommen möchtest du also nicht eine syntaktische (Regeln) Prüfung vornehmen, sondern eine semantische (Bedeutung), oder sehe ich das falsch?

Ich möchte schon eine syntaktische Prüfung, da ja der Param7 nur dann benutzt werden darf, wenn Param6 auch im Befehl mit drinsteht. Steht Param6 nicht mit in der Zeile, so muss später Param7 als Fehler angezeigt werden. Das ist mein Ziel.

Edit:
richtiger Befehl :
Code:
Befehl1 'test.exe' 'parameter' /Param1 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
falsche Befehle mit Erklärung :
Code:
Befehl1 'test.exe' 'parameter' /Param1 /Param2 /Param3 /Param4 /Param5 /Param7 /Param8
Bei diesem Beispiel muss Param7 markiert werden, da dieser Parameter von Param6 abhängig ist.

Code:
Befehl1 'test.exe' 'parameter' /Param1 /Param9 /Param2 /Param3 /Param4 /Param5 /Param6 /Param7 /Param8
Bei diesem Beispiel muss Param9 markiert werden, da nur Param1 oder Param9 oder Param10 oder Param11 benutzt werden dürfen.

Assarbad 22. Feb 2011 17:40

AW: Fremde Syntax überpüfen (Parser ?)
 
Zitat:

Zitat von RWarnecke (Beitrag 1083602)
Ich möchte schon eine syntaktische Prüfung, da ja der Param7 nur dann benutzt werden darf, wenn Param6 auch im Befehl mit drinsteht. Steht Param6 nicht mit in der Zeile, so muss später Param7 als Fehler angezeigt werden. Das ist mein Ziel.

Okay, ich versuche es mal kurz zu formulieren. Syntax wäre in natürlichen Sprachen die Grammatik und Rechtschreibung, während Semantik die Bedeutung und Zusammenhänge beleuchtet (bspw. Ausdruck und Inhalt auf eigener Ebene ohne Betrachtung der Rechtschreibung oder Grammatik). Obwohl, wenn ich es mir nochmal so anschaue könnte man das auch komplett auf Ebene der Grammatik (also Syntax) formulieren (abhängig vom benutzten Ansatz). Also nix für ungut :zwinker:

Die Klarstellung war auch nur dazu gedacht daß du deine Gedanken in einer Websuche formulieren kannst. Ich habe mir schon viele Male nen Wolf gesucht, nur weil ich den exakten Fachbegriff für etwas nicht kannte ... (mit Begriff war es eine Sache von Sekunden).

Nachtrag: Tokenizer und Parser könnten hier durchaus funktionieren, wenn du diesen Aufwand nicht scheust. Mir ist so als gab es da mal ein entsprechendes Programm von Mike Lischke.

shmia 22. Feb 2011 18:01

AW: Fremde Syntax überpüfen (Parser ?)
 
Ich weiss nicht...so ein Parser ist doch schon Overkill.
Das Vorhandensein von Parameter 1 bis 11 lässt sich leicht als Boolean-Array abbilden.
Und die verbalen Regeln lassen sich über if-Bedingungen formulieren.

Delphi-Quellcode:
type
  TParamExists = array[1..11] of Boolean;

procedure CheckParams(param : TParamExists);
var
  c : integer;
begin
  c := 0;
  if param[1] then Inc(c);
  if param[9] then Inc(c);
  if param[10] then Inc(c);
  if param[11] then Inc(c);


  // Prüfe Mindestanforderung
  if c = 0 then
    raise EParam.Create('Es muss mindestens einer der Parameter 1,9, 10 oder 11 angegeben werden')
  else if c > 1 then
    raise EParam.Create('Parameter 1,9, 10 und 11 dürfen nicht gemeinsam verwendet werden')


  if param[7] and not param[6] then
    raise EParam.Create('Verwendung von Parmeter 7 nur möglich, wenn auch Parameter 6 vorhanden ist');

   


  // hier weitere Regeln
  ...
end;

RWarnecke 22. Feb 2011 18:07

AW: Fremde Syntax überpüfen (Parser ?)
 
Hallo Andreas,

das wäre eine Variante, nur was mache ich mit den anderen Befehlen ? Ich habe ja nicht nur den einen sondern mehrere, wäre da vielleicht doch ein Parser besser ?


------------------------------------------------


Hallo Oliver,

ich habe zum Anfang nur nach Syntaxcheck oder Syntax Überprüfung gesucht und bin auf Umwegen zu dem Begriff Parser gelangt. Brauche ich denn ein extra Programm um einen Parser in mein Programm zu implementieren ?

Assarbad 22. Feb 2011 19:23

AW: Fremde Syntax überpüfen (Parser ?)
 
Hallo Rolf,

Zitat:

Zitat von RWarnecke (Beitrag 1083620)
ich habe zum Anfang nur nach Syntaxcheck oder Syntax Überprüfung gesucht und bin auf Umwegen zu dem Begriff Parser gelangt. Brauche ich denn ein extra Programm um einen Parser in mein Programm zu implementieren ?

nein, braucht man nicht generell. Aber es gibt sogenannte Parser-Generatoren. Die erlauben dir die Regeln deiner Grammatik in einer lesbareren Form zu formulieren (bspw. BNF, EBNF) und die Eingabe in Token zu zerlegen. Ein Klassiker ist hier flex.

Du kannst einen Parser aber allemal händisch implementieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz