如何正确地形式化GNU/Linux命令的命令行用法?

Fra*_*rco 7 grammar bnf

我想写一个类似BNF的正式语法来描述一些GNU/Linux工具的命令行用法.例如,我可以将cat命令的用法描述为:

(cat-command) : 'cat' (arguments-list)
(arguments-list) : (argument)
(arguments-list) : (arguments-list) (argument)
(argument) : (file)
Run Code Online (Sandbox Code Playgroud)

问题是我无法为某些命令写下精确的语法,例如md5sum.我的第一次尝试是:

(md5sum-command) : 'md5sum' (arguments-list)
(arguments-list) : (argument)
(arguments-list) : (arguments-list) (argument)
(argument) : (file)
(argument) : '--check'
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,这个语法允许您--check根据需要多次指定参数,这是不正确的,因为您最多应该使用它一次.

我该如何解决这个问题?另外,为了更好地处理这类问题,我应该研究什么样的正式语法?

Dar*_*mas 4

你可以尝试这样的事情:

(md5sum-command) : 'md5sum' (arguments-list)
(arguments-list) : (file-arguments) | '--check' (file-arguments)
(file-arguments) : (file) (file-arguments)
Run Code Online (Sandbox Code Playgroud)

假设您希望能够--check为每个命令指定一个,但不依赖它作为第一个参数,您可以使用:

(md5sum-command) : 'md5sum' (arguments-list)
(arguments-list) : (file-arguments) | (file-arguments) '--check' (file-arguments)
(file-arguments) : (file) (file-arguments)
Run Code Online (Sandbox Code Playgroud)

另请注意,竖线 ( |) 符号只是附加规则的快捷方式。以下是等效的:

(md5sum-command) : 'md5sum' (arguments-list)
(arguments-list) : (file-arguments) 
(arguments-list) : (file-arguments) '--check' (file-arguments)
(file-arguments) : (file) (file-arguments)
Run Code Online (Sandbox Code Playgroud)

如果您不能使用上下文无关语法(如 BNF 中表达的语法)来指定大多数 UNIX 命令,我会感到惊讶。