c 向我的编辑器添加自动建议

c adding auto suggestions to my editor

本文关键字:添加 我的 编辑器      更新时间:2023-10-16

>我正在编写自己的c/c ++编辑器,现在我已经完成了我想在编写时添加自动建议的所有内容,为此,我需要解析当前文件中包含的标头并将它们组织成JSON结构,我正在寻找能给我最佳性能的设计, 但我在这方面几乎没有经验,所以这是我如何开始的,假设我有这个简单的 C 程序

#include<stdio.h>
#include<stdlib.h>
#include<sys/scoket.h>
int main()
{
return 0;
}

我有一个名为 document 的类,它有 3 个数组:

  1. 包含每个标题的所有名称,其内容更改 根据我的陈述,因此对于上述文档,其内容是

    "斯特迪奥" "斯特德利布" "斯科克特">

  2. 保存从第一个数组中列出的 JSON 文件获得的所有建议并组织它们,并识别函数参数的类型,以及每个建议的注释等。
  3. 持有匹配建议,并根据内容不断变化 正在键入。

正如我所说,我没有经验,也没有读过他们是如何做到的,但除了 JSON 部分之外,他们是如何向 IDE 添加自动建议的吗?

我也希望得到一些提示,可以帮助我改进这个设计,甚至废弃它。

PS:如果有人想知道为什么是JSON,因为我要制作它的在线版本!

第1 步。A) 编写一个符合 C 的解析器,能够在 CPP(不是 C++,CPP)预处理器运算符的迷宫中导航。

第 1 步。B) 利用现有的、符合标准的 C 编译器为您解析,可能通过以下方式:

  • 调用cpp -E,然后解析其 C 语言输出,该输出已将 CPP 运算符"洗白"出来
  • 调用gccxml并分析其 XML 输出 http://gccxml.github.io/HTML/Index.html
  • 使用各种钩子直接钩接到clanggcc来处理它们的内部解析树(我相信这就是 XCode 为其实时处理所做的) — http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/Print_version http://clang.llvm.org/docs/InternalsManual.html

第 2 步。确定编辑器中该点(光标位置)处的行的当前上下文是什么;例如

  • 用户是否希望输入通用术语?
  • 它们是取消引用指向结构或对象的指针,还是对结构或对象使用.运算符,并且需要成员(方法、字段)名称?
  • 它们是否位于新语句的开头,并且可能正在输入变量或函数的类型名称?
  • 他们
  • 是否调用具有已知参数列表的函数,并且您知道他们正在提供(第 n 个)参数,因此该参数必须是类型 (T),然后他们必须输入类型 (T) 的文本值或表达式

这部分你可能会使用一些语法提示而不调用完整的编译器,并且可能有点命中或错过。

第 3 步。查找该点范围内的所有定义,并满足用户可能期望在其中输入的内容的类型要求。此列表可能包括来自头文件、当前文件中的值或来自函数/方法内本地范围内的值。

第 4 步。当用户开始键入时,将选择范围缩小到仅满足 2 中确定的类型,这些类型以单词中已经输入的字母开头(尽管您可能希望折叠大小写,即将其不区分大小写,并可能忽略_下划线,因为它们在不同库等之间的使用不一致)


第 1 步。C)建立一个哈希表(可能是大小写折叠和_省略)项目文件集合中所有"看到的单词",并简单地筛选出以到目前为止键入的字母开头的单词,无论类型如何。

信不信由你,对于我相对罕见的C代码尝试,我大多懒得在 Emacs 中启用上面的 (1B-4) 的完整堆栈,我只使用dabbrev-expand选项 (M-/) 在这里工作得像 (1C),而且通常对结果不满意。但是,如果您正在编写一个专门用于处理 C 和 C++ 代码的编辑器,那么您可能想尝试一些更像 (1B-4) 的东西,我预计。