diff options
[IPL/HW02] Simplified some functions and properly implemented code folding
1 files changed, 36 insertions, 26 deletions
| -rw-r--r-- | Year 2/Implementation of Programming Languages/Homework 02/codefold.y | 62 |
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); |
