2010-04-08 7 views
7

Ich möchte eine BNF-ähnliche formale Grammatik aufschreiben, um die Befehlszeilennutzung einiger GNU/Linux-Tools zu beschreiben. Zum Beispiel kann ich die Verwendung des cat Befehl als beschreiben:Wie formalisiert man die Befehlszeilennutzung von GNU/Linux-Befehlen?

(cat-command) : 'cat' (arguments-list) 
(arguments-list) : (argument) 
(arguments-list) : (arguments-list) (argument) 
(argument) : (file) 

Das Problem ist, ich keine genaue Grammatik für einige Befehle wie md5sum aufschreiben kann. Mein erster Versuch, das wäre der folgende:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (argument) 
(arguments-list) : (arguments-list) (argument) 
(argument) : (file) 
(argument) : '--check' 

Aber wie Sie diese Grammatik sehen können Sie das --check Argument so oft angeben, wie Sie wollen, was falsch ist, wie Sie es höchstens einmal verwendet werden soll .

Wie kann ich das beheben? Welche Art von formalen Grammatiken sollte ich studieren, um diese Art von Problemen besser behandeln zu können?

+1

Sind Sie sicher, dass Ihre Grammatik falsch ist? Viele der Unix-Befehle akzeptieren für mich durchaus mehrere Vorkommen desselben Arguments, zB 'ls -l -l -l'. –

+0

Ja, du hast Recht. Aber vielleicht gibt es einige Werkzeuge, die keine Wiederholungen zulassen. Ich kann auch mein eigenes Programm schreiben, das keine Wiederholungen erlaubt. Also ich denke mein Problem ist immer noch relevant. –

Antwort

4

Sie könnten versuchen, so etwas wie:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) | '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

Angenommen, Sie wollen genau ein --check pro Befehl können angeben, aber nicht davon abhängen das erste Argument zu sein, könnten Sie verwenden:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) | (file-arguments) '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

Beachten Sie auch, dass die Pipe (|) Symbol nur eine Abkürzung für eine zusätzliche Regel ist. Die folgenden entspricht:

(md5sum-command) : 'md5sum' (arguments-list) 
(arguments-list) : (file-arguments) 
(arguments-list) : (file-arguments) '--check' (file-arguments) 
(file-arguments) : (file) (file-arguments) 

Ich wäre überrascht, wenn Sie nicht die meisten Unix-Befehle mit einer kontextfreien Grammatik, wie sie in BNFs ausgedrückt angeben könnten.

+0

Ihre Version scheint zu funktionieren, aber es ist nicht allgemein genug. Beispielsweise müssen Sie das Argument '--check' nicht unmittelbar nach dem Argument 'md5sum' einfügen: Sie können viele Dateien vor und nach dem Argument angeben. –

+0

Nachdem ich Ihre neue Version gelesen hatte, konnte ich Folgendes notieren: (arguments-list): [(files-list)] [(mode-option)] [(files-list)] ['--check'] [(files-list)] (arguments-list): [(files-list)] ['--check'] [(files-list)] [(modus-option)] [(files-list)] (Modus-Option): '--binary' (Modus-Option): '--text' Ich konnte es nicht weiter abkürzen. Das Hinzufügen anderer Argumente wie "--quiet", "-warn" oder "-status" würde zu einer sehr langen Grammatik für solch einen einfachen Befehl führen. –

+0

Wahr. Sie möchten wahrscheinlich einen Unterschied zwischen Argumenten machen, die nur Flags sind (können irgendwo in der Argumentliste erscheinen, global agieren) und Argumenten, die auf die folgenden Dateien wirken. –

-1

Ich habe wahrscheinlich eine Antwort gefunden, obwohl es nicht die erwartete ist. Sie können wählen, die Korrektheit eines Befehls zu erkennen, anstatt korrekte Befehle zu generieren. einige Hybrid-Sprache verwenden, können Sie den folgenden Satz von Anforderungen schreiben:

argument(0) == "md5sum" 
forall i, if i != 0 then argument(i) == "--binary" or 
         argument(i) == "--text" or 
         argument(i) == "--check" or 
         argument(i) == "--status" or 
         argument(i) belongs to <file> 
0 <= instances("--binary") + instances("--text") <= 1 
0 <= instances("--check") <= 1 
if instances("--check") == 1 then 0 <= instances("--status") <= 1 

ich diese Antwort nicht als richtig darstellen wird, weil ich immer noch neugierig zu wissen, bin, ob es einen Weg, um existiert erzeugen korrekt Befehle.

Verwandte Themen