Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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
是否有任何形式的;“访客热线”;在EclipseJDTJava解析器中?如果没有,是否有人知道一个好的解决方法?_Java_Parsing_Eclipse Jdt_Tree Traversal_Visitor Pattern - Fatal编程技术网

是否有任何形式的;“访客热线”;在EclipseJDTJava解析器中?如果没有,是否有人知道一个好的解决方法?

是否有任何形式的;“访客热线”;在EclipseJDTJava解析器中?如果没有,是否有人知道一个好的解决方法?,java,parsing,eclipse-jdt,tree-traversal,visitor-pattern,Java,Parsing,Eclipse Jdt,Tree Traversal,Visitor Pattern,我想从Java文件访问AST中的节点,并提取一些与这些节点相关的信息。但是,我想通过源代码文件中的行引导的AST。我知道有与每个节点相关联的行的信息,但问题是访问节点的默认方式是通过特定的访问者。所以:1。为了避免对节点的冗余访问,2。不要在尝试枚举所有可能的节点类型(或访问者)时生成开销,以及3。为了以有序的方式访问节点中的信息,我需要一种“行访问者”,这样我就可以按照源代码文件中的行访问AST节点中的信息。有人知道用EclipseJDTAPI或者甚至是一种解决方法来实现这一点的标准方法吗?我

我想从Java文件访问AST中的节点,并提取一些与这些节点相关的信息。但是,我想通过源代码文件中的行引导的AST。我知道有与每个节点相关联的行的信息,但问题是访问节点的默认方式是通过特定的访问者。所以:1。为了避免对节点的冗余访问,2。不要在尝试枚举所有可能的节点类型(或访问者)时生成开销,以及3。为了以有序的方式访问节点中的信息,我需要一种“行访问者”,这样我就可以按照源代码文件中的行访问AST节点中的信息。有人知道用EclipseJDTAPI或者甚至是一种解决方法来实现这一点的标准方法吗?

我不能直接从EclipseAST的知识来说话。然而,如果这些是用Java简单表示的传统AST,那么在没有任何其他帮助的情况下,访问树节点的方式基本上就是遍历树

当然,您可能可以通过Eclipse与此类节点关联的某种类型的文件位置信息(行、列等)来过滤AST节点,只需过滤带有所需行标记的AST即可。除非您真的非常关心这需要多长时间(在文件大小方面,这是最坏的线性情况,我在其他系统中的经验表明,每个源代码行平均有5-7个节点),否则对于您的目的来说,这应该足够好了

如果您想直接访问与特定行号关联的树节点,我猜您运气不好。显然,您可以通过遍历树一次并收集具有特定行号的所有节点来构建这样一个地图;然后你可以得到你想要的访问权限。[您实际上只需要关联一行的第一个AST{按顺序树漫游中最左边的部分),此映射就可以使用] 同样,构建此列表的树行走是线性时间,您只需支付一次。 FWIW,我已经构建了处理AST的工具~~ 30年了,还没有发现它特别有用


如果您坚持,并且希望降低构建此映射的成本,我会查看解析机制内部并对其进行修改以完成此工作。它制造所有这些AST节点,并且在制造此类节点时知道正在处理的源的行号。在生成AST节点时,应该很容易构建映射。如果解析器很好,它实际上是线性时间,添加这项工作不会改变线性。

您可能应该发布一些代码,说明当前的处理情况以及缺少哪些信息。缺少的信息正是从行到节点的映射(这里的顺序很重要,因为我知道反向关系在nodes API中已经可用,但它并不完全是我想要的,正如我在上面的描述中强调的那样)。这就是为什么AST中的可用访问者及其遍历模型不能很好地满足我的要求的原因。我想我需要一个解决方法…您可能应该发布一些代码,说明您当前的处理情况以及您缺少的信息。上开始了类似的讨论…因此,请查看此处以避免关于这个问题的代码发布的重复说明,因为理由是相同的。根据你的回答,我想我运气不好…:(无论如何,你的建议是解决问题的一个很好的起点(它或多或少证实了我的想法)。我想我应该看看EclipseJDT源代码,以找到如何继续进行此遍历,或者使用可用的访问者尝试“可能不太有效的解决方案”…感谢您的建议!让我进一步介绍“未发现此特别有用”。节点上的行号是程序员选择文本格式的一个意外。从其他读者的角度来看,她可能将文本格式设置得很漂亮;(s)他可能制作了一个非常糟糕的布局,比如说每行一个标记和随机缩进距离。你想构建什么样的工具,取决于这些异想天开的选择?…我发现有用的是,当在第N行报告错误时,打开源文件并获取行(N-k…N+k)[例如,该行及其周围文本上下文的k行)显示给用户。但这不在AST上。虽然有用,但逐行读取源文件以获取此信息感觉很难看,特别是如果我可能报告多行C、k、N、Q、T的问题,并为每个报告按顺序读取文件。[我们实际上是这样做的……通过构建一个类似于上述AST行索引的源ilne索引,这是我们第一次为此创建一个文件。]