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

时间:2013-10-17 08:19:24

标签: algorithm data-structures

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

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

问题可以用算法来描述。

对于每个AST节点,它在源代码中具有起始偏移量和结束偏移量。由于AST属性,每个节点的区域不会越过边界。 (将不具有表达式1-> 20和来自4-> 23的另一声明,但是具有节点1-> 20并且另一节点1-> 20是可能的)

每个令牌也有起始偏移量和长度。非共存边界属性仍然存在。  并且每个令牌不会与其他令牌重叠。

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

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

statement
  |
assignment
  |    | 
id    expression 1
       |
      binary operation
       |        |
       int      expression 2
                 |
               binary operation
                 |       | 
                int       id

然后我希望int;属于语句,b,内部()属于第二个表达。

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

1 个答案:

答案 0 :(得分:0)

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