【发布时间】:2013-09-02 09:08:20
【问题描述】:
我有一个 ANTLRv3 语法来转换 AST(由其他语法生成和使用)。
其中一部分是将定义为M:N(即1:5)的范围重写为其实际的列表表示形式——M, M+1, ..., N(即1, 2, 3, 4, 5)。
因此,节点^(RANGE s=INT e=INT) 被转换为INT 令牌列表。
我现在做的事情如下:
range
: ^(RANGE s=INT e=INT) -> { ToSequence(int.Parse($s.text),int.Parse($e.text)) }
;
ToSequence 方法看起来像
private ITree ToSequence(int start, int end)
{
var tree = new CommonTree();
for (int i = start; i <= end; i++)
{
tree.AddChild(new CommonTree(new CommonToken(INT, i.ToString())));
}
return tree;
}
它实际上工作正常,将树节点(TIME 1 2 (RANGE 5 10) 3 4) 转换为(TIME 1 2 5 6 7 8 9 10 3 4),但我有点不确定这是否是进行这种转换的正确和惯用方式。
那么,有没有更文明的方式来完成这项任务呢?
【问题讨论】:
标签: antlr antlr3 abstract-syntax-tree