1

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

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

这个问题可以用更多的算法来描述。

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

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

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

例如,如果我有一个语句int a = (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 节点编写方法,因为没有通用的方法来访问它们的子节点。因此我正在寻找一个通用的算法解决方案。

4

1 回答 1

0

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

于 2013-10-28T18:43:04.670 回答