posts - 76,  comments - 621,  trackbacks - 0
首先说,这篇文章是很久很久很久以前写的,后来觉得没啥技术含量,就没发。今天放到这儿赚个眼球,主要目的还是征名,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 阅读(2988) 评论(26)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理