如何同步 AST 元素和光标位置?
How do I synchronize AST elements and cursor position?
我正在使用解析器检索在编辑器中键入的某些代码的 AST。我现在想实现的是:给定光标在编辑器中的位置(行、列),找到当前选择的 AST 元素。但是,我不知道如何做到这一点,有什么标准的方法可以解决这个问题吗?
首先用源文件位置(行号和列号)标记每个 AST 节点。
其次,您在编辑器中构建地图:抽象地,对于每个像素,显示源文件的行号和列号。 (在实践中,如果你显示的行是固定高度,并且你显示的字符是固定的,你可以通过从显示行号到源代码行号的映射来实现)。
现在从屏幕位置(例如,光标位置)到 AST 节点的来回映射很容易,即使您编辑树 and/or 更改显示的部分。
在树中插入新的树节点时会出现一些复杂情况,因为它们没有 "file position"。没关系,您可以为它们分配不与任何现有行号重叠的任意 line/column 号。当您将修改后的树写入文件时,您实际上不再需要 line/column 个数字,因此您可以忽略它们。
我正在使用解析器检索在编辑器中键入的某些代码的 AST。我现在想实现的是:给定光标在编辑器中的位置(行、列),找到当前选择的 AST 元素。但是,我不知道如何做到这一点,有什么标准的方法可以解决这个问题吗?
首先用源文件位置(行号和列号)标记每个 AST 节点。
其次,您在编辑器中构建地图:抽象地,对于每个像素,显示源文件的行号和列号。 (在实践中,如果你显示的行是固定高度,并且你显示的字符是固定的,你可以通过从显示行号到源代码行号的映射来实现)。
现在从屏幕位置(例如,光标位置)到 AST 节点的来回映射很容易,即使您编辑树 and/or 更改显示的部分。
在树中插入新的树节点时会出现一些复杂情况,因为它们没有 "file position"。没关系,您可以为它们分配不与任何现有行号重叠的任意 line/column 号。当您将修改后的树写入文件时,您实际上不再需要 line/column 个数字,因此您可以忽略它们。