我正在编写自己的c / c ++编辑器,现在我已经完成了在写作时想要添加自动建议的所有内容,为此我需要解析当前文件中包含的标题并组织他们进入JSON结构,我正在寻找能给我带来最佳性能的设计,但我几乎没有这方面的经验,所以这就是我开始它的方式,假设我有这个简单的c程序
#include<stdio.h>
#include<stdlib.h>
#include<sys/scoket.h>
int main()
{
return 0;
}
我有一个名为document的类,它有3个数组:
包含每个标头的所有名称,其内容会发生变化 基于我的inculde声明,所以对于上面的文档,其内容是
“标准输入输出” “STDLIB” “SCOKET”
正如我所说,我没有经验,我没有读过他们是如何做到的,但除了JSON部分之外,他们是如何向IDE添加自动建议的?
我也很感激一些提示可以帮助我改进这个设计甚至废弃它。
ps:如果有人想知道为什么JSON,因为我要制作它的在线版本!
答案 0 :(得分:1)
步骤1. A)编写一个符合C的解析器,能够导航CPP(不是C ++,CPP)预处理器操作符的迷宫。
OR
步骤1. B)利用现有的,符合标准的C编译器为您进行解析,可能通过以下方式:
cpp -E
,然后解析其CP语言输出已经“白化”的C语言输出gccxml
并解析其XML输出http://gccxml.github.io/HTML/Index.html clang
或gcc
来处理它们的内部解析树(这就是XCode为其实时处理做的事情,我相信) - http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/Print_version {{3 }} 步骤2.确定编辑器中点(光标位置)的当前上下文的内容; e.g。
.
运算符对一个,并且需要一个成员(方法,字段)名称?这部分你可能会使用一些语法提示而不需要调用一个完整的编译器,并且可能有点命中。
步骤3.查找该点范围内的所有定义,并满足用户可能希望进入该类型的类型要求。此列表可能包括头文件,当前文件中的值或函数/方法中的本地范围内的值。
步骤4.当用户开始输入时,将选择范围缩小到仅满足2中确定的类型的选项,该类型以字母中已输入的字母开头(尽管您可能想要折叠大小写,即make它不区分大小写,并且可能忽略_
下划线,因为它们在不同的库之间不一致地使用等等)
步骤1. C)在项目中的文件集合中构建所有“看到的单词”的哈希表(可能是大小写折叠和_
- 删除),并简单地将该列表提取到那些开头的单词到目前为止输入的字母,无论其类型如何。
信不信由你,我对C
代码的相对罕见的尝试,我大多不打扰在Emacs中启用上面的完整堆栈(1B-4),我只是使用dabbrev-expand
选项(M-/
)在这里的工作方式与(1C)类似,而且通常对结果感到满意。如果您正在编写专门用于处理C和C ++代码的编辑器,那么您可能希望尝试更多类似于(1B-4)的内容,我期待。