7

いくつかの GNU/Linux ツールのコマンド ラインの使用法を説明するために、BNF のような正式な文法を書き留めたいと思います。たとえば、catコマンドの使用法を次のように説明できます。

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

問題は、 などの一部のコマンドの正確な文法を書き留めることができないことmd5sumです。それに対する私の最初の試みは次のとおりです。

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

--checkしかし、ご覧のとおり、この文法では引数を何度でも指定できます。これは、多くても 1 回しか使用できないため、正しくありません。

どうすれば修正できますか?また、この種の問題をより適切に処理するには、どのような形式文法を勉強すればよいでしょうか?

4

2 に答える 2

4

次のようなものを試すことができます:

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

コマンドごとに1つだけ指定できるようにしたいが--check、それが最初の引数であることに依存しないと仮定すると、次を使用できます。

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

|また、パイプ ( ) 記号は、追加ルールのショートカットに過ぎないことにも注意してください。以下は同等です。

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

BNF で表現されているような文脈自由文法を使用してほとんどの UNIX コマンドを指定できなかったとしたら、私は驚くでしょう。

于 2010-04-08T12:16:53.763 に答える
-1

期待されたものではありませんが、おそらく答えを見つけました。正しいコマンドを生成する代わりに、コマンドの正確性を認識することを選択できます。いくつかのハイブリッド言語を使用して、次の一連の要件を記述できます。

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

正しいコマンドを生成する方法が存在するかどうか知りたいので、この回答を正しいものとしてマークしません。

于 2010-04-09T14:43:15.860 に答える