From 76b849fbaa276566fa8838d745c0e5fbd2f138bc Mon Sep 17 00:00:00 2001 From: Ralitsa Dardjonova Date: Wed, 7 Nov 2018 16:01:18 +0200 Subject: First homework - highlighter for python (#17) * Initial commit * Fix some typos modified: README * Delete index.html --- homework/81350/py2html/py2html.cpp | 258 +++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 homework/81350/py2html/py2html.cpp (limited to 'homework/81350/py2html/py2html.cpp') diff --git a/homework/81350/py2html/py2html.cpp b/homework/81350/py2html/py2html.cpp new file mode 100644 index 0000000..65d28da --- /dev/null +++ b/homework/81350/py2html/py2html.cpp @@ -0,0 +1,258 @@ +#include +#include +#include +#include +#include +#include +#include +#include "Token.h" + +std::string operatorChars = "+-*/%=<>&|^~"; +std::string parenthesisChars = "[]{}(),"; +std::set operators = { + "+", + "-", + "*", + "/", + "//", + "%", + "**", + ">", + "<", + ">=", + "<=", + "==", + "!=", + "&", + "|", + "~", + "^", + ">>", + "<<", + "=", + "+=", + "-=", + "*=", + "/=", + "%=", + "**=", + "//=", + "^=", + "&=", + "|=", + ">>=", + "<<=" +}; + +using namespace std; +FILE* in; +FILE* out; + +bool isNumber(char c){ + return c >= '0' && c <= '9'; +} + +bool notValidNumber(char c){ + return !(isNumber(c) || c == '.'); +} + +bool isQuote(char c){ + return c == '\'' || c == '"'; +} + +bool isLastQuote(char firstQuote, char previousChar, char currentChar){ + return firstQuote == currentChar && previousChar != '\\'; +} + +bool isOperator(char c){ + return operatorChars.find(c) != std::string::npos; +} + +bool isParenthesis(char c){ + return parenthesisChars.find(c) != std::string::npos; +} + +bool isValidIdentifierChar(char c){ + return !(isOperator(c) || isParenthesis(c) || isQuote(c) || c == '\n' || isblank(c) || c == ','); +} + +bool isValidOperator(std::string word){ + std::set::iterator iter; + iter = operators.find(word); + return iter != operators.end(); +} + +std::string readFormat(){ + std::string word = "{"; + char c; + + while((c = fgetc(in)) != EOF && c != '}'){ + word += c; + } + word += '}'; + return word; +} + +std::string readNumber(){ + fseek(in, -1, SEEK_CUR); + std::string word; + char c; + int dotCount = 0; + + while((c = fgetc(in)) != EOF && !notValidNumber(c)){ + //printf("%c", c); + if(notValidNumber(c)){ + return ""; + } else if(c == '.'){ + dotCount++; + if(dotCount >= 2){ + return ""; + } + } + word += c; + } + if(notValidNumber(c)){ + fseek(in, -1, SEEK_CUR); + } + return word; +} + +std::string readString(char firstQuote){ + std::string word = ""; + word += firstQuote; + char c; + char previousChar = ' '; + + while((c = fgetc(in)) != EOF && !isLastQuote(firstQuote, previousChar, c)){ + if( c == '{'){ + fprintf(out, "%s", word.c_str()); + word = readFormat(); + fprintf(out, "%s", word.c_str()); + word = ""; + } else { + word += c; + } + previousChar = c; + } + word += firstQuote; + fprintf(out, "%s", word.c_str()); + return word; +} + +std::string readOperator(){ + fseek(in, -1, SEEK_CUR); + std::string word; + char c; + while((c = fgetc(in)) != EOF && isOperator(c)){ + word += c; + } + if(!isOperator(c)){ + fseek(in, -1, SEEK_CUR); + } + return word; +} + +std::string readWord(){ + fseek(in, -1, SEEK_CUR); + std::string word; + char c; + while((c = fgetc(in)) != EOF && isValidIdentifierChar(c)){ + word += c; + } + + if(!isValidIdentifierChar(c)){ + fseek(in, -1, SEEK_CUR); + } + return word; +} + +void lexer(){ + char c; + bool validSyntaxis = 1; + std::string word; + std::unordered_map::const_iterator iter; + + while((c = fgetc(in)) != EOF){ + if(isQuote(c)){ + word = readString(c); + //fprintf(out, "%s", word.c_str()); + continue; + } + if(isNumber(c)){ + word = readNumber(); + fprintf(out, "%s", word.c_str()); + continue; + } + if(isOperator(c)){ + word = readOperator(); + if(isValidOperator(word)){ + validSyntaxis = 0; + } + fprintf(out, "%s", word.c_str()); + // trqbwa da se proweti dali e korektno + // t.e. da e w nqkyw set ili hash + continue; + } + if(isParenthesis(c)){ + fprintf(out, "%c", c); + continue; + } + if(isblank(c) || c == '\n'){ + fprintf(out, "%c", c); + continue; + } + + word = readWord(); + iter = keywords.find(word); + if(iter == keywords.end()){ + fprintf(out, "%s", word.c_str()); + } else { + fprintf(out, "%s", word.c_str()); + } + + } +} + +int main(int argc, const char* argv[]) +{ + ++argv, --argc; /* skip over program name */ + if ( argc > 0 ) + in = fopen( argv[0], "r" ); + else + in = stdin; + + out = fopen("index.html", "w"); + + fputs( + "" + "" + "" + " program.py" + " " + "" + "" + "
",
+        out);
+
+    lexer();
+    fputs("
", out); + fclose(in); + fclose(out); + return 0; +} -- cgit v1.3.1-23-gd82d