From d909e546f2f2eaf625b38264f858ac9b352b763b Mon Sep 17 00:00:00 2001 From: Bobby Lucero Date: Wed, 24 May 2023 00:29:12 -0400 Subject: [PATCH] Rough implementation of ASTPrinter complete with nasty shared_ptr syntax :) --- headers/ASTPrinter.h | 18 +++++ headers/Expression.h | 77 +++++++++++++++------- headers/helperFunctions/HelperFunctions.h | 12 ++++ source/ASTPrinter.cpp | 43 ++++++++++++ source/main.cpp | 39 ++++++----- testthing | 48 +++++++++----- tools/GenerateAST | Bin 84424 -> 85432 bytes tools/GenerateAST.cpp | 23 +++++-- 8 files changed, 199 insertions(+), 61 deletions(-) create mode 100644 headers/ASTPrinter.h create mode 100644 source/ASTPrinter.cpp diff --git a/headers/ASTPrinter.h b/headers/ASTPrinter.h new file mode 100644 index 0000000..adc4d2d --- /dev/null +++ b/headers/ASTPrinter.h @@ -0,0 +1,18 @@ +#pragma once +#include "Expression.h" +#include +#include + +class ASTPrinter : public Visitor +{ + std::string visitBinaryExpr(BinaryExpr* expression) override; +// std::string visitGroupingExpr(GroupingExpr expression); + std::string visitLiteralExpr(LiteralExpr* expression) override; + std::string visitUnaryExpr(UnaryExpr* expression) override; +public: + int test = 10; + std::string print(Expr* expr); +private: + std::string parenthesize(std::string name, std::vector > > exprs); + +}; \ No newline at end of file diff --git a/headers/Expression.h b/headers/Expression.h index ef21c20..a911617 100644 --- a/headers/Expression.h +++ b/headers/Expression.h @@ -5,45 +5,74 @@ #pragma once #include "Lexer.h" #include + +template +struct Visitor; + +template struct Expr{ - virtual ~Expr() - { - - } + virtual T accept(Visitor* visitor) = 0; + virtual ~Expr(){} }; -struct BinaryExpr : Expr +template +struct BinaryExpr : Expr { - const Expr left; + const std::shared_ptr > left; const Token oper; - const Expr right; + const std::shared_ptr > right; - BinaryExpr(Expr left, Token oper, Expr right) : left(left), oper(oper), right(right) + BinaryExpr(std::shared_ptr > left, Token oper, std::shared_ptr > right) : left(left), oper(oper), right(right) { } -}; -struct GroupingExpr : Expr -{ - const Expr expression; - - GroupingExpr(Expr expression) : expression(expression) - { + T accept(Visitor* visitor) override{ + return visitor->visitBinaryExpr(this); } }; -struct LiteralExpr : Expr +//template +//struct GroupingExpr : Expr, Visitor +//{ +// Expr expression; +// +// GroupingExpr(Expr expression) : expression(expression) +// { +// } +// T accept(Visitor visitor){ +// return visitor.visitGroupingExpr(this); +// } +//}; +template +struct LiteralExpr : Expr { const std::string value; LiteralExpr(std::string value) : value(value) { } -}; -struct UnaryExpr : Expr -{ - const Token oper; - const Expr right; - - UnaryExpr(Token oper, Expr right) : oper(oper), right(right) - { + T accept(Visitor* visitor) override{ + return visitor->visitLiteralExpr(this); } }; +template +struct UnaryExpr : Expr +{ + const Token oper; + const std::shared_ptr > right; + + UnaryExpr(Token oper, std::shared_ptr > right) : oper(oper), right(right) + { + } + T accept(Visitor* visitor) override{ + return visitor->visitUnaryExpr(this); + } +}; + +//// +template +struct Visitor +{ + virtual T visitBinaryExpr(BinaryExpr* expression) = 0; +// virtual T visitGroupingExpr(GroupingExpr expression){}; + virtual T visitLiteralExpr(LiteralExpr* expression) = 0; + virtual T visitUnaryExpr(UnaryExpr* expression) = 0; +}; diff --git a/headers/helperFunctions/HelperFunctions.h b/headers/helperFunctions/HelperFunctions.h index e0aae20..7738f09 100644 --- a/headers/helperFunctions/HelperFunctions.h +++ b/headers/helperFunctions/HelperFunctions.h @@ -37,4 +37,16 @@ std::string trim(const std::string& str) { // Extract the trimmed substring return str.substr(start, end - start + 1); +} + +std::string replaceSubstring(const std::string& str, const std::string& findSubstring, const std::string& replacement) { + std::string result = str; + size_t startPos = result.find(findSubstring); + + while (startPos != std::string::npos) { + result.replace(startPos, findSubstring.length(), replacement); + startPos = result.find(findSubstring, startPos + replacement.length()); + } + + return result; } \ No newline at end of file diff --git a/source/ASTPrinter.cpp b/source/ASTPrinter.cpp new file mode 100644 index 0000000..9ac6c7c --- /dev/null +++ b/source/ASTPrinter.cpp @@ -0,0 +1,43 @@ +// +// Created by Bobby Lucero on 5/23/23. +// +#include "../headers/ASTPrinter.h" + + +std::string ASTPrinter::visitBinaryExpr(BinaryExpr* expression){ + std::cout << expression->left << std::endl; + return parenthesize(expression->oper.lexeme, std::vector > >{expression->left, expression->right}); +} + +//std::string ASTPrinter::visitGroupingExpr(GroupingExpr expression){ +// return "hi"; +//} +std::string ASTPrinter::visitLiteralExpr(LiteralExpr* expression){ + return expression->value; +} +std::string ASTPrinter::visitUnaryExpr(UnaryExpr* expression){ + return parenthesize(expression->oper.lexeme, std::vector > >{expression->right}); +} + +std::string ASTPrinter::print(Expr *expr) { + return expr->accept(this); +} + +std::string ASTPrinter::parenthesize(std::string name, std::vector > > exprs) { + std::string builder; + + builder += "(" + name; + + for(std::shared_ptr > expr : exprs) + { + std::cout << expr << std::endl; + + builder += " "; + builder += expr->accept(this); + } + + builder += ")"; + + return builder; + +} diff --git a/source/main.cpp b/source/main.cpp index d49ca38..8042f78 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,37 +1,44 @@ // // Created by Bobby Lucero on 5/21/23. // + + #include "../headers/bob.h" #include "../headers/Expression.h" #include "../headers/Lexer.h" +#include "../headers/ASTPrinter.h" int main(){ Bob bobLang; //bobLang.runFile("source.bob"); + ASTPrinter printer; - Expr a; - Expr b; - Token t = {PLUS, "+", 1}; - Token t2 = {MINUS, "-", 1}; - BinaryExpr e = BinaryExpr(a, t, b); + std::shared_ptr > expression = std::make_shared >( + std::make_shared >( + Token{MINUS, "-", 0}, + std::make_shared >("123") + ), + Token{STAR, "*", 0}, + std::make_shared >( + Token{MINUS, "+", 0}, + std::make_shared >("987") + ) + ); - std::shared_ptr any = std::make_shared(a, t, b); - if(std::shared_ptr binexpr = std::dynamic_pointer_cast(any)) - { - std::cout << binexpr->oper.lexeme; - } +// Expr* e = new BinaryExpr( +// new UnaryExpr(Token{MINUS, "-", 0}, new LiteralExpr("123")), +// Token{STAR, "*", 0}, +// new UnaryExpr(Token{PLUS, "+", 0}, new LiteralExpr("535")) +// ); + LiteralExpr* le = new LiteralExpr("123"); - any = std::make_shared(a, t2, b); - if(std::shared_ptr binexpr = std::dynamic_pointer_cast(any)) - { - std::cout << binexpr->oper.lexeme; - } + std::cout << printer.print(expression.get()); std::cout << std::endl; - bobLang.runPrompt(); + //bobLang.runPrompt(); return 0; } diff --git a/testthing b/testthing index c250188..a1ced34 100644 --- a/testthing +++ b/testthing @@ -1,35 +1,51 @@ -struct BinaryExpr : Expr +template +struct BinaryExpr : Expr, Visitor { - const Expr left; + const Expr left; const Token oper; - const Expr right; + const Expr right; - BinaryExpr(Expr left, Token oper, Expr right) : left(left), oper(oper), right(right) + BinaryExpr(Expr left, Token oper, Expr right) : left(left), oper(oper), right(right) { } + T accept(Visitor visitor){ + return visitor.visitBinaryExpr(this); + } }; -struct GroupingExpr : Expr +template +struct GroupingExpr : Expr, Visitor { - const Expr expression; + const Expr expression; - GroupingExpr(Expr expression) : expression(expression) + GroupingExpr(Expr expression) : expression(expression) { } + T accept(Visitor visitor){ + return visitor.visitGroupingExpr(this); + } }; -struct LiteralExpr : Expr +template +struct LiteralExpr : Expr, Visitor { const std::string value; LiteralExpr(std::string value) : value(value) { } -}; -struct UnaryExpr : Expr -{ - const Token oper; - const Expr right; - - UnaryExpr(Token oper, Expr right) : oper(oper), right(right) - { + T accept(Visitor visitor){ + return visitor.visitLiteralExpr(this); + } +}; +template +struct UnaryExpr : Expr, Visitor +{ + const Token oper; + const Expr right; + + UnaryExpr(Token oper, Expr right) : oper(oper), right(right) + { + } + T accept(Visitor visitor){ + return visitor.visitUnaryExpr(this); } }; diff --git a/tools/GenerateAST b/tools/GenerateAST index 20ee1aedd57083fc1b5d6668de7508df2586d63d..f7a7ff6bdcb711a951e58d5f49e6ba4f78baf7f3 100755 GIT binary patch delta 14450 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 delta 12068 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 diff --git a/tools/GenerateAST.cpp b/tools/GenerateAST.cpp index ae78bb9..3f672be 100644 --- a/tools/GenerateAST.cpp +++ b/tools/GenerateAST.cpp @@ -8,21 +8,29 @@ void defineType(std::ofstream &out, std::string baseName, std::string className, std::string fieldList) { - out << "struct " << className << "Expr : " << baseName << "\n{\n"; + out << "template \n"; + out << "struct " << className << "Expr : " << baseName << "" << ", Visitor" << "\n{\n"; std::vector fields = splitString(fieldList, ", "); for(std::string field : fields) { - out << " const " << trim(field) << ";\n"; + std::cout << trim(field) << std::endl; + std::string fieldClass = splitString(trim(field), " ")[0]; + std::string fieldName = splitString(trim(field), " ")[1]; + fieldClass = trim(fieldClass) == "Expr" ? "Expr" : trim(fieldClass); + out << " const " << fieldClass << " " << fieldName << ";\n"; } - + fieldList = replaceSubstring(fieldList, "Expr", "Expr"); out << "\n " << className << "Expr(" << fieldList << ") : "; std::string explicitDeclaration; for(std::string field : fields) { - std::string name = splitString(trim(field), " ")[1]; + std::cout << trim(field) << std::endl; + std::string fieldClass = splitString(trim(field), " ")[0]; + std::string fieldName = splitString(trim(field), " ")[1]; + fieldClass = trim(fieldClass) == "Expr" ? "Expr" : trim(fieldClass); - explicitDeclaration += trim(name) + "(" + trim(name) + "), "; + explicitDeclaration += trim(fieldName) + "(" + trim(fieldName) + "), "; } explicitDeclaration = trim(explicitDeclaration); explicitDeclaration.pop_back(); @@ -31,6 +39,11 @@ void defineType(std::ofstream &out, std::string baseName, std::string className, out << "\n {\n"; out << " }\n"; + + out << " T accept(Visitor visitor){\n"; + out << " return visitor.visit" << className << "Expr(this);\n"; + out << " }\n"; + out << "};" << std::endl; }