当前位置: 首页 > 知识库问答 >
问题:

如何从所有节点中从Eclipse JDT解析器解析的Java源中获取行和/或列?

钱承允
2023-03-14

我已经玩了一段时间的AST,试图从Eclipse获取与这个插件解析的给定节点相关联的行和列信息。根据这里文档化的api,我发现getStartPosition()方法可以给出解析的文件字符的位置,但这不是我想要的。

我在CompilationUnit类api文档中找到了getLineNumber(int position)getColumnNumber(int position)方法,根据我的理解,这两个方法可以起到作用。position参数与getStartPosition()方法通过执行node.getStartPosition()返回的参数一样。

现在,问题是在源文件上获取行和列的两种方法似乎并不是对所有节点都可用的。例如,方法声明节点没有它们!

我怎样才能在所有的树上得到这样的信息?我知道这并不是不可能的,因为我能够为其他语言使用解析器,而每个ast节点都有一行和列与之相关联。事实上,我认为javaparser是Java的其中之一,因为该类包含硬编码的行和列的属性。看到Eclipse JDT在我看来更健壮,并且在那里呆了很长一段时间,我会对无法获取这些信息感到惊讶。

编辑:同样,问题是从只出现在根上的编译单元的不同内容获取行号:

<type 'org.eclipse.jdt.core.dom.CompilationUnit'>
1
<type 'org.eclipse.jdt.core.dom.TypeDeclaration'>
<type 'org.eclipse.jdt.core.dom.Javadoc'>
<type 'org.eclipse.jdt.core.dom.TagElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>

谢谢.

共有1个答案

西门安民
2023-03-14

为了子孙后代,我将把我在jdt-core-dev邮件列表上发布的答案重新发布。(我的回答和上面Ryan的建议差别不大)

你好Carlos,

关于CompilationUnit.GetLineNumber(int)方法,您是正确的。您可以按照以下方式使用它:

int lineNumber=CompilationUnit.GetLineNumber(Node.GetStartPosition())-1;

但是,我不明白你被困在哪里了。为什么需要getLineNumber(..)是否为MethodDeclaration定义?您所要做的就是找到方法声明节点,然后使用下面的代码为其找出相应的CompilationUnit,然后使用上面的一行代码找到行号。我是不是漏了什么?

ASTParser parser = ASTParser.newParser(AST.JLS3); // or JLS_4 for java 7 and above

parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source); // give your java source here as char array
parser.setResolveBindings(true);

CompilationUnit compilationUnit = parser.createAST(null);

干杯!阿尤什

 类似资料:
  • 我可以使用以下方法获取第一个

  • 所以我想做的是,如果可能的话,做一个像这样的: 所以我正在做的是,让演员(人),然后让他们表演的电影,这很有效。然后我试图让那部电影中的联合演员。我想把当前演员的id传递给联合演员字段,作为这样一个论点: 显然,我遇到了一个错误,不知道这是否可以在内部实现。 这是我喜欢的类型:

  • 问题内容: 我正在尝试从这样的站点地图中提取URL:https : //www.bestbuy.com/sitemap_c_0.xml.gz 我已经解压缩并将.xml.gz文件另存为.xml文件。结构如下: 我正在尝试使用ElementTree提取整个文件中 loc 节点内的所有URL ,但仍在努力使其正常工作。 根据文档,我正在尝试这样的事情: 但是,没有任何东西可以载入价值。我的目标是提取lo

  • 问题内容: 我以前从未真正使用过DOM解析器,现在有一个问题。 我将如何从该标记中提取URL: 问题答案: 使用simpleXML: 输出:

  • 问题内容: 是否可以仅从pom.xml文件获取POM 的实例或其他对象形式? 提前致谢。 问题答案: 是的你可以 。这是代码。您需要maven-model-3.0.4.jar和plexus-utils-2.0.6.jar和maven- core-3.0.4.jar

  • 我正在通过自定义语法处理输入文件,提取标记,并在中返回它们。在ANTLR 3中,我能够通过调用解析器上的方法来解析文件,并获得类似于。 这在ANTLR 4中似乎不起作用。我参考了这本书,似乎我必须调用开始解析,但我在解析器中没有看到任何方法。 我使用ANTLRWorks 2生成我的词法分析器和解析器文件。我没有生成侦听器类。