是否有任何方法来创建SyntaxToken或SyntaxNode并更改FullSpan属性?
由于所有类都是密封的、不可变的并且没有可访问的构造函数,所以创建类的唯一方法是使用SyntaxFactory静态方法,并且这些方法没有重载来指定位置。
我正在编写一种脚本语言,它被解析为罗斯林SyntaxTree。当使用访问者模式检查表达式的语义时,我希望能够通过将节点映射到某个位置来告诉用户错误发生在哪里。
反正有吗?提前谢谢。
发布于 2014-08-01 17:28:21
不,没有办法这样做。我们确保语法树遵循几个核心原则:
这些核心公理意味着任何分析树的代码(包括编译器)都可以合理地与树一起工作。如果我们给出了一种为某些节点而不是其他节点指定FullSpans的方法,那么我们就无法维护这些不变量,谁知道什么会中断。我们可能会要求您指定所有的范围,但是到了那个时候,您就会疯狂地试图维护这些公理。
你有几个选择:
SyntaxTree.GetMappedLineSpan这样的函数,它将根据对#line指令的解释,将其转换为文件/行/列信息。SyntaxAnnotations附加到表达式,其中包括表达式来自脚本文件中的位置。然后,您可以通过遍历父节点来轻松地计算节点的脚本文件位置,直到您找到一个SyntaxAnnotation,然后以这种方式计算该位置。https://stackoverflow.com/questions/25076035
复制相似问题