【发布时间】: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));,则令牌流是int、a、=、(、3、3、*、(、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,我没有注意到。