Грамматика для параметров командной строки Unix - PullRequest
4 голосов
/ 11 декабря 2010

Это домашнее задание. Я хотел бы написать простой парсер для параметров командной строки Unix.
Во-первых, я хотел бы определить грамматику с помощью BNF.

Options = Option | Options, space, Option;
Option = OptionName | OptionName, OptionArguments; 
OptionName = '--', any character excluding '-' | OptionName, any character;
OptionArguments = OptionArgument | OptionArguments, space, OptionArgument;
OptionArgument = any character excluding '-' | OptionArgument, any character;

(«любой символ» здесь - любой буквенно-цифровой символ).

Имеет ли это смысл? Следующий вопрос - как добавить «старые» опции Unix, которые начинаются с одного дефиса и могут быть сгруппированы (например, ls -lht)

1 Ответ

2 голосов
/ 12 апреля 2012

Просто обратите внимание, что данная грамматика довольно неоднозначна - например, если у вас есть несколько слов подряд, вы не будете знать, являются ли это разными опциями или опцией с некоторыми аргументами.

Что касается вашего второго вопроса (относительно «старого» unix), вы можете добавить другое правило к грамматике, что-то вроде:

option -> optionGroup | (anything that was there before);
optionGroup -> '-', flags;
flags -> flag | flag, flags;
flag -> single letter;
...