【问题标题】:Is it possible to create a pre-compiler plugin for Java 8?是否可以为 Java 8 创建预编译器插件?
【发布时间】:2018-03-01 14:19:59
【问题描述】:

一些背景:

我喜欢在 Java 中完成code-golf 挑战,其目标是用尽可能少的字节/字符完成特定任务。举个简单的例子:检查整数 n 是否是素数,函数尽可能短 (lambda) 为 47 字节

n->{for(int i=2;i<n;n=n%i++<1?0:n);return n>1;}

Try it online.

代码高尔夫球的答案通常非常难读,缺少空格和换行符,仅使用单字符变量、方法和类名,可能会给出编译器警告等。但我们并不关心这些只要在代码高尔夫中尽可能短。

所以,简而言之,这就是打代码。虽然我已经回答了loads of code-golfing challenges in Java,但我希望 Java 在多个场合都拥有一个功能:将正则表达式的捕获组用于类似于 JavaScript 或 Retina 的东西。

例如,如果这些事情在 Java 中成为可能,那就太好了:
A

// Converting the capture group to an Integer:
s->n->s.replaceAll("\\D*(\\d+)",new Integer("$1")+n+"")
// i.e. "test123" & 7 will become 130 (123 + 7)

// Getting the length of a capture group:
s->s.replaceAll("(\\D*(\\d+))",new Integer("$2")+"$1".length()+"")
// i.e. "test123" will become 130 (123 + the length of "test123")

// Getting a character or substring of a capture group:
s->s.replaceAll(".(.+)",s+"$1".charAt(0))
// i.e. "test" will become "teste" ("test" + "est".charAt(0))

当然,通过一些小的修改,上述这些事情是可能的:
B

s->n->new Integer(s.replaceAll("\\D*(\\d+)","$1"))+n+""
s->new Integer(s.replaceAll("(\\D*(\\d+))","$2"))+s.replaceAll("(\\D*(\\d+))","$1").length()+""
s->s.replaceAll(".(.+)",s)+s.replaceAll(".(.+)","$1").charAt(0)

Try it online.

问题本身:

现在我的问题是:是否可以创建一个修改编译器代码的插件,所以上面 A 上显示的带有捕获组的replaceAll 将被修改为 B 上显示的那些。基本上是创建一个插件/库/编译器标志或任何修改预编译代码的东西,尤其是在String#replaceAllString#replaceFirst 中使用捕获组时。

PS:我还不确定 A 的代码最终是否是我想要的,也许我会让它更像 JavaScript(或 Retina):

// Syntax used above at A:
s->s.replaceAll("\\D*(\\d+)","$1".length()+"")
// JavaScript syntax alternative:
s->s.replaceAll("\\D*(\\d+)",a->a.length()+"") // a-> is the capture group 1
// Retina syntax alternative:
s->s.replaceAll("\\D*(\\d+)",new Integer("$#1")+"") // $#1 is the length of capture group 1

但这与问题本身无关:如何创建一个预编译插件对代码的String#replaceAll(...,"$#")String#replaceFirst(...,"$#") 部分进行某种修改。 (以及这是否可能开始。)

【问题讨论】:

  • 第二个“在线试用”链接抛出错误
  • @c0der 我知道,这就是重点。我目前发现了我想使用这个预编译器插件的代码的错误,并使用更长的解决方法来代替给出结果。如您所见,错误已被捕获并打印到 STDOUT,而不是未被捕获并在 STDERR 中抛出(TIO 上的调试窗口)。

标签: java regex plugins compiler-construction compiler-optimization


【解决方案1】:

我从未访问过 Code Golf,但我认为,您需要一个 Transpiler。谷歌的“建筑转译器”。您也可以使用 Compiler 或 Interpreter。使用 ANTLR 指定 A 和 B 语法或在 java 中对其进行硬编码,然后根据词法分析器和解析器映射它们。这并不难,但我认为对于个人来说这是一个漫长的过程,因为您需要在 A 中映射 B 提供的所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2011-07-03
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多