Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit295b3464c34cb63f600264a428cfb8c57ab5cc62 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-11-16 23:29:04 +0200
Committer
 Syndamia <kamen@syndamia.com>
2022-11-16 23:29:04 +0200
Files6e38053019727c6c62c17305e4c8188087ae2cd2
uni-projects-295b3464c34cb63f600264a428cfb8c57ab5cc62.tar
uni-projects-295b3464c34cb63f600264a428cfb8c57ab5cc62.tar.gz
uni-projects-295b3464c34cb63f600264a428cfb8c57ab5cc62.zip
Parentba91b1efb380372c8369e773d0dce1952147d94c (diff)
[IPL/HW02] Simplified some functions and properly implemented code folding
diff --git a/Year 2/Implementation of Programming Languages/Homework 02/codefold.y b/Year 2/Implementation of Programming Languages/Homework 02/codefold.y
index d6d4b4b..184d796 100644
--- a/Year 2/Implementation of Programming Languages/Homework 02/codefold.y
+++ b/Year 2/Implementation of Programming Languages/Homework 02/codefold.y
@@ -9,8 +9,8 @@ int yyerror(char *s);
#define RBRACKET_SPAN "<span class=\"bracket\">)</span>"
char* span(char *c, char *s);
-char* detailsfr(char *s);
-char* lrbrackets();
+char* details(char *summary, char *rest);
+char* concat2(char *first, char *second);
char* concatperm2(char *first, char *second);
char* concatperm3(char *first, char *second, char *third);
%}
@@ -29,29 +29,35 @@ start:
| start terminal { printf("%s", $2); free($2); }
| start NEWLINE { printf("\n"); }
-stlist: LBRACKET RBRACKET { $$ = lrbrackets(); }
- | LBRACKET list RBRACKET { $$ = concatperm3(LBRACKET_SPAN, $2, RBRACKET_SPAN); }
- | LBRACKET NEWLINE list RBRACKET { $$ = detailsfr(concatperm3(LBRACKET_SPAN, $3, RBRACKET_SPAN)); }
- | LBRACKET list NEWLINE RBRACKET { $$ = detailsfr(concatperm3(LBRACKET_SPAN, $2, RBRACKET_SPAN)); }
+stlist: LBRACKET RBRACKET { $$ = concat2(LBRACKET_SPAN, RBRACKET_SPAN); }
+ | LBRACKET list RBRACKET { $$ = concatperm3(LBRACKET_SPAN, $2, RBRACKET_SPAN); }
+ | LBRACKET NEWLINE list RBRACKET { $$ = details(concat2(LBRACKET_SPAN, ""), $3); }
+ | LBRACKET list NEWLINE postlist RBRACKET { $$ = details($2, $4); }
;
+postlist: { $$ = ""; }
+ | postlist stlist { $$ = concat2($1, $2); free($2); }
+ | postlist terminal { $$ = concat2($1, $2); free($2); }
+ | postlist NEWLINE { $$ = concat2($1, "\n"); }
+ ;
+
list: terminal
| list terminal { $$ = concatperm2($1, $2); }
| stlist
| list stlist { $$ = concatperm2($1, $2); }
;
-terminal: STR { $$ = span("string", $1); free($1); }
- | NUM { $$ = span("number", $1); free($1); }
- | COMMENT { $$ = span("comment", $1); free($1); }
- | PARAMETER_TYPE { $$ = span("parameter-type", $1); free($1); }
- | KEYWORD { $$ = span("keyword", $1); free($1); }
- | CONSTANT { $$ = span("constant", $1); free($1); }
- | SPECIAL_FORM { $$ = span("special-operator", $1); free($1); }
- | FUNCTION { $$ = span("function", $1); free($1); }
- | MACRO { $$ = span("macro", $1); free($1); }
- | VARIABLE { $$ = span("variable", $1); free($1); }
- | OTHER { $$ = span("", $1); free($1); }
+terminal: STR { $$ = span("string", $1); }
+ | NUM { $$ = span("number", $1); }
+ | COMMENT { $$ = span("comment", $1); }
+ | PARAMETER_TYPE { $$ = span("parameter-type", $1); }
+ | KEYWORD { $$ = span("keyword", $1); }
+ | CONSTANT { $$ = span("constant", $1); }
+ | SPECIAL_FORM { $$ = span("special-operator", $1); }
+ | FUNCTION { $$ = span("function", $1); }
+ | MACRO { $$ = span("macro", $1); }
+ | VARIABLE { $$ = span("variable", $1); }
+ | OTHER { $$ = span("", $1); }
;
%%
@@ -60,26 +66,30 @@ terminal: STR { $$ = span("string", $1); free($1); }
char* span(char *c, char *s) {
char* str = (char*)malloc(strlen(c) + strlen(s) + 1 + 22);
sprintf(str, "<span class=\"%s\">%s</span>", c, s);
- return str;
-}
-char* detailsfr(char *s) {
- char* str = (char*)malloc(strlen(s) + 1 + 19);
- sprintf(str, "<details>%s</details>", s);
free(s);
return str;
}
-char* lrbrackets() {
- char* str = (char*)malloc(strlen(LBRACKET_SPAN) + strlen(RBRACKET_SPAN) + 1);
- sprintf(str, "%s%s", LBRACKET_SPAN, RBRACKET_SPAN);
+char* details(char *summary, char *rest) {
+ if (rest == NULL) rest = concat2("", ""); // Зверски грозен фикс, но не е толкова голям проблем
+
+ char* str = (char*)malloc(strlen(LBRACKET_SPAN) + strlen(summary) + strlen(rest) + strlen(RBRACKET_SPAN) + 1 + 39);
+ sprintf(str, "<details><summary>%s%s</summary>\n%s%s</details>", LBRACKET_SPAN, summary, rest, RBRACKET_SPAN);
+
+ free(summary); free(rest);
return str;
}
-char* concatperm2(char *first, char *second) {
+char* concat2(char* first, char* second) {
char* concat = (char*)malloc(strlen(first) + strlen(second) + 1);
sprintf(concat, "%s%s", first, second);
+ return concat;
+}
+char* concatperm2(char *first, char *second) {
+ char* concat = concat2(first, second);
free(first); free(second);
return concat;
}
+
char* concatperm3(char *first, char *second, char *third) {
char* concat = (char*)malloc(strlen(first) + strlen(second) + strlen(third) + 1);
sprintf(concat, "%s%s%s", first, second, third);
diff --git a/Year 2/Implementation of Programming Languages/Homework 02/commonlisp2html.l b/Year 2/Implementation of Programming Languages/Homework 02/commonlisp2html.l
index cbb226f..963cba8 100644
--- a/Year 2/Implementation of Programming Languages/Homework 02/commonlisp2html.l
+++ b/Year 2/Implementation of Programming Languages/Homework 02/commonlisp2html.l
@@ -55,7 +55,7 @@ CONST_VAR \+([0-9A-z.?-_])+\+
\n { return NEWLINE; }
/* flex catches the longest possibility, so if some variable name contains a known word (function, macro, etc.), this will prevent it from highlighting */
-[A-z]+|" "|\t { yylval = strdup(yytext); return OTHER; }
+[A-z!-'*-@]+|" "|\t { yylval = strdup(yytext); return OTHER; }
%%