Algorithm 找出哪个令牌属于哪个AST节点

Algorithm 找出哪个令牌属于哪个AST节点,algorithm,data-structures,Algorithm,Data Structures,我在实现解析项目时遇到了这个问题。 我使用EclipseJDT进行解析,得到的是一个经过解析的抽象语法树 我还需要标记信息,比如哪个标记属于哪个AST节点。由于JDT没有提供直接的信息,我需要将相同的概念移植到C系列代码中,所以我更喜欢使用算法方法来解决它 这个问题可以用更精确的算法来描述 对于每个AST节点,在源代码中都有一个起始偏移量和一个结束偏移量。由于AST属性,每个节点的区域不会跨越边界。(不会有表达式1->20和来自4->23的另一条语句,但可以有节点1->20和另一个节点1->20

我在实现解析项目时遇到了这个问题。 我使用EclipseJDT进行解析,得到的是一个经过解析的抽象语法树

我还需要标记信息,比如哪个标记属于哪个AST节点。由于JDT没有提供直接的信息,我需要将相同的概念移植到C系列代码中,所以我更喜欢使用算法方法来解决它

这个问题可以用更精确的算法来描述

对于每个AST节点,在源代码中都有一个起始偏移量和一个结束偏移量。由于AST属性,每个节点的区域不会跨越边界。(不会有表达式1->20和来自4->23的另一条语句,但可以有节点1->20和另一个节点1->20)

每个令牌还具有起始偏移量和长度。非交叉边界属性仍然有效。 并且每个令牌不会与其他令牌重叠

我手头有一个AST和一个令牌列表,我想将每个令牌与一个AST节点相匹配,与区域最窄但仍包含整个令牌的AST节点相匹配。由于非交叉特性,我们只能检查每个令牌的起始偏移量,并找到具有最窄区域的AST节点

例如,如果我有一个语句
inta=(3*(5+b)),令牌流是
int
a
=
3
*
5
b
AST可能看起来像

statement
  |
assignment
  |    | 
id    expression 1
       |
      binary operation
       |        |
       int      expression 2
                 |
               binary operation
                 |       | 
                int       id
然后我想要
int
属于语句,
b
,内部
属于第二个表达式


尽管我手头有一个AST,但使用它来查找特定的AST节点需要我为java语言的各种AST节点编写方法,因为没有访问它们的子节点的通用方法。因此,我正在寻找一个通用的算法解决方案。

最后,我发现我也可以使用visitor来解决这个问题。让访问者访问AST并记住最后看到的AST节点包含给定的令牌。那么,该AST节点是包含该令牌的最紧密的AST节点。

您能否详细说明您的声明“没有访问其子节点的通用方法”及其与“我正在寻找通用算法解决方案”的关系?“没有访问其子节点的通用方法”表示每个节点具有不同数量的子节点。一个块可能有许多语句。二进制操作将有两个子项。JDT的AST没有
getChildren()
类方法让我访问当前AST节点的每个子节点。也许你可以用它来获取子节点?我的“通用算法解决方案”是指使用节点起始偏移量、结束偏移量和令牌起始偏移量来解决这个问题。不依赖JDT AST可能提供的函数来解决这个问题。因为我需要为C系列源代码编写相同的代码,所以我更喜欢通过算法来解决这个问题。但是谢谢你,我没注意到。