Я хотел бы написать формальную грамматику, подобную BNF, для описания использования командной строки некоторых инструментов GNU/Linux. Например, я могу описать использование команды 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
столько раз, сколько вы пожелаете, что неверно, поскольку вы должны использовать его не более одного раза.
Как я могу это исправить? Кроме того, какие формальные грамматики мне следует изучить, чтобы лучше справляться с такого рода проблемами?