Website Summary Files Commits Branches @commit @diff @stats
path: root / JSImpl / src / ASTPrinter.cpp
diff options
context:
space:
mode:
Commit4233fbfb9229c2c1d334075b7eb32410450f7a3d (patch)
Author
 martin dobrev <martindobrev0@gmail.com>
2018-10-05 09:35:33 +0300
Committer
 martin dobrev <martindobrev0@gmail.com>
2018-10-14 13:14:54 +0300
Files44361885a519bf4b71774b15e1b2219ba3ad6fea /JSImpl/src/ASTPrinter.cpp
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.tar
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.tar.gz
IPL-4233fbfb9229c2c1d334075b7eb32410450f7a3d.zip
Parentf398d80f395e7c4592fb6cc5d90d41a89dc127c7 (diff)
Now all expressions will be auto generated.
1 files changed, 82 insertions, 31 deletions
-rw-r--r--JSImpl/src/ASTPrinter.cpp113
diff --git a/JSImpl/src/ASTPrinter.cpp b/JSImpl/src/ASTPrinter.cpp
index dfb3447..5717264 100644
--- a/JSImpl/src/ASTPrinter.cpp
+++ b/JSImpl/src/ASTPrinter.cpp
@@ -1,34 +1,85 @@
#include "ASTPrinter.h"
+#include "Expression.h"
-ASTPrinter::ASTPrinter(std::ostream&)
-{}
-void ASTPrinter::Visit(BinaryExpression*)
-{}
-void ASTPrinter::Visit(UnaryExpression*)
-{}
-void ASTPrinter::Visit(LiteralExpression*)
-{}
-void ASTPrinter::Visit(IdentifierExpression*)
-{}
-void ASTPrinter::Visit(ListExpression*)
-{}
-void ASTPrinter::Visit(VariableDefinitionExpression*)
-{}
-void ASTPrinter::Visit(BlockStatement*)
-{}
-void ASTPrinter::Visit(LabeledStatement*)
-{}
-void ASTPrinter::Visit(IfStatement*)
-{}
-void ASTPrinter::Visit(SwitchStatement*)
-{}
-void ASTPrinter::Visit(WhileStatement*)
-{}
-void ASTPrinter::Visit(ForStatement*)
-{}
-void ASTPrinter::Visit(FunctionDeclaration*)
-{}
-void ASTPrinter::Visit(TopStatements*)
-{}
-void ASTPrinter::Visit(EmptyExpression*)
+ASTPrinter::ASTPrinter(std::ostream& os)
+ : os(os)
{}
+
+void Print(std::ostream& os, ASTPrinter &printer, const char* name, const ExpressionPtr& expr)
+{
+ os << name;
+ expr->Accept(printer);
+}
+
+void Print(std::ostream& os, ASTPrinter &printer, const char* name, const IPLVector<ExpressionPtr>& list)
+{
+ os << name << "[ \n";
+ for (auto& expr : list)
+ {
+ expr->Accept(printer);
+ os << ",";
+ }
+ os << name << "] \n";
+}
+
+void Print(std::ostream& os, ASTPrinter &printer, const char* name, const IPLVector<IPLString>& list)
+{
+ os << name << "[ \n";
+ for (auto& name : list)
+ {
+ os << name << ",";
+ }
+ os << name << "] \n";
+}
+
+
+template<typename T>
+void Print(std::ostream& os, ASTPrinter &printer, const char* name, T member)
+{
+ os << name << " " << member << "\n";
+}
+
+IPLString AsString(LiteralType type)
+{
+ switch (type)
+ {
+ case LiteralType::Number:
+ return "Number";
+ case LiteralType::String:
+ return "String";
+ case LiteralType::Boolean:
+ return "Boolean";
+ case LiteralType::Null:
+ return "Null";
+ case LiteralType::Undefined:
+ return "Undefined";
+ default:
+ break;
+ }
+ return "Undefined";
+}
+
+void ASTPrinter::Visit(LiteralExpression* e)
+{
+ os << "{\n" << "LiteralExpression" << '\n';
+ Print(os, *this, "BooleanValue", e->GetBooleanValue());
+ Print(os, *this, "LiteralType", AsString(e->GetLiteralType()));
+ Print(os, *this, "NumValue", e->GetNumValue());
+ Print(os, *this, "StringValue", e->GetStringValue());
+ os << "}\n";
+}
+
+
+
+#define VISIT_MEMBER(type, name, def) Print(os, *this, #name, e->Get##name());
+
+#define GENERATE_AST_PRINTER_FUNCTION(ClassName, Base, MEMBERS_ITERATOR)\
+ void ASTPrinter::Visit(ClassName* e) \
+ { \
+ os << "{\n" << #ClassName << '\n'; \
+ MEMBERS_ITERATOR(VISIT_MEMBER); \
+ os << "}\n"; \
+ }
+
+
+EXPRESSION_DEFINITION_ITERATOR(GENERATE_AST_PRINTER_FUNCTION); \ No newline at end of file