我在实现解析项目时遇到了这个问题。我使用 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 节点编写方法,因为没有通用的方法来访问它们的子节点。因此我正在寻找一个通用的算法解决方案。