Algorithm 找出哪个令牌属于哪个AST节点
我在实现解析项目时遇到了这个问题。 我使用EclipseJDT进行解析,得到的是一个经过解析的抽象语法树 我还需要标记信息,比如哪个标记属于哪个AST节点。由于JDT没有提供直接的信息,我需要将相同的概念移植到C系列代码中,所以我更喜欢使用算法方法来解决它 这个问题可以用更精确的算法来描述 对于每个AST节点,在源代码中都有一个起始偏移量和一个结束偏移量。由于AST属性,每个节点的区域不会跨越边界。(不会有表达式1->20和来自4->23的另一条语句,但可以有节点1->20和另一个节点1->20) 每个令牌还具有起始偏移量和长度。非交叉边界属性仍然有效。 并且每个令牌不会与其他令牌重叠 我手头有一个AST和一个令牌列表,我想将每个令牌与一个AST节点相匹配,与区域最窄但仍包含整个令牌的AST节点相匹配。由于非交叉特性,我们只能检查每个令牌的起始偏移量,并找到具有最窄区域的AST节点 例如,如果我有一个语句Algorithm 找出哪个令牌属于哪个AST节点,algorithm,data-structures,Algorithm,Data Structures,我在实现解析项目时遇到了这个问题。 我使用EclipseJDT进行解析,得到的是一个经过解析的抽象语法树 我还需要标记信息,比如哪个标记属于哪个AST节点。由于JDT没有提供直接的信息,我需要将相同的概念移植到C系列代码中,所以我更喜欢使用算法方法来解决它 这个问题可以用更精确的算法来描述 对于每个AST节点,在源代码中都有一个起始偏移量和一个结束偏移量。由于AST属性,每个节点的区域不会跨越边界。(不会有表达式1->20和来自4->23的另一条语句,但可以有节点1->20和另一个节点1->20
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系列源代码编写相同的代码,所以我更喜欢通过算法来解决这个问题。但是谢谢你,我没注意到。