Scintilla如何自定义语法分析器-VS2010


本文的说明基于以下平台开发测试 scintilla353/VS2010/WIN7 

平时做卡片项目的时候经常要编写脚本进行前期调试,因为脚本语言是自己针对智能卡行业进行封装的小众平台,所以编写脚本的时候比较痛苦,什么函数智能提示,什么关键字高亮,什么自动补全功能等,都只能是望码兴叹,无能为力。虽然可以使用notepad++进行自定义语言的配置后使用,但用起来总觉得不太顺手,一直有想法要自己做一个专属语言的编辑器。前一阵,终于安排出一点业余时间,琢磨了半个月,做出一款属于我自己的编辑器。

开发编辑器的时候,遇到的一个比较棘手的问题是如何自定义Scintilla的语法分析器,网上关于这部分的资料很少,大概浏览了Scintilla官网,貌似也没有发现该部分的阐述,所以研究花了不少时间,在这里和大家分享一下,给有需要的朋友省点跳坑的功夫,

只是本人的一些经验,如果文章有不当的地方,欢迎赐教laugh

本文不对怎么使用Scintilla库进行说明,如果不知道怎么使用Scintilla,网上搜一下,有很多内容,下面开始介绍怎么自定义Scintilla语法分析器

第一步  scintilla\lexers或者\scintilla\src下添加LexXXX.cxx 文件 

    例如:我添加的文件是LexSF.cxx

    该文件内容具体格式可以当前目录下的其他LexXXX.cxx文件

    下面的代码是我编写的LexSF.cxx文件里拷贝出来的,具体的代码在函数ColouriseSFDoc里实现

//Scintilla source code edit control

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>
#include <windows.h>

#include "ILexer.h"
#include "Scintilla.h"
#include "SciLexer.h"

#include "WordList.h"
#include "LexAccessor.h"
#include "Accessor.h"
#include "StyleContext.h"
#include "CharacterSet.h"
#include "LexerModule.h"

#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif

static const char * const SFWordListDesc[] =
{
	0
};

static void ColouriseSFDoc(
	unsigned int startPos, int length, int initStyle,
	WordList *keywordlists[],
	Accessor &styler)
{
// 这里编写自定义代码 
}

LexerModule lmSf(SCLEX_SF, ColouriseSFDoc, "SF", 0, SFWordListDesc);

第二步 scintilla\src下的Catalogue.cxx里添加LINK_LEXER(lmXXX);

   例如:LINK_LEXER(lmSF);

第三步 scintilla\include下SciLexer.h添加 #define SCLEX_XXX XXX

   例如:#define SCLEX_SF 222

第四步 编译,这里只针对VS2010说明

    1. 找到 VS2010自带的工具Visual Studio Command Prompt (2010),运行这个工具

    2. 切换工作路径到scintilla\win32下

      cd scintilla\win32

    3. nmake -f scintilla.mak clean

    4. nmake -f scintilla.mak 

编译完成后,在scintilla\bin目录下生成SciLexer.dll,将此动态库应用于你的工程即可。

另外scintilla的源码不方便调试,可使用OutputDebugString函数和DebugView工具来显示调试信息,改进程序。

下面分享图片一张cool

 

暂无评论

注册用户登录后才能发表或者回复评论,请先登录 注册。