Разобрать строку, как если бы это была команда с параметрами и параметрами - PullRequest
3 голосов
/ 07 сентября 2010

У меня есть перечисление Java:

public enum Commands
{
    RESIZE_WINDOW("size -size"),
    CREATE_CHARACTER("create-char -name"),
    NEW_SCENE("scene -image"),
    DIALOG("d -who -words"),
    PLAY_SOUND("sound -file --blocking=false"),
    FADE_TO("fade-to -file"),
    WAIT("w -length=auto");
}

Я хочу иметь возможность проанализировать эти строки и извлечь:

  • имя команды (например, create-char)
  • обязательные параметры (например, -name)
  • необязательные опции со значением по умолчанию (например, --blocking=false)

Я посмотрел на org.apache.commons.cli, но, похоже, это не соответствует первому критерию (разные имена команд) и очень многословно.

Есть ли какие-нибудь предложения по библиотеке?

(Это будет использоваться для разбора скриптового «языка», если этот контекст поможет.)

Редактировать: Пример ввода на языке сценариев будет d John "Hello World" - текст из нескольких слов идет в кавычках.

1 Ответ

6 голосов
/ 08 сентября 2010

Похоже, что вы хотите создать множество команд CLI, основываясь просто на их «дескрипторах справки»; DSL сортов.Вместо этого разбора строки, рассмотрите возможность создания команд программно, для которых есть множество библиотек (CLI - только одна) и преимущества.

Ваш пример уже достаточно сложен, чтобы второй взгляд на CLI (или одиниз других) гарантируется.Вы показываете обязательные и необязательные аргументы, у каждого из которых нет ни значения, ни значения по умолчанию (хотя нет средств для указания «обязательных» значений arg без значения по умолчанию, описания команд и т. Д.), И вам все равно нужно создать анализатор для командной строки.сам, проверка, средства вызова обработчиков и т.д ...

Ниже приведен список парсеров команд, которые я нашел.Никто не будет анализировать ваш конкретный DSL, но он позволит вам создавать свои команды программно, анализировать их, часто проверять и предоставлять значимые предупреждения, помогать обрабатывать и т. Д. Некоторые даже используют аннотации на объектах для определения команд, теоретически облегчая обслуживание.

Большинство разработано (и показывают примеры) для анализа аргументов вашей программы, а не для многочисленных команд (исключение - natural-cli), но все должны быть в состоянии сделать это - простой класс может обернуть анализ и параметрывместе:

static class CommandLine {
    HashMap<String,Options> options = new HashMap<String,Options>();

    public void register(String cmd, Options opts) {
        options.put(cmd, opts);
    }

    public void parse(String line) {
        // a better parser here would handle quoted strings
        String[] split = line.split("\\s");

        String cmd = split[0];
        String[] args = new String[split.length-1];
        if (args.length > 0)
            System.arraycopy(split, 1, args, 0, args.length);

        Options opts = options.get(cmd);
        if (opts == null) 
            ; // handle unknown command
        else {
            opts.parse(args);
            // handle results...
            opts.reset(); // required?
        }
    }
}

public static void main(String[] args) throws Exception {

    CommandLine cl = new CommandLine();
    cl.register("size", new Options());        // This will vary based on library Some
    cl.register("create-char", new Options()); // require subclasses, others use builder
    //...                                         pattern, or other means.

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
        cl.parse(in.readLine());
    }
}

Другие библиотеки

  • CLI
  • JewelCli : такжеиспользует аннотации и допускает списки и перечисления для значений.примеры выглядят многообещающе
  • natural-cli : разрешает cli с "удобочитаемыми сообщениями".Кажется, что она направлена ​​на достижение нескольких команд и их параметров, включая другой DSL и синтаксис.
  • GNU Java Getopt : используется так же, как и выше, хотя вы инициализируете объект Getopt с помощьюимя команды.
  • JOpt Simple : утверждает "простота над всеми остальными"
  • JArgs
  • args4j: использует аннотации к отдельным классам, созданным для каждой команды
  • JSAP
  • CLAJR : использует отражение
  • CmdLn
  • ArgParser
  • JCommando : использует файлы конфигурации XML.
  • parse-cmd : использует построитель-шаблон и цепочку методов для построения параметров
  • cli-parser : на основе аннотаций
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...