1

我有一个 ANTLRv3 语法来转换 AST(由其他语法生成和使用)。

其中一部分是将像M:N(ie 1:5) 定义的范围重写为它们的实际列表表示形式 - M, M+1, ..., N(ie 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),但我有点不确定这是否是进行这种转换的正确和惯用方式。

那么,有没有更文明的方式来完成这项任务呢?

4

1 回答 1

0

我认为在解析器中执行这样的转换根本不是一个好主意。您的代码缺少任何类型的有效性检查。如果第一个数字大于第二个数字怎么办?如果在下一个处理阶段检测到错误怎么办?那时您已经失去了有关输入真实结构的知识,因此您无法提供有用的错误消息。

我强烈建议先构建一个反映输入真实结构的树,然后再转换树。转换后的节点可能会保留对其源节点的引用。

于 2013-09-16T09:20:18.393 回答