diff options
| Commit | 2589290a7dc34c5f6d1cfc48ae8c6adf708729f2 (patch) | |
|---|---|---|
| Author | 2023-02-11 15:38:33 +0200 | |
| Committer | 2023-02-11 15:38:33 +0200 | |
| Files | 1bc3b5854c926a102e96a6ff698f9439ddc748d5 | |
| uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.tar uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.tar.gz uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.zip | ||
| Parent | a35a987997415dc8af71a3524ed19fc9bc4896e7 (diff) | |
[IPL/T] Finished grammar and makefile compilation
7 files changed, 22 insertions, 83 deletions
@@ -10,6 +10,8 @@ Year 2/Implementation of Programming Languages/*.yy.c Year 2/Implementation of Programming Languages/**/*.yy.c Year 2/Implementation of Programming Languages/*.tab.* Year 2/Implementation of Programming Languages/**/*.tab.* +Year 2/Implementation of Programming Languages/*.ghc +Year 2/Implementation of Programming Languages/**/*.ghc # --- # C++ diff --git a/Year 2/Implementation of Programming Languages/Transpiler/Makefile b/Year 2/Implementation of Programming Languages/Transpiler/Makefile index 52c45ab..ad1bdf9 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/Makefile +++ b/Year 2/Implementation of Programming Languages/Transpiler/Makefile @@ -1,9 +1,9 @@ CC=gcc -CFLAGS= +CFLAGS=-lfl CXX=g++ CXXFLAGS= LEX=flex -YACC=bison +YACC=bison -t -d .PHONY: all all: build-frontend run-frontend build-transpiler run-transpiler @@ -18,11 +18,11 @@ build-lexer: .PHONY: build-parser build-parser: - cd frontend && $(YACC) commonlisp2transpilerstr.y && mkdir -p ../build/ && mv commonlisp2transpilerstr.tab.c ../build/ + cd frontend && $(YACC) commonlisp2transpilerstr.y && mkdir -p ../build/ && mv commonlisp2transpilerstr.tab.* ../build/ .PHONY: run-frontend run-frontend: - cd build/ && frontend.out < ../src.cl >> CLtree.h + cd build/ && ./frontend.out < ../src.cl >> CLTree.h .PHONY: build-transpiler build-transpiler: diff --git a/Year 2/Implementation of Programming Languages/Transpiler/build/CLTree.h b/Year 2/Implementation of Programming Languages/Transpiler/build/CLTree.h new file mode 100644 index 0000000..5fe5bb5 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/build/CLTree.h @@ -0,0 +1 @@ +new Funcall("+", { new Integer(1), new Integer(2) }) diff --git a/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.l b/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.l index d2bffba..58218ef 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.l +++ b/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.l @@ -1,5 +1,5 @@ %{ -#include "../build/commonlisp2transpilerstr.tab.h" +#include "commonlisp2transpilerstr.tab.h" %} DIGIT [0-9] @@ -18,13 +18,12 @@ FUNCTION "+ "|"- "|"* "|\/|defun|defvar|if|=|>|>=|<|<= {LEFTBRACKET} { return LBRACKET; } {RIGHTBRACKET} { return RBRACKET; } -/* {STR} { yylval = strdup(yytext); return STR; } */ + /* {STR} { yylval = strdup(yytext); return STR; } */ {INTEGER} { yylval = strdup(yytext); return INTEGER; } {FLOAT} { yylval = strdup(yytext); return FLOAT;} {FUNCTION} { yylval = strdup(yytext); return FUNCTION; } - /* 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 NAME; } +[A-z!-'*-@]+ { yylval = strdup(yytext); return NAME; } %% diff --git a/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.y b/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.y index 04c58bd..b7675a3 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.y +++ b/Year 2/Implementation of Programming Languages/Transpiler/frontend/commonlisp2transpilerstr.y @@ -14,85 +14,21 @@ int yyerror(char *s); %% start: - | LBRACKET FUNCTION namelist + | start expr { printf("%s", $2); } -namelist: - | LBRACKET RBRACKET - | LBRACKET -start: - | start stlist { printf("%s", $2); free($2); } - | start terminal { printf("%s", $2); free($2); } - | start NEWLINE { printf("\n"); } - -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); } +expr: LBRACKET FUNCTION start RBRACKET { sprintf($$, "new Funcall(\"%s\", { %s })", $2, $3); } + | LBRACKET namelist RBRACKET { sprintf($$, "new List({ %s })", $2); } + | INTEGER { sprintf($$, "new Integer(%s)", $1); } + | FLOAT { sprintf($$, "new Float(%s)", $1); } + | NAME { sprintf($$, "new Name(\"%s\")", $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); } +namelist: { $$ = ""; } + | namelist NAME { sprintf($$, ", new Name(\"%s\")", $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); - free(s); - return str; -} -char* details(char *summary, char *rest) { - if (*rest == '\0') 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* 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); - free(second); - return concat; -} - - int yyerror(char *s) { printf("Error: %s\n", s); return 0; diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src.cl b/Year 2/Implementation of Programming Languages/Transpiler/src.cl new file mode 100644 index 0000000..4d956a6 --- /dev/null +++ b/Year 2/Implementation of Programming Languages/Transpiler/src.cl @@ -0,0 +1 @@ +(+ 1 2) diff --git a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp index e382161..4f2056a 100644 --- a/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp +++ b/Year 2/Implementation of Programming Languages/Transpiler/src/main.cpp @@ -15,14 +15,14 @@ void freeNodes(Value* v) { } int main() { - LLVMVisitor visitor("testout.ll"); + LLVMVisitor visitor("transpiled.ll"); std::deque<Value*> nodes = { - new Funcall("defvar", { new Name("myvar"), new Float(4.956) }) +#include "../build/CLTree.h" }; for (Value* n : nodes) { n->Visit(visitor); } - // visitor.insertMain(); + visitor.insertMain(); for (Value* n : nodes) freeNodes(n); |
