【问题标题】:figure out which token belongs to which AST node找出哪个令牌属于哪个 AST 节点
【发布时间】:2013-10-25 15:15:29
【问题描述】:

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

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

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

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

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

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

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

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

那我想int;属于语句,b,内()属于第二个表达式。

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

【问题讨论】:

  • 您能否详细说明您的主张“没有通用的方法可以访问其子节点”及其与“我正在寻找通用算法解决方案”的关系?
  • “没有共同的方式访问他们的孩子”意味着每个节点有不同数量的孩子。一个块可能有许多语句。二元运算将有两个孩子。而 JDT 的 AST 没有getChildren() 之类的方法可以让我访问当前 AST 节点的每个子节点。
  • 也许你可以用这个来得到孩子? stackoverflow.com/questions/11841789/…
  • 我的“通用算法解决方案”是指使用节点起始偏移量、结束偏移量和令牌起始偏移量来解决这个问题。不依赖于 JDT AST 可能提供的功能来解决这个问题。
  • 因为我需要为C族源代码写同样的东西,所以我更喜欢用算法来解决这个问题。但是谢谢@justhalf,我没有注意到。

标签: algorithm data-structures


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2014-08-07
    相关资源
    最近更新 更多