blob: 92f4d30d59e5003eddfb3e919b5cfc901e5e040c (
plain) (
blame)
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
|
#include <iostream>
#include <fstream>
#include <vector>
#include "Lexer.h"
void printTokens(std::vector<Token> &tokens)
{
for(int i = 0;i<tokens.size();i++)
{
std::cout<<tokens[i].type<<" "<<tokens[i].lexeme <<" on line " << tokens[i].line <<std::endl;
}
}
void cpp2html(std::vector<Token> &tokens, const char* code)
{
std::ofstream out("../cpp2.html");
std::string header = "<!DOCTYPE html>\n"
"<html lang=\"en\">\n"
"<head>\n"
" <style>\n"
" body {\n"
" font-size: 20px;\n"
" }\n\n"
" .number {\n"
" color: pink;\n"
" }\n\n"
" .string {\n"
" color: blue;\n"
" }\n\n"
" .keyword {\n"
" color: purple;\n"
" font-weight: bold;\n"
" }\n\n"
" .operator {\n"
" color: red;\n"
" }\n\n"
" .comment {\n"
" color: gray;\n"
" font-style: italic;\n"
" }\n\n"
" .preprocessor {\n"
" color: green;\n"
" font-weight: bold;\n"
" }\n\n"
" </style>\n"
"</head>\n"
"<body>\n";
out << header;
unsigned codeInd = 0;
for(int i = 0;i < tokens.size();i++)
{
while(code[codeInd] == ' ' || code[codeInd] == '\t' || code[codeInd] == '\n')
{
if(code[codeInd] == '\n') out << "<br>";
else out << " ";
//else out <<
++codeInd;
}
if(tokens[i].type == TokenType::NUMBER)
{
out << "<span class=\"number\">" << tokens[i].value <<"</span>";
}
else if(tokens[i].type == TokenType::STRING)
{
out << "<span class=\"string\">" << tokens[i].lexeme <<"</span>";
}
else if(tokens[i].type == TokenType::COMMENT)
{
out << "<span class=\"comment\">" << tokens[i].lexeme <<"</span>";
}
else if(tokens[i].type <= TokenType::RIGHT_SHIFT_EQUAL)
{
out << "<span class=\"operator\">" << tokens[i].lexeme <<"</span>";
}
else if(tokens[i].type <= TokenType::XOR_EQ)
{
out << "<span class=\"keyword\">" << tokens[i].lexeme <<"</span>";
}
else if(tokens[i].type <= TokenType::PRE_PRAGMA)
{
out << "<span class=\"preprocessor\">" << tokens[i].lexeme <<"</span>";
}
else
{
out << tokens[i].lexeme;
}
codeInd += tokens[i].lexeme.length();
}
out << "\n</body>\n</html>";
out.close();
}
int main()
{
char code[] = "#include<iostream>\nbool isCapitalCase(char c)\n{\n return c >= 'A' && c <= 'Z';\n}\nm_KeyWordsTable[\"break\"] = TokenType::Break;\n// this is a comment test\n"
"/* another one */";
Tokenizer tokenizer(code);
std::vector<Token> tokens;
if(tokenizer.tokenize(tokens))
{
cpp2html(tokens, code);
}
//printTokens(tokens);
return 0;
}
|