首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改变TextSpan of SyntaxToken或SyntaxNode

改变TextSpan of SyntaxToken或SyntaxNode
EN

Stack Overflow用户
提问于 2014-08-01 08:32:47
回答 1查看 1.3K关注 0票数 6

是否有任何方法来创建SyntaxTokenSyntaxNode并更改FullSpan属性?

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

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

反正有吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-01 17:28:21

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

  1. 树的起始位置是零。
  2. 孩子们的整个过程都是有序的,并且是相互的(即一个结束就是另一个的开始)。
  3. 节点的整个跨度等于它的所有子节点的总和。

这些核心公理意味着任何分析树的代码(包括编译器)都可以合理地与树一起工作。如果我们给出了一种为某些节点而不是其他节点指定FullSpans的方法,那么我们就无法维护这些不变量,谁知道什么会中断。我们可能会要求您指定所有的范围,但是到了那个时候,您就会疯狂地试图维护这些公理。

你有几个选择:

  1. 您可以在生成的源代码中使用#line指令告诉编译器脚本文件中的“真实”代码行。通常情况下,这意味着就在您将用户的代码放在文件中之前,您会在它前面插入一行。我们有像SyntaxTree.GetMappedLineSpan这样的函数,它将根据对#line指令的解释,将其转换为文件/行/列信息。
  2. 如果您为不同的表达式生成一组小树,只需在文件中保留一个树->起始位置的映射,当您需要转换到一个显示位置时,只需通过该映射即可。
  3. 如果生成一棵具有一组表达式的树,则将SyntaxAnnotations附加到表达式,其中包括表达式来自脚本文件中的位置。然后,您可以通过遍历父节点来轻松地计算节点的脚本文件位置,直到您找到一个SyntaxAnnotation,然后以这种方式计算该位置。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25076035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档