2016-07-01 22 views
0

Ich schreibe eine Konsolenanwendung in C++ und ich brauche Benutzer shell-like-Befehlssystem, um Optionen in Anwendungen zu konfigurieren. Zum Beispiel, Benutzer so etwas schreiben könnte:Wie analysiert man den Befehlsbaum in C++?

RegisterName

Verbindungoffen[telnet | SSH]

VerbindungSchaltertelnet

sendenText

VerbindungSchalterSSH

Text

... und so weiter ...


Also, offensichtlich haben wir einige Befehlsbäume, in wir haben obiges Beispiel senden:

--register 
| 
--connetion 
|   |--open 
|   |--switch 
| 
--send 

Jeder Befehl kann eine unterschiedliche Anzahl von Parametern haben.


FRAGE:

  • Wie solche Befehlsstruktur analysieren?

Jetzt parse ich es mit regulären Ausdrücken, aber diese Lösung ist wirklich hässlich. Ich habe über YACC und LEX gelesen, aber ich bin mir nicht sicher, ob das wirklich eine gute Idee ist.

Gibt es einen weit verbreiteten Ansatz zur Syntaxanalyse von Befehlsstrukturen? Ich bin nicht cool in der Theorie der lexikalischen Analyse, also würde ich mich freuen, wenn Sie nicht auf akademische Weise antworten.

+0

Vorschlag: eine Zustandsmaschine verwenden, die einen (Staat, char) hat -> (Zustand, optional >) Übergangsfunktion. – lorro

Antwort

0

This ist eine gute Ressource mit ein paar Optionen, wenn Sie die GNU C-Bibliothek verwenden können.

Am Ende werden Sie jedes arg wechseln müssen und Sie müssen möglicherweise einige Status für Ihre verschachtelten Befehle verfolgen.

mit Ihrem Beispiel arg Baum:

switch (arg) 
{ 
    case "register": 
    { 
     register = 1; 
     break; 
    } 
    case "connection": 
    { 
     connection = 1; 
     break; 
    } 
    case "open": 
    { 
     if (previousCommand == "connection") 
      connectionOpen = 1; 
     else 
      //error 
     break; 
    } 
    case "switch": 
    { 
     if (previousCommand == "connection") 
      connectionSwitch = 1; 
     else 
      //error 
     break; 
    } 
    case "send": 
    { 
     send = 1; 
     break; 
    } 
    previousCommand = arg; 
} 
+2

Ich bin mir ziemlich sicher, dass Sie keine Zeichenfolgen für Case-Anweisungen verwenden können. – Galik

+0

Vielen Dank für Ihre Antwort, aber ich denke, es ist keine so gute Idee, für jeden Befehl Zustände zu verwenden. Vor allem, wenn der Command Tree ziemlich groß ist. –

+0

@Galik, natürlich können wir nicht. Aber es ist kein so großes Problem, Strings in eindeutige Enum-Werte zu konvertieren. –