| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6450 人关注过本帖, 2 人收藏
标题:[开源] ★-----C语法高亮程序-------★
取消只看楼主 加入收藏
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
结帖率:100%
收藏(2)
 问题点数:0 回复次数:11 
[开源] ★-----C语法高亮程序-------★
见论坛里雨中飞燕和RockCarry都做了语法高亮程序,偶一时手痒也做了一个。

用了5天时间完成,一天时间查阅ANSI C资料,做总体设计,一天时间编码,三天时间测试,除虫,写文档。
今天解决了处理预编译指令时的一个BUG,没有再发现错误,移植到windows下编译出win32版。

软件以GPL协议发布,任何人有权向发布者索取源代码。
任何人有权做出修改并重新发布自己的版本,但也必须以GPL协议发布。
你可以从这里下载移植后的windows/dos版源码,以及原始的Unix版源码。
还可以向[email]vx.fish@[/email]发送邮件,报告bug或索取源码。

这是Unix版源码,提供最丰富完整的文档资料:
fish-src-beta-0.1.tar.gz (5.39 KB) Unix版源码


这是移植后的windows版源码:
fish-src-beta-0.1.rar (20.62 KB) windows/dos版源码


考虑到windows下编译不方便,这里提供编译后的win32版可执行程序:
fish_win32.rar (15.4 KB) win32版可执行程序

                      (17:28分修改配置文件bccn.conf后重新上传)

Unix类系统用户在下载源码后可以编译安装:
# make
# make install
详情请阅读附带的INSTALL文件,安装后可以使用命令man fish获取联机帮助

windows用户请使用fish -h获取帮助,也可以阅读楼下的使用示例。

《========================================================================》
                                       NEWS
2008.05.28  晚上19:30
       更新了所有版本中bccn.conf的小错误。之前在颜色设置中误删字符a,使得预处理不能着色,
全部重新修改后上传,真是一失手成千古恨。

《========================================================================》

[[it] 本帖最后由 VxWorks 于 2008-5-28 19:33 编辑 [/it]]
搜索更多相关主题的帖子: 高亮 语法 windows 源代码 BUG 
2008-05-28 16:56
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
windows下使用实例:
切换到fish.exe所在文件夹下在命令行下运行fish.exe
fish  -i bc.c  -c bccn.conf  -o bc.txt
bc.c是下面显示的c程序,用来做测试用的,使用选项-i指定要高亮的源程序输入
bccn.conf是为bccn.net论坛写的配置文件,你可以用记事本打开修改配色方案。
-o指定输出文件,这里输出文件是bc.txt

可以使用下面的命令获取帮助:
fish   -h
将输出的bc.txt直接贴上论坛就可以了。

生成的bc.txt内容是:
程序代码:
#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
        char *dest;
        const char *SectionName=sections[index];

        assert(opt=='s' || opt=='e');
        if(opt == 's')
                dest=tag_list[index].start;
        else 
                dest=tag_list[index].end;

        while(*buf != '!' && *buf != '\0')
                ++buf;

        if(*buf == '\0')
        {
                if(opt == 's')
                        fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
                else
                        fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
                exit(1);
        }

        strncpy(dest,++buf,40);

        return 0;
}
将输出的bc.txt直接贴出来即可:


#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
        char *dest;
        const char *SectionName=sections[index];

        assert(opt=='s' || opt=='e');
        if(opt == 's')
                dest=tag_list[index].start;
        else
                dest=tag_list[index].end;

        while(*buf != '!' && *buf != '\0')
                ++buf;

        if(*buf == '\0')
        {
                if(opt == 's')
                        fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
                else
                        fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
                exit(1);
        }

        strncpy(dest,++buf,40);

        return 0;
}

当然也可以向下面这样在bc.txt文件首尾加入添加边框。
添加后的内容是:
程序代码:
#include<assert.h> #include<stdlib.h> int get_tag(char *buf, int index,char opt) { char *dest; const char *SectionName=sections[index]; assert(opt=='s' || opt=='e'); if(opt == 's') dest=tag_list[index].start; else dest=tag_list[index].end; while(*buf != '!' && *buf != '\0') ++buf; if(*buf == '\0') { if(opt == 's') fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName); else fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName); exit(1); } strncpy(dest,++buf,40); return 0; }
添加边框后的效果如下:

