Tinyfool@Csdn

天行健,君子以自强不息----本Blog内容均可转载,但是作者不放弃版权,转载必须标明作者和原文地址。

用户操作
[即时聊天] [发私信] [加为好友]
TinyfoolID:tinydust
183180次访问,排名405好友3人,关注者10
tinydust的文章
原创 44 篇
翻译 6 篇
转载 0 篇
评论 506 篇
Tinyfool的公告
CodeChina.Org 中国代码网-中国程序员的代码天堂

银杏泰克科技有限公司[站内搜索解决方案]

全能之眼
Tiny同志在配眼镜

微尘程序员网站

最近评论
Vanel:那么这就match我对Yahoo和Google合作的看法了.
其他不举,想不通为什么说话就不能好好说呢?非要加个英文词。match?match?写汉字符合不行吗?现在CSDN里到处充斥着这种文章。风气么。。
lao1000:有点意思
renxinzhi:不能光看眼前的蝇头小利,与Google合作雅虎失掉的是继续前行的动力,本来广告是雅虎的主业,现在(相当于)把广告卖给Google,连雅虎都失去了对自己的信心,那么怎么让广告客户对它坚定信心呢?由于Google与雅虎是天生的竞争对手,而且Google又在合作中占据强势地位,对两者来说是此消彼长的关系,但是肯定是Google上涨。这样不仅会造成雅虎的客户流失,而且也使由于暂时的获利雅虎失去了继续……
bad__ba:个人觉得如果Google耗巨资来制作系统和应用软件的话,也不会只靠广告来收入,软件收费几乎是必然的。
tinydust::)
文章分类
收藏
    相册
    ATinyGBA
    blog用图
    China Mdc2004
    Tinyfool
    Tinyfool的开发日记(RSS)
    Tinyfool的移动开发阵线(RSS)
    Tinyfool的随想录(RSS)
    微尘程序员网站
    联系Tinyfool
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 [原创]基于Flex的c/c++代码加亮工具(源代码开放)收藏

    新一篇: 一个最小的可以工作的Apache有多大? | 旧一篇: 我这10来年(Tinyfool的程序人生)

    大家知道tiny是一个非科班出身的软件开发者,所以,我是没有正式学过编译原理的。在我的职业生涯里面多次想学,但是总有人告诉我那东西没有什么 用处(也是啊!难道我要写个编译器和VC竞争么?),所以我一直没有学。然而后来很多事情改变了我的看法,一方面是正则表达式的广泛用途,另外也是我的虚 拟机项目,我想在里面用自己做的编译器。还有就是我的前同事LEE做的虚拟机的广泛使用等等,让我感受到不管什么技术,总有用武之地。今天凌晨0点多的时候,我又在看《编译原理技术与工具(龙书)》《编译原理和实践》,但是光看书不实践等于零,所以,我想我是不是可以做一个代码加亮工具呢?说做就做,到了清晨5点多的时候,我写完了。下面是代码:

    htmlpre.lex文件,进行预处理把一些在HTML需要转码代码先转码:

    %{
    #include <stdio.h>
    int yywrap();
    %}

    %%
    "<"                {printf("<");}
    ">"                {printf(">");}
    \t                {printf("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");}
    " "                {printf("&nbsp;");}
    &nbsp;                {printf("&nbsp;");}
    %%

    int main()
    {
            yylex();
            return 0;
    }
    int yywrap()
    {
            return 1;
    }

    cpp.lex文件,进行代码加亮:

    %{
    /*
    #
    */

    #include <stdio.h>
    #define FALSE         0
    #define TRUE         1
    int yywrap();
    %}
    DIGIT                [0-9]
    NUMBER                {DIGIT}+
    LETTER                [a-zA-Z]
    WORD                {LETTER}+
    WHITESPACE        [ \t]+
    DELIMITER        [,(){}[]-+*%/="'~!&|<>?:;.#]
    NL                \r?\n
    QUOTATION        \"[^"\n]*\"
    KEYWORD                "auto"| "bool"| "break"| "case"| "catch"| "char"| "cerr"| "cin"| "class"| "const"| "continue"| "cout"| "default"| "delete"| "do"| "double"| "else"| "enum"| "explicit"| "extern"| "float"| "for"| "friend"| "goto"| "if"| "inline"| "int"| "long"| "namespace"| "new"| "operator"| "private"| "protected"| "public"| "register"| "return"| "short"| "signed"| "sizeof"| "static"| "struct"| "switch"| "template"| "this"| "throw"| "try"| "typedef"| "union"| "unsigned"| "virtual"| "void"| "volatile"| "while"| "__asm"| "__fastcall"| "__based"| "__cdecl"| "__pascal"| "__inline"| "__multiple_inheritance"| "__single_inheritance"| "__virtual_inheritance"
    PREWORD                "define"| "error"| "include"| "elif"| "if"| "line"| "else"| "ifdef"| "pragma"| "endif"| "ifndef"| "undef"| "if"| "else"| "endif"
    PREDEF                "#"{PREWORD}
    LINECOMMENT        "\/\/".*\n
    %%
    "/*"                {
                            char c;
                            int done=FALSE;
                            printf("<span class=\"comment\">\n");
                            ECHO;
                            do
                            {
                                    while((c=input())!='*')
                                    {
                                            if(c=='\n') 
                                                    printf("<br/>\n");
                                            else
                                                    putchar(c);
                                    }
                                    putchar(c);
                                    while((c=input())=='*')
                                            putchar(c);
                                    if(c=='\n') printf("<br/>\n");
                                    putchar(c);
                                    if(c=='/') done=TRUE;
                            } while(!done);
                            printf("</span>\n");
                    }
    {LINECOMMENT}   {printf("<span class=\"comment\">%s</span><br/>\n",yytext);}
    {QUOTATION}     {printf("<span class=\"quotation\">%s</span>",yytext);}
    {PREDEF}        {printf("<span style=\"predef\">%s</span>",yytext);}
    {KEYWORD}       {printf("<span class=\"keyword\">%s</span>",yytext);}
    {NL}            {printf("<br/>\n");}
    {WORD}          {ECHO;}
    {NUMBER}        {ECHO;}
    {WHITESPACE}    {ECHO;}
    %%

    int main()
    {
            printf("<html>\n");
            printf("<head>\n");
            printf("<link href=\"mycpp.css\" rel=\"stylesheet\" type=\"text/css\">\n");
            printf("</head>");
            printf("<body>\n");
            yylex();
            printf("</body>");
            printf("</html>");
            return 0;
    }
    int yywrap()
    {
            return 1;
    }

    test.cpp文件,用来测试的加亮效果的小程序:

    /*
     *  just  test  my  code  lighting  tools
     *  by  tinyfool
     *  2005-04-15
     *
     *  */

    #include  <stdio.h>
    int  main()
    {
        char  x[]="xxx";
        //printf(x);
        return  0;
    }

    时间仓促,写得远非完美(字符串中的转码还不支持),但是也让我有了非常大的成就感,我会继续改进这个东西的。代码中的谬误和不良也请读者不吝赐教。
    源代码下载(Tiny的基于Flex的c/c++代码加亮工具) 78k

    发表于 @ 2005年04月15日 14:57:00|评论(loading...)|编辑

    新一篇: 一个最小的可以工作的Apache有多大? | 旧一篇: 我这10来年(Tinyfool的程序人生)

    评论

    #剑神一笑 发表于2005-04-15 17:15:00  IP: 221.237.174.*
    但是总有人告诉我那东西没有什么用处

    ----------------------------------------
    说这话的人不负责,真正学好编译了的人才知道学了编译对自己的帮助有多大.
    #alex 发表于2005-04-15 17:57:00  IP: 218.108.42.*
    不错,便一原理还是很有用的说。
    #tinyfool 发表于2005-04-15 18:59:00  IP: 219.238.144.*
    素啊!确实很有用,编译原理很好玩,,,,,,
    #wcldebug 发表于2005-04-16 01:40:00  IP: 219.153.62.*
    nod,编译原理真的很有用
    #xueqt 发表于2005-04-16 22:19:00  IP: 218.2.191.*
    学习,
    flex是什么啊,
    这个是写flex的脚本?

    没看懂
    #blas 发表于2005-04-16 23:33:00  IP: 218.82.203.*
    用boost的正则表达式也可以实现这个效果!
    #wayne zhang 发表于2005-04-17 17:40:00  IP: 218.82.49.*
    楼上的同道,我的email为whyned@citiz.net.我目前正在进行自定义汇编语言的代码生成阶段.谢谢光顾.
    #wayne zhang 发表于2005-04-17 12:27:00  IP: 218.82.54.*
    想看看我写的csm语言编译器吗?当然目前还未完成.(whyned.nease.net)
    #剑神一笑 发表于2005-04-17 13:24:00  IP: 221.237.174.*
    楼上做的编译器我去你的网站看了一下,和我正在做的有点像.我的也快完成语法分析,语义分析以及属性计算部分了.
    你的编译器支持的语法特性(如enum)以及基本数据类型比我做的要丰富些,不过我做的是完全面向对象的并支持继承和多态.
    在你的网站上没找到你的联系方式,如果你需要的话可以联系我,讨论一下 :-)
    #haha 发表于2005-04-18 08:49:00  IP: 210.21.221.*
    表达式有问题, cpp 标识符至少是[_a-zA-Z][_[:alnum:]]*
    #tinyfool 发表于2005-04-18 09:51:00  IP: 219.238.144.*
    楼上对于编译器来说,你说的完全没错,不过在这里普通的标识符不做任何处理,所以在这里并没有那么高的要求
    #ffxz 发表于2005-04-18 17:32:00  IP: 218.1.23.*
    呜,好久没摸编译原理了,东西也快荒废太久了
    有时间想做一个C99->Java Bytecode的编译器以及嵌入式设备内的RT JVM(这个到马马虎虎已经有了,可是C99的还是空白~~)
    大家一起来交流交流吧!!
    #总是好心情 发表于2005-04-18 17:48:00  IP: 218.109.196.*
    学编译原理很重要,菜鸟与非专业人士,才说没有意义。
    #tinyfool 发表于2005-04-18 18:24:00  IP: 219.238.144.*
    抛转果然可以引玉。。。。。
    #不懂浪漫 发表于2005-04-18 14:22:00  IP: 61.183.184.*
    这么多人做编译器啊?
    我也在做一个类似java的,目前已经完成的词法,语义分析.
    #不懂浪漫 发表于2005-04-19 09:49:00  IP: 61.183.184.*
    以前做的个虚拟机速度有些慢.
    现在想做一个快的.呵呵
    #Dev 发表于2005-04-19 22:09:00  IP: 203.88.212.*
    很不错啊。我觉得编译这门技术是非常有实用价值的,其实应用很广泛,不单只是对写编译器。我也再看那本“龙书“和《编译原理与实践》等资料,希望有机会和你交流。
    #tehy 发表于2005-04-20 15:23:00  IP: 202.96.19.*
    对于一般人来说,确实没多大用啊。100个搞IT的有一个弄这个就不错了。我以前做一个语法分析的时候,也用过lex+yacc.不过用完了也就忘了。况且会用lex,yacc这类的工具也不是就明白编译原理了。
    #lxwde 发表于2005-04-20 12:27:00  IP: 217.194.34.*
    支持楼主。最近也想看龙书,下载了原理与实践,可是这东东还是太难了。摸索中。

    boost的例子也很好。
    http://www.boost.org/libs/regex/example/snippets/regex_merge_example.cpp
    #pier 发表于2005-04-20 21:00:00  IP: 222.33.19.*
    各位好,编译已经学了两个月了,已经感觉到他确实非常有用,在学编程的时候。
    #tinyfool 发表于2005-04-21 10:09:00  IP: 219.238.144.*
    如何使用这个东西看看批处理就明白了

    用flex根据htmlpre.lex生成一个c文件,用cl(vc的编译器)编译成htmlpre.exe
    用flex根据cpp.lex生成一个c文件,用cl(vc的编译器)编译cpp.exe

    然后需要处理的cpp文件用type xxx.cpp | htmlpre >xxxhtm.cpp的方式进行预处理

    然后用type xxxhtm.cpp | cpp > xxx.html的方式得到最终完成加亮功能的Html文件。

    #tudou614 发表于2005-04-21 03:34:00  IP: 219.134.135.*
    奇怪,我用VC6为什么无法实现效果??

    楼主给个详细点的说明好吗??

    谢谢!!
    #bobo 发表于2005-04-22 22:57:00  IP: 210.21.209.*
    同学们, 这只是开始, 确切的说, 已经接近门槛了, 继续努力啊.
    #显示不正常 发表于2005-04-23 16:23:00  IP: 202.198.48.*
    楼主啊,你左面的那个公告“喧宾夺主”了...

    严重影响阅读正文啊!
    #tinyfool 发表于2005-04-23 16:45:00  IP: 219.238.144.*
    不会吧?

    我长得这么影响市容呢?
    #tudou614 发表于2005-04-22 18:46:00  IP: 219.134.135.*
    谢谢您的回复,我用cgnuwin32中带的flex分析了.lex文件,虽然到最后由于某种原因没有成功,但是,基本上该如何操作明白了,剩下就是自己啃书了,啃书的毅力我还是有的!!
    #dormouse 发表于2005-04-24 11:28:00  IP: 202.38.93.*
    我也正在上编译原理,试验课环境为windows,工具是flex+bison。
    这个加亮程序只用flex功能有限,如果配合bison做一些语法检查可能会好一些吧?比如提示一些明显的语法错误。
    #写代码的民工 发表于2005-04-23 23:14:00  IP: 220.198.211.*
    不错,偶上编译原理课时也玩过一下lex和yacc
    #localhero 发表于2005-04-26 18:50:00  IP: 221.216.15.*
    问:ACE通讯组件中的run_work()与run_master()两个函数的作用到底是什么?

    ACE属于开源项目,它是一个支持多种平台通讯组件, 它封装了socket的全部操作, 并扩展了很多功能.......
    上面小弟提出的那个问题比较棘手, 搞不太清楚它们俩之间的关系, 我在作一个linux上的基于ACE的服务器端的通讯组件, 不知在服务器端是否就不再需要run_master()这个函数了,只用run_work()这个函数就够了???(有位业内人士说可以,他说linux下的服务器端run_work()这函数没用!!!我很是纳闷,并表示怀疑! 实在搞不清楚)特此请教各位linux/c++大师, 希望前辈能帮我这个大忙!!!!!多谢!!!!
    #localhero 发表于2005-04-26 18:53:00  IP: 221.216.15.*
    问:ACE通讯组件中的run_work()与run_master()两个函数的作用到底是什么?

    ACE属于开源项目,它是一个支持多种平台通讯组件, 它封装了socket的全部操作, 并扩展了很多功能.......
    上面小弟提出的那个问题比较棘手, 搞不太清楚它们俩之间的关系, 我在作一个linux上的基于ACE的服务器端的通讯组件, 不知在服务器端是否就不再需要run_master()这个函数了,只用run_work()这个函数就够了???(有位业内人士说可以,他说linux下的服务器端run_work()这函数没用!!!我很是纳闷,并表示怀疑! 实在搞不清楚)特此请教各位linux/c++大师, 希望前辈能帮我这个大忙!!!!!多谢!!!!
    #ysery 发表于2006-02-20 15:45:00  IP: 58.33.80.*
    不如用Duceland Designer 的visual parser功能更方便些
    #coolstream 发表于2006-02-20 23:03:00  IP: 219.134.216.*
    有谁和我一起研究byacc的代码?
    欢迎和我联系
    wxyu98@163.com
    #yemmy 发表于2006-02-21 14:50:00  IP: 60.25.108.*
    你不是几年前mop聚会是我看到的那个tiny么,竟然在这又看见您了,原来是强人,汗啊
    #ldljlzw 发表于2007-03-26 13:47:27  IP: 222.240.187.*
    源代码下不下来!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © Tinyfool