Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit2589290a7dc34c5f6d1cfc48ae8c6adf708729f2 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-02-11 15:38:33 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-02-11 15:38:33 +0200
Files1bc3b5854c926a102e96a6ff698f9439ddc748d5
uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.tar
uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.tar.gz
uni-projects-2589290a7dc34c5f6d1cfc48ae8c6adf708729f2.zip
Parenta35a987997415dc8af71a3524ed19fc9bc4896e7 (diff)
[IPL/T] Finished grammar and makefile compilation
diff --git a/.gitignore b/.gitignore
index 031020e..b430343 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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);