gpt4 book ai didi

c# - Roslyn - 更改 SyntaxToken 或 SyntaxNode 的 TextSpan

转载 作者:太空狗 更新时间:2023-10-29 21:27:35 27 4
gpt4 key购买 nike

有什么方法可以创建 SyntaxTokenSyntaxNode 并更改 FullSpan 属性?

由于所有类都是密封的、不可变的并且没有可访问的构造函数,因此创建类的唯一方法是使用 SyntaxFactory 静态方法,并且这些方法没有重载来指定位置。

我正在编写一种脚本语言,它被解析为 Roslyn SyntaxTree。当使用访问者模式检查表达式的语义时,我希望能够通过将节点映射到某个位置来告诉用户错误发生的位置。

还有吗?提前致谢。

最佳答案

不,没有办法做到这一点。我们确保我们的语法树遵循几个核心原则:

  1. 树的起点是位置零。
  2. child 的整个跨度是有序的,并且彼此相邻(即一个的结束是另一个的开始)
  3. 一个节点的完整跨度等于它所有子节点跨度的总和。

这些核心公理意味着任何分析树的代码(包括编译器)都可以合理地与树一起工作。如果我们为您提供了一种为某些节点而不是其他节点指定 FullSpans 的方法,我们将无法维护这些不变量,谁知道会破坏什么。我们可能会要求您指定所有跨度,但到那时您会因为试图维护这些公理而把自己逼疯。

您有几个选择:

  1. 您可以在生成的源代码中使用#line 指令来告诉编译器脚本文件中的“真实”代码行。通常,这意味着在您将用户代码放入文件之前,您会在它之前添加一个#line。我们有像 SyntaxTree.GetMappedLineSpan 这样的函数,它会根据我们对 #line 指令的解释将常规跨度转换为文件/行/列信息。

  2. 如果您使用一堆表达式生成一棵树,请将 SyntaxAnnotation 附加到您的表达式,包括表达式在脚本文件中的位置。然后,您可以通过向上遍历父节点直到找到 SyntaxAnnotation 轻松计算节点的脚本文件位置,然后以这种方式计算位置。

关于c# - Roslyn - 更改 SyntaxToken 或 SyntaxNode 的 TextSpan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com