gpt4 book ai didi

Java - 如何实现应用程序控制台解析器

转载 作者:行者123 更新时间:2023-12-02 04:35:15 25 4
gpt4 key购买 nike

所以我正在尝试编写一个具有程序内控制台界面的应用程序(即,您不必每次都使用不同的命令从控制台运行程序),并且我想要一个解析器对象解析来自用户的命令/选项。结构与此类似 -

ArrayList<String> example = new ArrayList<>(); 

/* PARSING */
ConsoleParser parser = new ConsoleParser();

Scanner input = new Scanner(System.in);
String parserArgs = input.nextLine();

while (parserArgs != "quit")
{
execute(parser.parse(parserArgs));
parserArgs = input.nextLine();
}

因此,我们的想法是拥有一个控制台(在应用程序内),我可以在其中键入“add x”或“contains x”等命令,然后将其分配给“parserArgs”。然后命令字符串将被传递到 ConsoleParser,在那里它将被解析并搜索有效命令。如果命令有效(并且具有必要的选项/参数),ConsoleParser 的 parse() 方法将以某种方式将方法(或方法名称)以及方法所需的任何参数返回到 main。因此,如果我想将字符串“foo”添加到我的ArrayList中,那么我可以在控制台输入“add foo”,它将被传递到解析器,然后解析器将返回到 main 某种指令,add()需要使用参数“foo”在“example”上调用 ArrayList 的方法。我知道这可以使用数组列表轻松完成,但为了简单起见,我只是在这里使用它。

最佳答案

从你的问题来看,我不确定你想要一个简单的解决方案还是一个优雅的解决方案。这是一个优雅的解决方案的草图。

您定义一个功能接口(interface),即只有一个方法的接口(interface),由您的解析器返回。

喜欢:

// I the Input type
// R the result type
public interface Fn<I,R> {

R apply (I input);
}

第二个输入仅提供执行方法

public interface Cmd<R> {

R execute ();
}

您定义控制台命令

public class CliCommand<A> {
// constructor
public CliCommand(final String name, final Fn<String, A> parseFunct)
{
// TODO
}
}

// the parse function
public A parse(String arg) throws CliParseException {
// TODO
}
}

添加命令

 public class Add implements Cmd<Integer> { 
public Add(Integer i) {
}

}

以及添加的解析函数

 public class ParseAdd implements Fn<String, Cmd<Integer>> { 
public Cmd<Integer> apply(String option) {
// parse the input and return the command with the arguments in there
// if (option == "add" and args exist )
// try parse args
// i = Integer.parse(substring);

return new Add(i);
}
}

然后是 ConsoleParser

public class ConsoleParser<A> {
public static <A> ConsoleParser<A> cli(CliCommand <A> command) {
...
}
public ConsoleParser <A> or (CliCommand <A> command) {
...
}

public A parse(String arg) throws CliParseException {
//
}

}

之后你的程序可以这样写

ConsoleParser<Cmd<Object>> parser = cli("add",new ParseAdd()) 
.or(...)
.or("quit", new ParseQuit();

Scanner input = new Scanner(System.in);
String parserArgs = input.nextLine();

while (true)
{
try {
parser.parse(parserArgs).execute();
} catch (CliParseException e) {
// handle it somehow
}
parserArgs = input.nextLine();
}

在这个示例中,Add 太简单了,我认为您实际上想要将字符串添加到一个列表或两个数字中,因此实际的 ParseAdd 方法需要一些上下文(如已经存在的列表),如我的简单示例中所示。

关于Java - 如何实现应用程序控制台解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com