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

标签 c++ c

<分区>

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

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

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

  1. 保存了每个包含的header的所有名称,其内容变化 根据我的 inculde 陈述,以上文件的内容是

    “标准输入法” “标准库” “斯科特”

  2. 保存从第一个数组中列出的 JSON 文件中获得的所有建议并对其进行组织,并识别函数参数的类型,以及每个建议的评论等。
  3. 持有匹配的建议,它会根据什么不断变化 正在打字。

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

我也很感激一些可以帮助我改进这个设计甚至废弃它的提示。

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

最佳答案

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

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

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

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

这部分您可能会在不调用完整编译器的情况下使用一些语法提示,并且可能会有点碰运气。

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

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


第 1 步。C) 为项目文件集合中的所有“看到的单词”建立一个哈希表(可能是大小写折叠和 _-eliding),然后简单地将该列表筛选到那些以到目前为止键入的字母开头的单词,无论类型如何。

信不信由你,对于我相对罕见的 C 代码尝试,我基本上不会在 Emacs 中启用上面的 (1B-4) 的完整堆栈,我只是使用 dabbrev-expand 选项 (M-/) 在这里像 (1C) 一样工作,并且通常对结果不满意。不过,如果您正在编写一个专门用于处理 C 和 C++ 代码的编辑器,您可能想尝试更像 (1B-4) 的东西,我希望如此。

关于c++ - c 向我的编辑器添加自动建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21264595/

相关文章:

c++ - 传递函数指针

c++ - 有没有更快的方法使用命令行在 C++ 中加载文件?

c++ - 阻止对文件的访问

c - C语言算法——谁是获胜队

python - 在 Python 中解析 C 函数

c - popStack 弹出我没有push的数据(stack adt)

c++ - 从外部访问静态成员并通过继承C++

c++ - Gtkmm - 固定窗口的位置?

c - 使用 ptrace 生成堆栈转储

c - 用C读取和写入二进制文件