首先说,这篇文章是很久很久很久以前写的,后来觉得没啥技术含量,就没发。今天放到这儿赚个眼球,主要目的还是征名,CPPBLOG网友一定要给力哦!
征名:
1. LiteEdit
2. EditLite
3. EverEdit
4. EditWin
5. MegaxEdit
正文:
-------------------------------------------------------------------------------------
1. 什么是代码自动完成1
首先我们先来下个定义.不要小瞧这个,没有这个定义,我们很容易迷失在功能的海洋之中.所谓代码自动完成既是
在用户输入或者修改的时候,能够根据光标前后位置的文本信息, 从[事先准备好]的查找表中找出最匹配的过程.
注意:我们在这里用了[事先准备好]这个词.
2. 难点分析
A). 怎么查找?
B). 从什么样的表中查找?
C). 内存占用怎么样?
D). 如何快速的显示出最匹配的结果?
我想上面的几个问题是大多数人的第一印象.确实,在我做这项工作之前,我尝试了写了几个数据结构来表达这样的操作.
什么三叉,二叉树啊,可是最后发现都比较麻烦。
不过,这些尝试让我觉得我写的东西像个东西...什么呢? 这不就是个数据库查询嘛!!
经过一番周折(其间过程不述), 选用了sqlite3作为数据库,关于sqlite3是什么,本文不作具体描述.
那么上面的几个难点就迎刃而解了.我们来看一下.
A). 怎么查找?
这个就简单多啦, select * from table where keyword like 'hint%', 其中的hint就是用户输入或者修改的前后文文本信息.
B). 从什么样的查找表中查找?
不管了,当然是数据库.
C). 内存占用怎么样?
这个....我测试,一个表里面5万条数据,嵌入到程序之中后,内存增加2M-3M左右.
D). 如何快速的显示出最匹配的结果?
因为使用了数据库,所以只显示头几条就可以了.当然可以分页显示全部拉.因为sqlite支持limit语句.
到了这儿,我们可以知道上面的几个难点都不是难点了,甚至很Easy.
不过,有一个问题,加入数据库当中有好几万条甚至数十万条,那么怎么办呢?
告诉你,没有解决办法!
不过,我们要学会避开这些问题.比如,笔者做了一个可以根据用户的输入即时提示用户可能输入的单词的Sample,包含常用的单词,分词,复数,大约有10万个左右吧.
在我的程序中,甚至Debug版本中,都可以即时的显示出来,不管你输入多块,还有一点就是内存占用只增加了几百K. Why?
呵呵,其实很简单,我创建了26张表. 聪明的读者应该马上猜到了, 开头为a的单词放到一张表,开头为b的单词放到另一张表,其实就是一个简单的hash,写查询的时候,这样.
sprintf( sql, "select word from %c_wordlist where word like '%s%%' limit 0, 10", buf[0], buf );
效果不错哦~~~`
采用上面的做法,你可以想SourceInsight那样,把一个库,或者整个windows sdk扫描出来做好符号库,进行简单的自动完成...hahahaha
选用数据库的最大的优点是可扩展性极佳.
3).比较麻烦的一点: 如何完成文件内的词汇?
2)上面说的都是事先准备好的表. 3)所提及的则是根据该文件要动态生成的表.
其实上面两者都是事先准备好的表,只不过一个狭义的,一个是广义的而已.
说它比较麻烦,因为没做过的都会有个直观思路,就是扫描整个文件,然后放入数据库中就完事了啊.
其实不然,直接扫描时最偷懒的做法,也是最有效的.
在这里,我给一个简单的解决方案,不过还没没来得及去写.
方案如下:
在做词法分析的时候,我们都会分析出来一些既不是关键字也不是字符串或者其它的state的[单纯的文字].....懂了吗?这些单纯的
文字就是我们要可能自动完成的词汇.
这样,我们在分析的时候,只要把[ 词汇->文件->代码行 ]这样的信息存入到指定的表中,就可以了.甚至只存入词即可。
添加行或者删除行的时候,更新该表就可以了.
在显示的时候,因为一个文件可能关联好几个自动完成Database,那么设定好优先级,本文件内的很显然具有最高优先级.其它要么显示
要么不显示.要么只在注释中显示.....
每隔一段时间就扫描一次文件,如果文件不是太大的话,效率应该不错。
-----------------------------------------------------------------------
后记,我曾经做了一个sample,后来换电脑了,就不知道弄哪去了。
posted on 2011-01-04 20:21
megax 阅读(2991)
评论(26) 编辑 收藏 引用