我在实现解析项目时遇到了这个问题。 我使用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节点编写方法,因为没有通用的方法来访问他们的子节点。因此,我正在寻找一种通用的算法解决方案。
答案 0 :(得分:0)
最后我发现我也可以使用访客来解决这个问题。让访问者访问AST并记住最后看到的AST节点包含给定的标记。然后,该AST节点是包含该令牌的最紧密的AST节点。