2004-10-05 14:48:00 YoziDream 阅读数 2068
  • C语言/C++学习指南》语法篇(从入门到精通)

    一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++编程变得有趣,让喜欢C语言C++的人学会C语言C++!

    161913 人正在学习 去看看 邵发
今天在网上发现C++2HTML,可以在网页上方便的把C++源代码按语法高亮的形似显示出来;介绍给还不知道的朋友,

下面是效果:http://www.bedaux.net/cpp2html/





#include<iostream>
using namespace std; int main() { cout<<"Hello,World!"<<endl; return 0; }
2018-04-06 22:06:04 Frost_Bite 阅读数 1033
  • C语言/C++学习指南》语法篇(从入门到精通)

    一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++编程变得有趣,让喜欢C语言C++的人学会C语言C++!

    161913 人正在学习 去看看 邵发

编程题目 1:语法高亮转换软件 
(1) 问题描述:在我们使用的集成化编译环境(IDE)中,C/C++语言的源代码通常使用高亮语法表示,但是如果我们将这段代码发布到网页中,它的高亮语法表示将消失。这样看起来非常不直观,我们希望在网页中代码仍然能保持原来的高亮语法表示。 
(2) 输入:C/C++源代码文件,即后缀为 c/cpp 的文件。 
(3) 输出:网页文件,即后缀为 html 的文件。 
(4) 实现功能:将 C/C++源代码转换为网页文件,在浏览器中打开网页文件时,网页
中显示 C/C++源代码并以高亮语法表示显示。 

 

(5) 涉及知识点:词法分析。

 

 

 开始拿到这个题目时,实在是一点思路都没有。后来经过查阅与思考,发现按照上课所讲,先建立一个状态转换图,枚举所有可能出现的状态就好。更详细的内容见代码。要注意部分html的转义字符

 

 

//注:输入的源文件需要以Unix格式保存,因为在Windows下换行符为\r\n,会导致结果错误
#include <bits/stdc++.h>
using namespace std;

bool is_keyword(string str);                //关键字
bool is_operator(char ch);                  //运算符
bool is_seprator(char ch);                  //分界符
int is_notes(string str);                   //注释
int is_quotes(char ch);                     //双引号
char get_ch(ifstream &src);                 //读入一个字符
void point_back(ifstream &src);             //回退光标
void lex(ifstream &src,ofstream &dst);      //分析函数
//关键词表
string keyword[45]={"bool", "break", "case", "char",
    "cin", "const", "continue", "default", "define",
    "delete", "do", "double", "else", "enum", "endl",
    "false", "float", "for", "friend", "goto", "if", "void"
    "include", "int", "long", "namespace", "new", "while"
    "operator", "private", "cout", "printf", "public",
    "return", "string", "signed", "sizeof", "static", "struct",
	"switch", "template", "this", "true", "typedef", "using"
	};
//光标回退
void point_back(ifstream &src)
{
    src.seekg(-1,ios::cur);
}
//是否为关键字
bool is_keyword(string str)
{
    bool flag=0;
    for (int i=0;i<45;i++){
        if (str==keyword[i]){
            flag=1;
            break;
        }
    }
    return flag;
}
//是否为运算符
bool is_operator(char ch)
{
    if (strchr("+-*/%><=",ch))
        return true;
    return false;
}
//是否为分界符
bool is_seprator(char ch)
{
    if (strchr(";:{},()!&[]@?\\|~",ch))
		return true;
    return false;
}
//是否为单双引号
int is_quotes(char ch)
{
    if (ch=='\'')
        return 1;
    else if (ch=='\"')
        return 2;
    return 0;
}
//是否为注释
int is_notes(string str)
{
    if (str=="//")
        return 1;
    if (str=="/*")
        return 2;
    return 0;
}
//读入一个字符
char get_ch(ifstream &src)
{
    char res=1;
    if (src.peek()==EOF)
        return res;
    src.get(res);
    return res;
}

