c 向我的编辑器添加自动建议
c adding auto suggestions to my editor
>我正在编写自己的c/c ++编辑器,现在我已经完成了我想在编写时添加自动建议的所有内容,为此,我需要解析当前文件中包含的标头并将它们组织成JSON结构,我正在寻找能给我最佳性能的设计, 但我在这方面几乎没有经验,所以这是我如何开始的,假设我有这个简单的 C 程序
#include<stdio.h>
#include<stdlib.h>
#include<sys/scoket.h>
int main()
{
return 0;
}
我有一个名为 document 的类,它有 3 个数组:
包含每个标题的所有名称,其内容更改 根据我的陈述,因此对于上述文档,其内容是
"斯特迪奥" "斯特德利布" "斯科克特">
- 保存从第一个数组中列出的 JSON 文件获得的所有建议并组织它们,并识别函数参数的类型,以及每个建议的注释等。
- 持有匹配建议,并根据内容不断变化 正在键入。
正如我所说,我没有经验,也没有读过他们是如何做到的,但除了 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 - 使用各种钩子直接钩接到
clang
或gcc
来处理它们的内部解析树(我相信这就是 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) 的东西,我预计。
- 为什么如果我添加这一行,我的程序会不断询问值
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- Qt - 为什么Visual Studio 2019在qml资源中添加10Mb文件后无法再编译我的项目?
- 为什么我的双变量通过添加 c++ 显示 nan?
- UE4 - Visual Studio在我从编辑器添加新的c ++文件后无法打开任何源文件 - UBT_COMPILED
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 如何将外部 dll 添加到我的 VS2019 项目?
- 谷歌测试发现在macOSX上添加并运行了我的所有测试两次
- 如何确保我的节点被添加到链接列表中
- 我应该在服务模板中的什么位置添加自己的代码?
- 在我的 CLR 项目中添加包含会导致无法在启用 /clr 的情况下编译 WLR
- 为什么我的代码在添加不相关的代码行后工作方式不同?
- 将 std::文件系统头文件添加到我的程序时出现编译错误
- 如何使用 Xcode 8.2.1 在我的项目中添加 cpprestsdk 库
- 该函数不会向我的 bst 树添加任何内容
- 是否可以将 VBA 编程环境添加到我的C++应用程序?
- 尝试使用帖子将数据添加到我的MySQL数据库中
- 如何将选项卡添加到我的选项卡控件(WIN32 API C++ GUI)
- 无法在QList中添加我的类
- 在c++中添加我的DLL到Visual Studio项目中