Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我需要以编程方式解析、修改和写回Java源文件_Java_Parsing - Fatal编程技术网

Java:我需要以编程方式解析、修改和写回Java源文件

Java:我需要以编程方式解析、修改和写回Java源文件,java,parsing,Java,Parsing,我需要解析、修改和写回Java源文件。我调查了一些选择,但发现我没有抓住要点 解析后的AST的输出在写回文件时总是使用标准格式(而不是原始格式)破坏格式 基本上我想要一些可以做的事情:内容(写入(解析(源文件)).equals(内容(源文件)) 我试过了,但失败了。我可能会将EclipseJDT的解析器用作独立的解析器,但这感觉很沉重。我也希望避免做我自己的事情。例如,Java解析器已经有了关于列和行的信息,但将其写回会忽略这些信息 我想知道如何在输出看起来与输入(意图、行、所有内容)相同的情况

我需要解析、修改和写回Java源文件。我调查了一些选择,但发现我没有抓住要点

解析后的AST的输出在写回文件时总是使用标准格式(而不是原始格式)破坏格式

基本上我想要一些可以做的事情:内容(写入(解析(源文件)).equals(内容(源文件))

我试过了,但失败了。我可能会将EclipseJDT的解析器用作独立的解析器,但这感觉很沉重。我也希望避免做我自己的事情。例如,Java解析器已经有了关于列和行的信息,但将其写回会忽略这些信息

我想知道如何在输出看起来与输入(意图、行、所有内容)相同的情况下实现解析和写回。基本上是一种保留原始格式的解决方案

[更新]

我想做的修改基本上是AST所能做的一切,比如添加、删除实现的接口、删除/添加局部变量的final,以及生成源方法和构造函数


其思想是添加/删除任何内容,但其余内容需要保持不变,特别是如果结果行大于页面边距,则方法和表达式的格式设置。

您可以尝试使用带有


默认情况下,语法跳过所有空格,但根据标记位置,您可能能够重建接近原始空格的源

生成的解析器输出是写入此接口的事件序列:

public interface EventHandler
{
    public void reset(CharSequence input);
    public void startNonterminal(String name, int begin);
    public void endNonterminal(String name, int end);
    public void terminal(String name, int begin, int end);
    public void whitespace(int begin, int end);
}
其中整数是输入的偏移量。事件流可用于构造解析树。由于事件流完全覆盖了所有输入,因此生成的数据结构可以毫无损失地表示它

有一个示例驱动程序,在这个接口上实现XmlSerializer。这将产生一个XML解析树,它只是添加到输入中的标记。因此,XML文档的字符串值与原始输入相同

要查看它的实际操作,请使用并使用命令行生成解析器

-ll 2 -backtrack -tree -main -java
然后运行生成的Java.Java的main方法,传入一些Java源文件名。

我们的its可以做到这一点

DMS是一个用于将源代码解析为内部表示(通常是ASTs)的工具,允许您对这些树进行更改,并为修改后的树重新生成有效的输出文本

好的PTSE将在您没有更改代码或生成格式良好的结果(包括原始源代码中的注释)的地方保留格式/布局。它们还允许您以以下形式编写源到源转换:

  if you see *this* pattern, replace it by *that* pattern
其中,模式是用目标语言(在本例中为Java)的表面语法编写的。编写这样的转换通常比编写过程代码来爬树、检查和攻击单个节点容易得多

DMS具有所有这些属性,包括OP对null变换的幂等性的请求


[回应另一个答案:是的,它有Java 8语法]

我想你忘了提到要点了。。。您需要以编程方式对源文件进行哪些修改?这是工具请求吗?这就意味着它对SONot来说并不是一个真正的工具请求。我正在寻找解决办法。我希望Java有一些额外的支持,或者以另一种方式重用现有的东西。我不在乎它是一个工具还是它的一部分,或者是来自oracle的东西。我只需要一个解决方案。但是我不想自己重写AST实现,所以我不想走Antlr的路。我想主要的一点是:你为什么需要它?@MartinKersten:“解决方案”和“工具”有何不同?如果我没记错的话,这只会导致缺少很多功能的解析树,比如添加/删除元素等等?我宁愿尝试现有的解决方案。我不敢相信我必须在这样的基础上解决这个问题。这就是为什么我认为我错过了一些重要的事情。我希望重用已经存在的开源解决方案。但你是对的。如果我必须构建并生成我自己的解析器来解决这个问题,那么这就是解决方法。我不确定你是否需要一个可重写的语法树。通过侦听解析事件并立即发出转换后的输出,可以进行一些简单的转换。对于更严重的重写,您需要一个可重写的AST,这是antlr不提供的。在这种情况下,您可以从解析树中构建自己的AST(对于像java这样的复杂语言,需要做大量的工作),或者您可以寻找其他技术(我没有任何进一步的想法),谢谢您的输入。您对AST的理解是正确的,因为它需要大量的工作,这正是我不想自己做的原因。有一些解析器在那里,但我希望Oracle提供类似于开箱即用之类的东西。我发现我提到的javaparser项目正是我所需要的,但我从未设法从中获得我投入的输出。谢谢你,冈瑟。Java8语法可用吗?AST实现也可用吗?不,对不起,Java8语法还不可用。此外,我还不能直接指出AST实现。像您希望的那样的转换可能直接在具体的解析树上完成。或者,可以从中剥离选定的单元派生,然后在这样剥离的树上执行转换。这是现有应用程序经常做的事情,一些应用程序在XSLT或XQuery中转换XML。