//词法分析
void lex(ifstream &src,ofstream &dst)
{
    char ch;
    string token;
    //读入字符
    ch=get_ch(src);
    //文件结束
    if (ch==1)
        return ;
    //换行符
    if (ch=='\n')
        dst<<"<br>";
    //空格
    else if (ch==' '||ch=='\t'){
        dst<<" ";
    }
    //关键字或普通字
    else if (isalpha(ch)){
        while (isalpha(ch)||isdigit(ch)||ch=='_'){
            token.push_back(ch);
            ch=get_ch(src);

        }
        if (is_keyword(token))
            dst<<"<font color=#32CD99>"<<token<<"</font>";
        else
            dst<<token;
        point_back(src);
    }
    //数字
    else if (isdigit(ch)){
        while (isdigit(ch)||ch=='.'){
            token.push_back(ch);
            ch=get_ch(src);

        }
        dst<<"<font color=#DB70DB>"<<token<<"</font>";
        point_back(src);
    }
    //注释
    else if (ch=='/'){
        token.push_back(ch);
        ch=get_ch(src);
        token.push_back(ch);
        //不为注释(为除号),跳转到运算符
        if (is_notes(token)==0){
            point_back(src);
            ch='/';
            token.clear();
            goto a1;
        }
        //为单行注释
        else if (is_notes(token)==1){
            while (ch!='\n'){
                ch=get_ch(src);

                if (ch=='\n')
                    break;
                token.push_back(ch);
            }
            dst<<"<font color=#C0C0C0>"<<token<<"<br></font>";
        }
        //为多行注释
        else {
            int f=0;
            while (1){
                while (ch!='\n'){
                    ch=get_ch(src);

                    if (ch=='/'&&token[token.size()-1]=='*'){
                        f=1;
                        token.push_back(ch);
                        break;
                    }
                    token.push_back(ch);
                }
                if (ch=='\n')
                    dst<<"<font color=#C0C0C0>"<<token<<"<br></font>";
                else
                    dst<<"<font color=#C0C0C0>"<<token<<"</font>";
                if (f)
                    break;
                token.clear();
                ch=get_ch(src);
                token.push_back(ch);
            }
        }
    }
    //运算符
    else if (is_operator(ch)){
            //html中无法直接显示<>,需进行转义
a1:        if (ch=='<'){
                token.push_back('&');
                token.push_back('l');
                token.push_back('t');
            }
            else if (ch=='>'){
                token.push_back('&');
                token.push_back('g');
                token.push_back('t');
            }
            else
                token.push_back(ch);
        dst<<"<font color=#FF000>"<<token<<"</font>";
    }
    //字符串或字符
    else if (is_quotes(ch)){
        token.push_back(ch);
        int flag=is_quotes(ch);
        //为单引号
        if (flag==1){
            ch=get_ch(src);
            while (ch!='\''){
                token.push_back(ch);
                ch=get_ch(src);

            }
            token.push_back(ch);
            dst<<"<font color=#6B4226>"<<token<<"</font>";
        }
        //为双引号
        else{
            ch=get_ch(src);
            while (ch!='\"'){
                token.push_back(ch);
                ch=get_ch(src);

            }
            token.push_back(ch);
            dst<<"<font color=#6B4226>"<<token<<"</font>";
        }
    }
    //分界符
    else if (is_seprator(ch)){
        if (ch=='&'){
            token.push_back('&');
            token.push_back('a');
            token.push_back('m');
            token.push_back('p');
        }
        else
            token.push_back(ch);
        dst<<"<font color=#97694F>"<<token<<"</font>";
    }
    //头文件
    else if (ch=='#'){
        while (ch!='\n'){
            if (ch=='<'){
                token.push_back('&');
                token.push_back('l');
                token.push_back('t');
            }
            else if (ch=='>'){
                token.push_back('&');
                token.push_back('g');
                token.push_back('t');
            }
            else
                token.push_back(ch);
            ch=get_ch(src);

        }
        dst<<"<font color=#32CD99>"<<token<<"<br></font>";
    }

}

int main()
{
    ifstream src("in.cpp",ios::in);
	ofstream dst("out.html",ios::out);
	if (!src.is_open()){
        cerr<<"open error"<<endl;
        exit(1);
    }
    cout<<"start building"<<endl;
	while (src.peek()!=EOF)
        lex(src,dst);

    src.close();
    dst.close();
    cout<<"building success"<<endl;

    return 0;
}

效果如下:

 

2017-12-30 10:51:03 yandex 阅读数 3542
  • C语言/C++学习指南》语法篇(从入门到精通)

    一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++编程变得有趣,让喜欢C语言C++的人学会C语言C++!

    161913 人正在学习 去看看 邵发

Dev-C++是一个Windows环境下的一个适合于初学者使用的轻量级C/C++ 集成开发环境(IDE),它是一款自由软件,遵守GPL许可协议分发源代码。

Dev-C++ 使用MingW64/TDM-GCC编译器,遵循C++ 11标准,同时兼容C++98标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的调试功能,适合初学者与编程高手的不同需求,是学习C或C++的首选开发工具!

Dev-C++ 的优点是功能简洁,适合于在教学中供 C/C++语言初学者使用,也适合于非商业级普通开发者使用。

例如:

(1)它集成了 AStyle 源代码格式整理器,只要点击菜单“AStyle --> 格式化当前文件”,就可以把当前窗口中的源代码按一定的风格迅速整理好排版格式。

(2)它提供了一些常用的源代码片段,只要点击“插入”按钮就可以选择性地插入常用源代码片段。

 

原开发公司 Bloodshed 在开发完 4.9.9.2 后停止开发。所以现在由 Orwell 公司继续更新开发,最新版本:5.11。

