我将要开始编写一个演示程序,用于我即将要授课的课程。我希望让班上每个学生都可以下载此应用程序,并能够通过命令行交互式地创建对象实例(及其图形表示)。我决定使用Java来编写,不是因为它是我最熟悉的语言,而是因为它有易于使用的图形类,并且我可以相当确信该jar文件可以在他们的计算机上运行。
介绍完毕,现在问题来了:
如何为此程序实现一些自定义命令行语法?我想使用简单的任意语法,例如:
首先,我来谈谈当我想到这个问题时首先想到的是什么。我可以想象,我可以拥有一组树形链接的地图。我可以将每个关键字解析为下一个地图的关键字。因此,“CREATE Monster Bob” 可以像这样进行评估:
1) 搜索关键字地图以查找“CREATE”键。返回值,即类地图的引用。 2) 在类地图中搜索“Monster”键。返回值,即实现某个接口 Leaf 的工厂类,让我知道它是一个叶子值(我将使用 instanceof 进行检查)。 3) 可能 Leaf 接口将包含一个名为 execute() 的方法,该方法将执行它想要执行的任何操作。在这种情况下,它将创建一个 Monster 对象,并将此对象添加到名为 Bob 的 Objects 地图中。(这个 Leaf 业务听起来很丑陋,但它可以被整理干净。)
很酷。但这个语句对我来说有点难度: Bob.jump();
1) 搜索某些对象地图以查找“Bob”。返回实现具有类似于“evaluate(String s)”方法的接口的某个对象,并将字符串“jump()”传递给它。 2) Bob 在其内部方法映射中搜索“jump()”,然后...?在 C++ 中,我会将键作为指向成员函数 Monster.jump() 的指针,该函数将被执行。但我不认为在 java 中有这样的函数指针。我已经阅读过可以使用匿名类来实现这一点,尽管我还没有尝试。看起来它会起作用。
因此,这将起作用,但是否有更优雅的方法?我以前从未编写过任何类型的解释器。如果有人有一些技巧,我希望能够以好的方式做到这一点并在此过程中学习一些东西。如果我没有很好地结构化,特别是当 Bob 和每个其他对象开始解析自己的指令并使用匿名函数时,这似乎是一个潜在的容易出错的方法。此外,似乎每个类都需要除其正常代码之外的运行时准备接口。
此外,我对 Java 不是很了解,所以如果有一些问题可能会碰壁,那么我也想知道。
提前感谢您的帮助。
介绍完毕,现在问题来了:
如何为此程序实现一些自定义命令行语法?我想使用简单的任意语法,例如:
CREATE Monster Bob;
Bob.jump();
LS Bob //to list Bob's methods or something.
LS CREATE //to list all the classes
首先,我来谈谈当我想到这个问题时首先想到的是什么。我可以想象,我可以拥有一组树形链接的地图。我可以将每个关键字解析为下一个地图的关键字。因此,“CREATE Monster Bob” 可以像这样进行评估:
1) 搜索关键字地图以查找“CREATE”键。返回值,即类地图的引用。 2) 在类地图中搜索“Monster”键。返回值,即实现某个接口 Leaf 的工厂类,让我知道它是一个叶子值(我将使用 instanceof 进行检查)。 3) 可能 Leaf 接口将包含一个名为 execute() 的方法,该方法将执行它想要执行的任何操作。在这种情况下,它将创建一个 Monster 对象,并将此对象添加到名为 Bob 的 Objects 地图中。(这个 Leaf 业务听起来很丑陋,但它可以被整理干净。)
很酷。但这个语句对我来说有点难度: Bob.jump();
1) 搜索某些对象地图以查找“Bob”。返回实现具有类似于“evaluate(String s)”方法的接口的某个对象,并将字符串“jump()”传递给它。 2) Bob 在其内部方法映射中搜索“jump()”,然后...?在 C++ 中,我会将键作为指向成员函数 Monster.jump() 的指针,该函数将被执行。但我不认为在 java 中有这样的函数指针。我已经阅读过可以使用匿名类来实现这一点,尽管我还没有尝试。看起来它会起作用。
因此,这将起作用,但是否有更优雅的方法?我以前从未编写过任何类型的解释器。如果有人有一些技巧,我希望能够以好的方式做到这一点并在此过程中学习一些东西。如果我没有很好地结构化,特别是当 Bob 和每个其他对象开始解析自己的指令并使用匿名函数时,这似乎是一个潜在的容易出错的方法。此外,似乎每个类都需要除其正常代码之外的运行时准备接口。
此外,我对 Java 不是很了解,所以如果有一些问题可能会碰壁,那么我也想知道。
提前感谢您的帮助。