Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 81350 / py2html / py2html.cpp
diff options
context:
space:
mode:
Commit76b849fbaa276566fa8838d745c0e5fbd2f138bc (patch)
Author
 Ralitsa Dardjonova <dardzhonov@uni-sofia.bg>
2018-11-07 16:01:18 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-07 16:01:18 +0200
Files903597ade32e9f2cce2a52b90aa70ff90668bbbe /homework/81350/py2html/py2html.cpp
IPL-76b849fbaa276566fa8838d745c0e5fbd2f138bc.tar
IPL-76b849fbaa276566fa8838d745c0e5fbd2f138bc.tar.gz
IPL-76b849fbaa276566fa8838d745c0e5fbd2f138bc.zip
Parent97a58430a248b9ea89a7da0120cfceb0e6b11af5 (diff)
First homework - highlighter for python (#17)
* Initial commit * Fix some typos modified: README * Delete index.html
1 files changed, 258 insertions, 0 deletions
-rw-r--r--homework/81350/py2html/py2html.cpp258
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 <iostream>
+#include <string>
+#include <cctype>
+#include <unistd.h>
+#include <sys/types.h>
+#include <unordered_map>
+#include <set>
+#include "Token.h"
+
+std::string operatorChars = "+-*/%=<>&|^~";
+std::string parenthesisChars = "[]{}(),";
+std::set<std::string> 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<std::string>::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, "<span class=\"string\">%s</span>", word.c_str());
+ word = readFormat();
+ fprintf(out, "<span class=\"formatString\">%s</span>", word.c_str());
+ word = "";
+ } else {
+ word += c;
+ }
+ previousChar = c;
+ }
+ word += firstQuote;
+ fprintf(out, "<span class=\"string\">%s</span>", 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<std::string, TokenType>::const_iterator iter;
+
+ while((c = fgetc(in)) != EOF){
+ if(isQuote(c)){
+ word = readString(c);
+ //fprintf(out, "<span class=\"string\">%s</span>", word.c_str());
+ continue;
+ }
+ if(isNumber(c)){
+ word = readNumber();
+ fprintf(out, "<span class=\"number\">%s</span>", word.c_str());
+ continue;
+ }
+ if(isOperator(c)){
+ word = readOperator();
+ if(isValidOperator(word)){
+ validSyntaxis = 0;
+ }
+ fprintf(out, "<span class=\"operator\">%s</span>", 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, "<span class=\"keyword\">%s</span>", 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(
+ "<!doctype>"
+ "<html>"
+ "<head>"
+ " <title>program.py</title>"
+ " <style>"
+ " .keyword {"
+ " color: purple;"
+ " }"
+ " .number {"
+ " color: orange;"
+ " }"
+ " .string {"
+ " color: green;"
+ " }"
+ " .operator {"
+ " font-style: bold;"
+ " }"
+ " .formatString {"
+ " color: red;"
+ " }"
+ " </style>"
+ "</head>"
+ "<body>"
+ " <pre class=\"code\">",
+ out);
+
+ lexer();
+ fputs("</pre></body></html>", out);
+ fclose(in);
+ fclose(out);
+ return 0;
+}