Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 81013 / go2html / Highlighter.cpp
diff options
context:
space:
mode:
Commit93cd8cac8a616ae13bd42dcbee0bb9da278eb49d (patch)
Author
 Ralitsa Velikova <rherince@gmail.com>
2018-11-07 14:26:16 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-07 14:26:16 +0200
Filesce8b306af9c36d6443fe2fc34526223e44c804cf /homework/81013/go2html/Highlighter.cpp
IPL-93cd8cac8a616ae13bd42dcbee0bb9da278eb49d.tar
IPL-93cd8cac8a616ae13bd42dcbee0bb9da278eb49d.tar.gz
IPL-93cd8cac8a616ae13bd42dcbee0bb9da278eb49d.zip
Parent47e8c6f331525f01f150ba80a3557a18618b0cf5 (diff)
Solution to first homework (#25)
* Add token types enum for Lexer * Local test if I've correctly switched from https to ssh * Adds initial Lexer logic; Reuses JSImpl's Lexer logic; Still needs refactoring; * Adds README.md * Adds README.md * Adds tokenization of strings and a few operators * Adds some operators * Adds highlighter and sample for future testing * Adds runes & fixes double whitespace bug * API fix, premake, solution * Update README.md * Delete HL.sln * Delete HL.vcxproj
1 files changed, 219 insertions, 0 deletions
-rw-r--r--homework/81013/go2html/Highlighter.cpp219
diff --git a/homework/81013/go2html/Highlighter.cpp b/homework/81013/go2html/Highlighter.cpp
new file mode 100644
index 0000000..8295610
--- /dev/null
+++ b/homework/81013/go2html/Highlighter.cpp
@@ -0,0 +1,219 @@
+#include <iostream>
+#include <fstream>
+
+#include "CommonTypes.h"
+#include "Lexer.h"
+#include "Highlighter.h"
+
+#define KEYWORD_COLOR "#ad42f4"
+#define IDENTIFIER_COLOR "#41c4f4"
+#define OPERATOR_COLOR "#f49541"
+#define NUMBER_COLOR "#bab103"
+#define STRING_COLOR "#ff11bf"
+#define RUNE_COLOR "#5abc00"
+#define CONST_COLOR "#f94040"
+#define COMMENT_COLOR "#0b8700"
+
+namespace
+{
+ void PrintToken(
+ const Token& token,
+ const IPLString& className,
+ std::ostream& out)
+ {
+ switch (token.Type)
+ {
+ case TokenType::Whitespace:
+ out << token.Lexeme;
+ break;
+ case TokenType::Float:
+ case TokenType::DecimalInteger:
+ case TokenType::ImaginaryNum:
+ out << "<span class=\"" << className << "\">" << token.Number << "</span>";
+ default:
+ out << "<span class=\"" << className << "\">" << token.Lexeme << "</span>";
+ break;
+ }
+ }
+}
+
+IPLResult Highlight(std::ifstream& infile, std::ofstream& out)
+{
+ out <<
+ "<html>\n"
+ "<head>\n"
+ "<style>\n"
+ ".keyword {\n"
+ "color: " << KEYWORD_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".identifier {\n"
+ "color: " << IDENTIFIER_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".operator {\n"
+ "color: " << OPERATOR_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".number {\n"
+ "color: " << NUMBER_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".string {\n"
+ "color: " << STRING_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".rune {\n"
+ "color: " << RUNE_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".const {\n"
+ "color: " << CONST_COLOR << ";\n"
+ "}\n"
+ "\n"
+ ".comment {\n"
+ "color: " << COMMENT_COLOR << ";\n"
+ "}\n"
+ "</style>\n"
+ "</head>\n"
+ "<body><pre>\n" << std::endl;
+
+ std::string line;
+ std::vector<Token> tokens;
+
+ while (std::getline(infile, line))
+ {
+ IPLResult result = Tokenize(line.c_str(), tokens, {true, true});
+ if (!result.IsSuccessful)
+ {
+ return result;
+ }
+
+ for (auto& token : tokens)
+ {
+ switch (token.Type)
+ {
+ case TokenType::Break:
+ case TokenType::Default:
+ case TokenType::Func:
+ case TokenType::Interface:
+ case TokenType::Select:
+ case TokenType::Case:
+ case TokenType::Defer:
+ case TokenType::Go:
+ case TokenType::Map:
+ case TokenType::Struct:
+ case TokenType::Chan:
+ case TokenType::Else:
+ case TokenType::Goto:
+ case TokenType::Package:
+ case TokenType::Switch:
+ case TokenType::Const:
+ case TokenType::Fallthrough:
+ case TokenType::If:
+ case TokenType::Range:
+ case TokenType::Type:
+ case TokenType::Continue:
+ case TokenType::For:
+ case TokenType::Import:
+ case TokenType::Return:
+ case TokenType::Var:
+
+ PrintToken(token, "keyword", out);
+ break;
+
+ case TokenType::Plus:
+ case TokenType::Minus:
+ case TokenType::Star:
+ case TokenType::Division:
+ case TokenType::Modulo:
+
+ case TokenType::NOT:
+ case TokenType::BitwiseAND:
+ case TokenType::BitwiseOR:
+ case TokenType::BitwiseXOR:
+ case TokenType::BitClear:
+ case TokenType::ShiftLeft:
+ case TokenType::ShiftRight:
+
+ case TokenType::PlusEqual:
+ case TokenType::MinusEqual:
+ case TokenType::MultEqual:
+ case TokenType::DivEqual:
+ case TokenType::ModuloEqual:
+
+ case TokenType::ConditionalAND:
+ case TokenType::ConditionalOR:
+ case TokenType::ReceiveOperator:
+ case TokenType::PlusPlus:
+ case TokenType::MinusMinus:
+
+ case TokenType::Equal:
+ case TokenType::Less:
+ case TokenType::Greater:
+
+ case TokenType::NOTEqual:
+ case TokenType::LessEqual:
+ case TokenType::GreaterEqual:
+
+ case TokenType::Assignment:
+ case TokenType::ShortAssignment:
+
+ case TokenType::Variadic:
+
+ case TokenType::LeftParen:
+ case TokenType::RightParen:
+ case TokenType::LeftSquareBracket:
+ case TokenType::RightSquareBracket:
+ case TokenType::LeftBrace:
+ case TokenType::RightBrace:
+
+ case TokenType::Comma:
+ case TokenType::Dot:
+
+ case TokenType::Semicolon:
+ case TokenType::Colon:
+
+ PrintToken(token, "operator", out);
+ break;
+
+ case TokenType::Float:
+ case TokenType::DecimalInteger:
+ case TokenType::ImaginaryNum:
+
+ PrintToken(token, "number", out);
+ break;
+
+ case TokenType::String:
+
+ PrintToken(token, "string", out);
+ break;
+
+ case TokenType::True:
+ case TokenType::False:
+ case TokenType::Nil:
+
+ PrintToken(token, "const", out);
+ break;
+
+ case TokenType::Comment:
+
+ PrintToken(token, "comment", out);
+ break;
+
+ default:
+ PrintToken(token, "", out);
+ break;
+ }
+ }
+
+ out << std::endl;
+ tokens.clear();
+ }
+
+ out <<
+ "</pre></body>\n"
+ "</html>" << std::endl;
+
+ return {true, IPLError() };
+} \ No newline at end of file