From 93cd8cac8a616ae13bd42dcbee0bb9da278eb49d Mon Sep 17 00:00:00 2001 From: Ralitsa Velikova Date: Wed, 7 Nov 2018 14:26:16 +0200 Subject: 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 --- homework/81013/go2html/Highlighter.cpp | 219 +++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 homework/81013/go2html/Highlighter.cpp (limited to 'homework/81013/go2html/Highlighter.cpp') 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 +#include + +#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 << "" << token.Number << ""; + default: + out << "" << token.Lexeme << ""; + break; + } + } +} + +IPLResult Highlight(std::ifstream& infile, std::ofstream& out) +{ + out << + "\n" + "\n" + "\n" + "\n" + "
\n" << std::endl;
+
+	std::string line;
+	std::vector 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 <<
+	"
\n" + "" << std::endl; + + return {true, IPLError() }; +} \ No newline at end of file -- cgit v1.3.1-23-gd82d