我对原来的版本进行了一些修订和调整,并进行了完整的汉化,版本号修改为 v5.12,有兴趣的读者可以看这篇:

Dev-C++ 5.12 中文版 https://blog.csdn.net/yandex/article/details/103672172

2013-03-25 11:44:32 dreamzml 阅读数 5360
  • C语言/C++学习指南》语法篇(从入门到精通)

    一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++编程变得有趣,让喜欢C语言C++的人学会C语言C++!

    161913 人正在学习 去看看 邵发

1) highlightjs

Highlight.js能够对页面中的各种程序源代码语法着色加亮。支持的语言包括:

  • Python
  • Ruby
  • Perl
  • PHP
  • XML
  • HTML
  • CSS
  • Django
  • Javascript
  • VBScript
  • Delphi
  • Java
  • C++
  • RenderMan (RSL and RIB)
  • SQL
  • SmallTalk
  • Axapta
  • 1C
  • Ini
  • Diff
  • DOS .bat
  • Bash

8个jQuery语法高亮插件

2) google-code-prettify

Google Code Prettify是一个JavaScript库,用来对各种页面上的源码进行语法着色高亮显示。Google Code Prettify很小巧,解压后也只有85K的大小。支持大部分常用的语言。不需要指定语言。

8个jQuery语法高亮插件

3) SyntaxHighlighter

SyntaxHighlighter,是一款用于web页面的代码着色工具,可以用来着色多种语言,可以是 HTML,CSS,Javascript,还可以是C,JAVA等编程语言。最早见于Yahoo的YUI,当时还属于自由软件,最近打开官方网站发现已被 goolge收编。

它可以在网页中对各种程序源代码语法进行加亮显示。支持当前流行的各种编程语言:C#、CSS、C++、Delphi、Java、JavaScript、PHP、Python、Ruby、SQL、Visual Basic、XML / HTML。

8个jQuery语法高亮插件

4) Chili – jQuery Plugin

Chili是jQuery代码高亮插件。

8个jQuery语法高亮插件

5) pygments

Pygments是一个实现的格式化高亮代码的Python库。包含四个模块:

  1. lexer - 将代码解析成token流,每个一token都包含两个属性,一个是当前token的类型,一个是当前token的值。Pygments支持的语言很多,具体可以参考附录A。
  2. filters - 通过lexer解析出来的token流送入filter,可以根据条件修改某些token的属性或者值。
  3. formatter - token流最终输出是根据formater的定义,输出成实现定义好的格式,例如HTML, LaTex或者RTF。
  4. style - 定义了输出的风格,例如不同类型的token按照不同的颜色显示,或者是否粗体。

8个jQuery语法高亮插件

6) ultraviolet

Ultraviolet是一个基于Textpow的语法高亮引擎、Ultraviolet同时也是一个独立的命令行实用程序和Ruby库。

8个jQuery语法高亮插件

7) GESHi

GeSHi(Generic Syntax Highlighter)用于在HTML页面中高亮显示各种源代码。支持超过60种语言:PHP、HTML、C、Java、Java5、C#、 Actionscript、Delphi、C++、Groovy、Javascript、Perl、PL/SQL、Ruby、Python、SQL、 XML等,并易于集成到Dokuwiki,Mambo,phpBB,WordPress和WikkaWiki等系统中使用。

8个jQuery语法高亮插件

8) snippet

Snippet是一个很酷的jQuery语法高亮插件,基于SHJS脚本,你可以在SourceForge上找到源码。Snippet提供了简单而且快捷的方法,可以方便的为你带来高亮语法的提示.可以在IE 6, IE 7, IE 8, FF 3.6, Chrome 6.0, Safari 5.0, Opera 10.62中运行.

  1. 8个jQuery语法高亮插件
2007-02-28 20:54:00 yhmhappy2006 阅读数 13230
  • C语言/C++学习指南》语法篇(从入门到精通)

    一门初级、从入门到精通的C语言C++语法教程,由毕业于清华大学的业内人士执课。从简单的HelloWorld入门程序,到深入的C语言C++核心概念,均为您娓娓道来,言之必详、听之必懂。让C语言C++编程变得简单,让C语言C++编程变得有趣,让喜欢C语言C++的人学会C语言C++!

    161913 人正在学习 去看看 邵发

Crystal FLOW: 一款回顾和可视的从源代码中得到流程图的软件。并且支持C语言的语法高亮显示。 

针对c程序的:Crystal FLOW for C
针对c++程序的:Crystal FLOW for C++
见:http://www.sgvsarc.com/downloadsList.asp

不过,目前只有英文版,并且还没有找到破解版哦!真是一大遗憾,因为试用期只有十天,用邮箱申请,据说还不能重复相同邮箱,跟现在的需要认证的金山毒霸2005似的!只好边申请新邮箱继续试用边期待黑客们破解下下。嘻嘻嘻

 
没有更多推荐了,返回首页