本站将启动自己编写的语法高亮程序,该程序使用flex编写,只在Linux平台下测试,使用方法参考下文介绍。

遥想当年,第一次听说flex是学习编译原理时,当时问老师一个问题,结果老师将她的QQ号给我,后来给了我许多关于编译原理的资料,但是有许多名词不认识,像lex、flex、yacc、bison,等等。那个时候我陷入GNU/Linux中不能自拔,凡是跟它沾点边的东西,我都会去研究的。结果搞个简单的计算器,结果许多人不明白我在干什么,也不知道研究这些东西有什么用,这个结果让我感到十分无趣。——还不如认真分析LL、LR、SLR呢,这样或许在考试前我会大受欢迎。事实是我放弃了实践,全面应付考试,满足了虚荣心,结果编译原理课程设计时都没能力使用lex和yacc做。而在上机课堂中,我购买了一块ARM开发板,从此踏上了嵌入式这条不归路。

我尝试过许多的语法着色插件,但不太理想。后面一次偶然的机会,看到有博客说使用html语法来写死,这样到哪里都能正常显示代码颜色。由于很久没碰正则表达式、flex这些东西了,所以用了好几天功夫才有点入门。但又到投入到其它工作中,因此这个小东西是点到为止,不想太深入研究。

这个代码是从《纯C论坛·电子杂志》上看到的。不过作者使用了css,而我对css研究不深入(到建站很久以后才意识到css的重要性),而且作者在网上公开的源代码没法找到,因此只好使用另外一种方式来实现了。

程序其实不难,首先使用flex进行词法分析,分析各种类型的单词,比如C语言关键字、字符串、注释,等等,之后一一加上不同颜色。颜色方面,主要是参考大部分编译器(编辑器)对C语言的着色(如关键字为蓝色)。在本站logo制作的一些笔记中提到的测试例子,里面的注释显示失败,经检查,是由于HTML语法特性造成的,因为在HTML中,无论有多少个空格(包括t),都显示一个空格。解决方法是分析出注释中的空格,使用“ ”代替,另外,像“”等等,也需要使用“&lt”(less than?)、“&gt”(great than?)代替。

程序已测bug:

如果源代码中最后一行为C++“//”风格的注释,但不能高亮该行,解决:源代码多加一行空行。这是由于“LINECOMMENT “//“.*n”造成的。但是去掉“n”,则这种风格的注释又会无故多空出一行。

数字没有匹配,如果只使用程序中的NUMBER,则凡是数字都会着色,包括tmp1和tmp2这种非“数字”中的数字也会着色。干脆不着色了。

另外,我在这个基础上再修改一下正则表达式,为GNU/Linux下的配置文件及Makefile文件着色——因为Shell脚本用得不多,暂时不做。下面是这些代码的问题及bug:

配置文件中注释多使用井号“#”,这与root用户提示符“#”相同,而且两个“#”后通常会留一空格,因此无法区别,除非做两套代码。

像Makefile中常见的$(foo)等等,开始使用“.*”匹配,但是对于Makefile中的“($(DEBUG), y)”及Shell中常见的$(foo+i,(bar-i))等等匹配不理想,后来改用单词(WORD)区别,这样效果好一些。

对于Makefile中的target着色也不理想,像“all:”、”clean:”等等“伪目标”可以认为是关键字,但其它的如“foo.o:”等也是target,于是想到使用单词匹配,不过不知道如何匹配(以冒号(”:“)结尾的单词在lex中的正则表达式是什么?如果你知道,告诉我一声)。

使用方法: 1

2

3$ lex foo.lex

$ gcc lex.yy.c -o code-color

$ ./code-color < you-code.c > you-code.html

这样,直接打开you-code.html,复制里面的代码到网页编辑器中就可以了。 由于能力有限且急用于实际中,因此匆匆完成,随着学习领域的增多及知识的加深,在以后应该会不断修改的。毕竟,现在这个小工具还能使用。

附上源代码:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138/***********************************************

* C语言代码语法高亮工具

*编译方法:

* $ flex code2html.lex

* $ gcc lex.yy.c -o code2html

*

* 使用:

* $ ./code2html < test.c > test.html

* 将test.c生成test.html,打开test.html,

* 复制内容到网页编辑器(即见即所得)中即可。

* 并不是所有编辑器都支持。

*

* log & bug:

1、注释中多个空格识别不出来。==>在代码中添加对注释空格的处理。

2、连续2个(或多个)tab键识别不出来。==>暂时用空格代替。

3、2011-04-21

尝试不使用blockquote,直接使用div。

修改显示方式,背景色为浅色,默认字体为黑色。

添加Makefile,直接make即可生成code2html文件。

4、2011-04-25

数字着色问题未解决==>解决

修改单词规则:WORD [a-zA-Z_]+{DIGIT}*,能识别tmp1,数字在前识别不到

5、为解决数字着色问题,连带一个bug,就是头文件中“.”也被识别为“数字”中的小数点

6、

**********************************************/

%{

#include

#define FALSE 0

#define TRUE 1

int yywrap();

%}

DIGIT [0-9]

XDIGIT [0-9a-fA-f]

ODIGIT [0-7]

HEX 0(x|X){XDIGIT}+

OCT 0{ODIGIT}+

/*DEC (0(\.{DIGIT}+)?)|([1-9]{DIGIT}*(\.{DIGIT}+)?)*/

DEC [0-9.]+

NUMBER {HEX}|{OCT}|{DEC}

WORD [a-zA-Z_]+{DIGIT}*

WHITESPACE [\t]+

NL \r?\n

STRING \"[^"\n]*\"

CHAR \'[^'\n]*\'

QUOTATION {STRING}|{CHAR}

KEYWORD "while"|"do"|"switch"|"case"|"break"|"default"|"continue"|"for"|"goto"|"if"|"else"|"return"|"typedef"|"sizeof"

TYPE1 "char"|"short"|"int"|"long"|"float"|"double"|"signed"|"unsigned"

TYPE2 "struct"|"union"|"enum"|"void"|"const"|"static"|"extern"|"register"|"auto"|"volatile"

TYPE {TYPE1}|{TYPE2}

PREWORD "#define"|"#include"|"#error"|"#if"|"#elif"|"#else"|"#ifdef"|"#endif"|"#ifndef"|"#undef"|"#line"|"#pragma"

LINECOMMENT "//".*\n

%%

"

">" {printf(">");}

\t {printf("        ");}

" " {printf(" ");}

"&" {printf("&");}

{printf(" ");}

"/*" {

char c;

int done = FALSE;

printf("\n");

ECHO;

do{

while ((c=input()) != '*')

{

if (c == '\n')

printf("
\n");

else if (c == ' ')

printf(" "); /* space in the comment */

else

putchar(c);

}

putchar(c);

while((c=input()) == '*')

putchar(c);

if (c=='\n')

printf("
");

putchar(c);

if (c == '/')

{

done = TRUE;

}

}while (!done);

printf("");

}

{LINECOMMENT} {printf("%s
\n", yytext);}

{QUOTATION} {printf("%s", yytext);}

{KEYWORD}|{TYPE} {printf("%s", yytext);}

{PREWORD} {printf("%s", yytext);}

{NL} {printf("
\n");}

{WORD} {ECHO;}

{NUMBER} {printf("%s", yytext);}

{WHITESPACE} {ECHO;}

/*{WHITESPACE} {printf("        ");} */

%%

int main(void)

{

printf("\n");

printf("

\n");

printf("\n");

printf("

\n");

#ifdef BACKGROUND_COLOR

//printf("

\n");

printf("

\n");

#else

printf("

\n");

#endif

//printf("\n");

printf("\n\n\n");

yylex();

#ifdef BACKGROUND_COLOR

//printf("

\n");

printf("

\n");

#else

printf("

\n");

#endif

printf("\n");

printf("\n");

}

int yywrap()

{

return 1;

}

本文及源代码可自由使用而不用告知作者,当然,我作了修改也无需再公布出来。下面是一个关于log应用的例子:

#include

#include

#include

#include

#include

#include

#include

#include             /**

#define MAXFILE 65535

int main(void)

{

pid_t pid,sid;

int i;

int fd;

int len;

char *buf = “This is a daemonn”;

len = strlen(buf);

pid = fork();

if (pid

{

perror(“fork error”);

exit(1);

}

else if (pid > 0)

exit(0);

openlog(“daemon_test”, LOG_PID, LOG_DAEMON);

sid = setsid();

if (sid

{

syslog(LOG_ERR, “%sn”, “setsid”);

exit(1);

}

sid = chdir(“/“);

if (sid

{

syslog(LOG_ERR, “%sn”, “chdir”);

exit(1);

}

umask(0);

for (i=0; i

lose(i);

while (1)

{

fd = open(“/tmp/daemon.log”, O_CREAT|O_WRONLY|O_APPEND,0600);

if (fd

{

syslog(LOG_ERR, “open”);

exit(1);

}

write(fd, buf, len+1);

close(fd);

sleep(10);

}

closelog();

return 0;

}

约八年后的PS:本文年代久远,且手动语法着色过于烦琐,已舍弃。

主要参考资料:

1、tinyfool的文章:基于Flex的c/c++代码加亮工具(源代码开放)(http://blog.csdn.net/tinydust/archive/2005/04/15/348946.aspx),该文章在05年发表,大部分网站都有转载,可惜源代码下载地址失效了。本程序以该文章代码为基础。

2、CU帖子:CU论坛C语言代码语法高亮工具(http://bbs.chinaunix.net/thread-879964-1-1.html)。

3、代码发芽网:http://fayaa.com/code/

4、Flex、正则表达式,网上资料大把,不过都是基础的多,想深入需要慢慢搜索、研究。

c语言高亮字符,C语言语法高亮工具相关推荐

  1. c语言高亮字符,C语言必背18个程序+190例--语法高亮

    <C语言必背18个程序+190例--语法高亮>由会员分享,可在线阅读,更多相关<C语言必背18个程序+190例--语法高亮(111页珍藏版)>请在人人文库网上搜索. 1.C语言 ...

  2. vim php 语法高亮,linux vim配置文件(语法高亮)

    " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on "配色方案 colorscheme torte ...

  3. 图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

    GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件.其开发团队也是非常活跃,此软件还在不断的发展和更新中,变得越来越强大.目前已经有164个模块,而 ...

  4. Vue页面代码高亮展示之Prism语法高亮工具

    基本介绍 Prism 是一款轻量级.可扩展的语法高亮工具,在构建时考虑了现代 Web 标准.它被用于数百万个网站,包括您每天访问的一些网站. Prism 支持自定义扩展代码的语言.主题和插件选项,勾选 ...

  5. c语言音标字符,c语言常见英语单词带音标-20210408030123.docx-原创力文档

    集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN] 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN] C语言常见英语单词带音标 main [m ...

  6. c语言音标字符,C语言32位关键字及音标

    C语言32位关键及音标和解释 C 语言 32 位关键字及音标 关键字 auto int double long char float short signed unsigned struct unio ...

  7. c语言摄氏度字符,c语言摄氏度与华氏温度如何转换

    c语言摄氏度与华氏温度如何转换西门子新闻内容   查阅次数:4720   更新时间: 2019-11-24 11:16 摄氏度与华氏度的转换公式为C=*5/9. 不少人看到这样的转换公式就会将摄氏度C ...

  8. vim配置php语法高亮

    安装vim之后,将php语法高亮插件 php.vim,放到/usr/share/vim/vimfiles/syntax 目录下 php语法高亮插件在这里下载:http://www.vim.org/sc ...

  9. vscode写php高亮,写了一个Hy的vscode语法高亮插件

    -------2018 8 3----------- 把函数名和参数改了,正则有点古怪,参考自带的lambda表达式才搞定 但彩色括号走了弯路,各种配图有彩色括号的插件其实很少是自己搞的,其实只要再装 ...

  10. mfc c语言 编辑器,语法高亮编辑控件Scintilla在MFC中的简单使用

    项目中要使用代码编辑器,搜索之后,发现了强大的编辑器控件Scintilla. 1.简介 Scintilla是一款开源的语法高亮编辑器控件,官方网站:http://www.scintilla.org/. ...

最新文章

  1. maven打包常用的几个插件
  2. 看看人家 SpringBoot 的全局异常处理多么优雅...
  3. python有道翻译-使用python2爬取有道翻译
  4. 【转】!C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别
  5. 开发里程碑计划_里程碑——让你轻松控制项目进度
  6. .net core高并发_高并发下的Node.js与负载均衡
  7. java设计按月每天签到_活动攻略|新同学新签到,欢乐福利全都要!
  8. php终止符,关于php中嵌入html代码时结束符“?”位置为什么这样放置?
  9. fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
  10. a minimal solution(30,31,32)
  11. cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
  12. 证券公司八大业务最全梳理
  13. 工作中遇到的印象深刻的Bug(APP端)
  14. python3+selenium框架设计04-封装测试基类
  15. unsw计算机科学的挂科率,恐怖挂科率创新高!UNSW期中惊现大面积挂科,商科一课程Fail率接近60%,朋友圈一篇哀嚎!...
  16. 摩托罗拉安装谷歌Play商店,安装服务框架谷歌Google,支持机型x30,S30,razr 2022,全机型安装谷歌
  17. SAP假脱机打印解决方法
  18. ftp上传工具中文版,6款最好用的ftp上传工具中文版,使用指南
  19. Linux中断的unblance问题
  20. 基于Youtube-8M的视频场景分类

热门文章

  1. 百度地图API详解之驾车导航
  2. 根据输入的姓氏,随机获取对应的男生和女生姓名
  3. day02-08 python基础语法
  4. 网站建设的完整教程以及步骤,建议收藏!
  5. 优秀java程序员必须具备的技术技能
  6. 魔兽、星际、红警的经典对比
  7. SSL证书以及其验证过程
  8. U盘文件都变成exe文件怎么办(已解决)
  9. 计算机执行优盘上程序的过程,U盘打开后,文件变成exe执行文件怎么办-电脑自学网...
  10. 后盾网 html语言视频教程,后盾网HTML5视频教程-