我有一个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)
,但我有点不确定这是否是进行此类转换的正确和惯用方法。
那么,还有更文明的方法来执行这项任务吗?
答案 0 :(得分:0)
我认为在解析器中执行此类转换根本不是一个好主意。您的代码缺乏任何有效性检查。如果第一个数字大于第二个数字怎么办?如果在下一个处理阶段检测到错误怎么办?此时您已经失去了有关输入的真实结构的知识,因此您无法提供有用的错误消息。
我强烈建议先构建一棵树,反映输入的真实结构,然后再转换树。转换后的节点可能会保留对其源节点的引用。