0

在为编程语言构建 REPL 控制台应用程序时出现以下问题。从本质上讲,该语言依赖于您能够编写多行文本。但是,该ENTER键也应该可用于评估表达式。

> 1 + 1<enter>
int int1 = 2
> <cursor>

为了允许多行输入,我使用了一种算法来计算括号、大括号、方括号和引号的数量,因此如果它们中的任何一个不平衡,它就会插入一个换行符:

> if (int1 < 3) {<enter>
|     println "ok"<enter>
|     }<enter>
ok
> <cursor>

这种方法的主要问题是,只要我在一行上按 enter,就不能再编辑该行了。反复按BACKSPACE}符号将首先将其删除,然后保持在该位置而不删除换行符并允许我删除该println行。这使得程序非常容易出错并且编辑非常乏味。

另一个问题是我什至不能在某些控制台(如 Mac 终端)中使用光标。控制台将在该事件中仅显示 ANSI 控制代码。


有没有办法解决这两个问题,也许是通过在我的 REPL 前端引入自定义光标处理?JVM 为我提供了多少访问封闭控制台的权限?我可以强制控制台将所有按键重定向到程序吗?而且,我是否必须对不同的 IDE 控制台/终端/操作系统使用不同的技术?

4

1 回答 1

0

问题不在于“JVM”,而在于 JavaRepl 的简单代码。控制台输入(参见源代码)只是从标准输入中读取行:

private static Mapper<Sequence<String>, String> readFromConsole() {
    return new Mapper<Sequence<String>, String>() {
        private final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        public String call(Sequence<String> lines) throws Exception {
            return reader.readLine();
        }
    };
}

BufferedReader真的做的不多。它的文档也没有帮助。对TutorialsPoint的描述会有所帮助;

java.io.BufferedReader.readline() 方法读取一行文本。一行被认为是由换行符 ('\n')、回车符 ('\r') 或紧跟换行符的回车符中的任何一个终止的。

要按照您的意愿改进 JavaRepl,必须将其修改为(至少)允许将左箭头和键盘删除发送的转义序列视为与“退格”(实际上是删除)相同。这是可行的(但可能不是 JavaRepl 的开发人员想要的:与旧版本的 Java 的兼容性可能是一个考虑因素)。即使是Console来自 Java6 的“较新”类也被记录在案,但并未暗示它不仅仅是BufferedReader为了帮助密码提示而进行的适度改造。

有关读取转义序列,请参阅

要进行多行编辑,需要另一个步骤来更改其界面以允许检索先前的行并进行编辑。我认为这超出了 JavaRepl 的设计范围(但您可能会向开发人员建议)。

于 2016-02-15T21:57:23.337 回答