Du bist nicht angemeldet.

Werbeanzeige

1

03.10.2018, 16:53

CLI Framework

Hallo Leute,

ich habe ein Anliegen bei welchem ich momentan auf dem Schlauch stehe und eure Hilfe brauche.
Ich möchte ein CLI Framework erstellen, welches mir wie man schon vermuten kann beim erstellen von CLI Anwendungen helfen soll.
Eine Aufgabe des Framework besteht dabei aus folgendem: Die CLI Argumente parsen (momentan richte ich mich da nach der GNU Command Line Format Reference).
(Ja es gibt schon genug Command Line Parser, jedoch interessiert mich das Thema sehr weswegen ich selbst mein Glück versuchen möchte).

Wie liegen die Daten vor und welche Technologie benutze ich?
Programmiersprache: Javascript
Runtime: NodeJS
Datenformat: ['CommandLineArgument1','CommandLineArgument2','CommandLineArgument3',...]
Bsp. platzhalter copy --file1 C:\Location1\ --file2 C:\Location2\ => ['copy','--file1','C:\Location1\', '--file2', 'C:\Location2\']
Die Command Line Argumente werden mir in NodeJS über process.argv schon im oben genannten Format bereitgestellt.

Was kann mein Parser bis jetzt?
- Sub Commands erkennen,
- Long Options erkennen (--help),
- Short Options erkennen (-v),
- Werte den Optionen zuweisen

Was kann er nicht
- Werte erkennen die z.B ein Whitespace enthalten und dementsprechend in Double Quotes eingeschlossen werden
- Wenn man Short Options zusammenfasst (-hv) prüfen ob danach ein Wert folgt und diesem der letzten Short Option zuweisen
- Verschachtelte Optionen erkennen
- Mehere Subcommands welche über && verknüpft sind ausführen

Wie funktioniert mein Algorithmus momentan

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1.Übergabe von Argumenten Array an Funktion
2.Überprüfe ob erstes Argument ein Sub Command 
 2.1 Wenn ja erzeuge commands Property im CLIArgument Object und Setze das Sub Command als Wert. Weiter mit 3.
 2.2 Wenn nein Fehler werfen
Schleife
3.1 Aktuelles Argument Long Option?
 3.1.1 Wenn ja prüfe die nächsten Argumente und erstelle im CLIArgument Object das Argument als Property.
  3.1.1.1 Füge Argumente dem Long Option Array hinzu, solange Argumente keine Long Option oder Short Option (hier wird dann eben alles als "Wert" für diese Option genommen)
  3.1.1.2 Wenn das Long Option Array Einträge hat, füge diese der Object Property welche ich oben gesetzt habe als Wert hinzu. Setze das Long Option Array wieder auf 0 ([]);
 3.1.2 Wenn nein weiter mit 3.2
3.2 Aktuelles Argument Short Option?
 3.2.1 Wenn ja entferne das '-', zerlege den Strings in die einzelnen Optionen
  3.2.1.1 Füge die einzelnen Optionen dem CLIArgument Object als Property hinzu und setze die Werte jeweils auf true.
 3.2.2 Wenn nein, weiter mit 4.
4. Alles was nicht erkannt wird: Erzeuge im CLIArgument Object eine "UnknownOptions" wenn noch nicht vorhanden.
 4.1 Füge alle nicht erkannten Argumente in das Array "Unknown Option"
  4.1.1 Am Ende füge der CLIArgument Property "UnknowOptions" das Array als Wert hinzu.

Das CLIArgument Object könnte so aussehen:

{
 commands: ['copy'] 
 --help: ['Wert1', 'Wert2'],
 -h: ['Wert1', 'Wert2'],
 -v: ['Wert1', 'Wert2'],
 UnknownOptions: ['Trash1','Trash2']
}


Wo liegt mein Problem
Zum einen sieht meine Codebase extrem sch*** aus, da ich momentan alles mit if else Statements zugeklatscht habe.
Würde ich jetzt noch die restlichen Features einpflegen, würde das wohl in einem extremen If Else Chaos enden.
Kurzum ich habe momentan gar keine Ahnung wie ich so einen "Parser" sinnvoll angehe um später auch in Punkto Erweiterbarkeit wenig Probleme zu bekommen bzw. wie ich den Code strukturieren muss.

Könnt Ihr mir ein paar Tips geben wie ich an die Sache rangehen soll?
Habt ihr eventuell ein paar gute Seiten in denen die ganze Thematik gut und verständlich erklärt wird (Welche Algorithmen oder was für Techniken man auch für "komplexere" Parser benutzen kann?)

Würde mich über jede Hilfe freuen die ich bekomme.

Vielen Dank für eure Zeit!