#include<assert.h>
#include<stdlib.h>
int get_tag(char *buf, int index,char opt)
{
        char *dest;
        const char *SectionName=sections[index];

        assert(opt=='s' || opt=='e');
        if(opt == 's')
                dest=tag_list[index].start;
        else
                dest=tag_list[index].end;

        while(*buf != '!' && *buf != '\0')
                ++buf;

        if(*buf == '\0')
        {
                if(opt == 's')
                        fprintf(stderr,"配置文件错误:%s\nstart = \n",SectionName);
                else
                        fprintf(stderr,"配置文件错误:%s\nend = \n",SectionName);
                exit(1);
        }

        strncpy(dest,++buf,40);

        return 0;
}


[[it] 本帖最后由 VxWorks 于 2008-5-28 18:13 编辑 [/it]]

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:05
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
sigh,3楼贴出来的着色又有问题,还是预处理。
不过还好,这次问题不在程序,是配置文件错了,修改方法:
用文本编辑器打开bccn.conf找到[preprocess]段,
将start =[color=020f0]修改为start =[color=a020f0]
附带的另一个html.conf没有问题,可以生成完整的html网页。

楼上的,我的着色是模仿大多数编辑器的方案,只对关键字,常量,注释,预处理指令进行处理。

[[it] 本帖最后由 VxWorks 于 2008-5-28 17:25 编辑 [/it]]

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:21
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
看6楼
或者重新下载,我已经更新了fish_win32.rar文件

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:33
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
大家可以使用下面的命令:
[VxWorks @ WinXP] D:\home\fish_win32#fish -i bc.c 
只指定输入,默认使用html.conf配置文件输出一个web网页,然后就可以将着色后的代码贴到自己博客或个人空间。
你也可以建立自己的配置文件,通过-c指示程序读取。

关于命令行选项的用法使用命令fish -h获取帮助。
Unix类用户man fish可以获取更详细的资料。

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:39
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
[bo][un]Loli[/un] 在 2008-5-28 17:37 的发言:[/bo]

请问一下楼主,有考虑过什么标签合并的问题么?


不懂你的意思。什么叫“标签合并”?

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:41
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
所谓的合并原来是这个意思。
这个实现起来不难,延迟输出结束标签就可以了,通过变量记忆上一次着色。

不过我觉得意义不大,毕竟代码中这种连续的情况不常见,所以不会造成太大的浪费。
如果空闲时间多,我会在正式版中加入这种功能。

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:51
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
如遇到问题请仔细阅读2楼的使用示例。

[[it] 本帖最后由 VxWorks 于 2008-5-28 18:14 编辑 [/it]]

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 17:58
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
我打算下一步做语法分析,让C在我的解释器中像BASIC那样解释执行。
所以我这里的程序是先按照ANSI C标准,构造C词法的正则表达式,然后用lex生成词法分析器,这是懒人的做法,缺点就是生成的代码又臭又长。

下一步是用yacc做C的解释器还是计算器,或者是SQL解释器,正在考虑。‘

如果有人对编译原理有兴趣,想自己实现一个高亮程序,可以在后面回帖,我可以写篇文章。这东西只想实现基本功能很简单,会lex的一个小时就可以做出来。

20楼的,如果手工写代码实现DFA,确实可以这么写。

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-28 20:10
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
25楼的把你30行代码实现的解释器发出来看看,让我们好开开眼界。

26楼,用脚本做词法分析当然简单,脚本语言天生具有处理字符串的卓越能力,像perl这样的脚本语言直接支持正则表达式,就不用像C这样需要用lex生成正则表达式处理代码,有时间我用perl写一个语法高亮,展示perl的威力。不过要做编译器就不能用脚本语言了,还是得靠C/C++这种底层语言。

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-29 18:54
快速回复:[开源] ★-----C语法高亮程序-------★
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048991 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved