C语言代码语法高亮工具——迟思堂工作室 迟思堂工作室

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

关于本页面的说明:

由于HTML中有一些特殊字符,比如“<>”,在HTML有特殊的含义,因而不便使用这个语法高亮来显示本页面,对此很抱歉!

下面的代码经过修改以适应于HTML的显示,为了保持源代码的格式,特意使用HTML中的“<pre> </pre>”,因此直接复制即可使用。

为了显示“<”、“>”、“ ”(空格)需要输入“&lt;”、“&gt;”、“&nbsp;”,而本代码中却需要显示“&lt;”、“&gt;”、“&nbsp;”等(参见下面的代码),为此花费了一点时间来研究。

如果要页面上显示“&lt;”,则需要使用“&amp;lt;”来代替,不然的话,会被HTML解释为“<”。其它的也是同样道理。< p> 本代码可自由使用,但是由此造成的一切结果/后果,与作者无关。如果有更好建议或修改代码中的错误,请移步到迟思堂工作室的主页上留言。

由于这个程序在不断地更新,更新后的代码也不一一修改了。大家宽恕则个。

下面是完整的代码:

 /******************************************************************************************
 *                C语言代码语法高亮工具(非正式最终版本)
 *                                                李 迟(http://www.latelee.org)
 * 介绍:
 * Linux平台下,使用lex工具(一个词法分析器生成工具)编写的C语言语法高亮工具,用于在HTML中。
 * 此方法亦适用于其它场合,如高亮Makefile、Shell脚本,等等。
 * 本文件编码格式为:UTF-8无BOM格式编码
 *
 * 编译方法(假设文件名称为code2html.lex):
 * $ 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键识别不出来。==>用8个空格替换tab键。
 ******************************************************************************************/

%{
#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}+)?)
NUMBER	{HEX}|{OCT}|{DEC}
WORD	[a-zA-Z_]+

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("&lt;");} ">"	{printf("&gt;");}
\t	{printf("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");}
" "	{printf("&nbsp;");}
"&"	{printf("&amp;");}
&nbsp;	{printf("&nbsp;");}

"/*"	{
	char c;
	int done = FALSE;
	printf("<span style=\"color:#008000\">\n");
	ECHO;
	do{
		while ((c=input()) != '*')
		{
			if (c == '\n')
				printf("<br/>\n");
			else if (c == ' ')
				printf(" ");	/* space in the comment */
			else
				putchar(c);
		}
		putchar(c);
		while((c=input()) == '*')
			putchar(c);
		if (c=='\n')
			printf("<br/>");
		putchar(c);
		if (c == '/')
		{
			done = TRUE;	
		}
	}while (!done);
	printf("</span>");
}

{LINECOMMENT}		{printf("<span style=\"color:#008000\">%s</span><br/>\n", yytext);}
{QUOTATION}		{printf("<span style=\"color:#ff00ff\">%s</span>", yytext);}
{KEYWORD}|{TYPE}	{printf("<span style=\"color:#0000ff\">%s</span>", yytext);}
{PREWORD}	{printf("<span style=\"color:#0000ff\">%s</span>", yytext);}
{NL}		{printf("<br/>\n");}
{WORD}		{ECHO;}
{NUMBER}	{ECHO;}
{WHITESPACE}	{ECHO;}
 /*{WHITESPACE} {printf("        ");} */
%%

int main(void)
{
	printf("<html>\n");
	printf("<head>\n");
	printf("</head>\n");
	printf("<body>\n");
	printf("<blockquote>\n");
	/* 使用背景色:黄色 */
	//printf("<blockquote style=\" background-color:#f9f7cc\">\n");
	//printf("<!--本语法高亮工具由Late Lee(http://www.latelee.org)使用lex编写-->\n");
	printf("\n<!--this tool is written by Late Lee(http://www.latelee.org) using lex.-->\n\n");
	yylex();;
	printf("</blockquote>\n");
	printf("</body>\n");
	printf("</html>\n");
}

int yywrap()
{
	return 1;
}
如果你想使用这些代码但又担心,可以在这里下载原始的代码包(bz2格式,在Linux下使用tar jxf来解压,md5sum为03d5f2cd96b7825f6c4088adc7401ca8):

code2html.tar.bz2-latelee.org

                                                                                                                                                                                                                              祝你今天有个好心情!

                                                                                                                                                                                                                                 迟思堂主人:李迟