فهرست منبع

some recent changes

Nicolas Winkler 7 سال پیش
والد
کامیت
57897e86b0
8فایلهای تغییر یافته به همراه168 افزوده شده و 31 حذف شده
  1. 35 1
      src/Ast.cpp
  2. 23 18
      src/Ast.h
  3. 73 1
      src/AstVisitor.cpp
  4. 0 1
      src/AstVisitor.h
  5. 19 3
      src/Semantic.h
  6. 15 3
      src/main.cpp
  7. 3 2
      src/makefile
  8. 0 2
      src/tests/full_tests/simple_arithmetic.qlw

+ 35 - 1
src/Ast.cpp

@@ -1,11 +1,45 @@
 #include "Ast.h"
-
+#include "AstVisitor.h"
+#include "Semantic.h"
 
 using namespace qlow::ast;
 
+
+AstObject::~AstObject(void)
+{
+}
+
+
+#define ACCEPT_DEFINITION(ClassName) \
+std::unique_ptr<qlow::sem::SemanticObject> ClassName::accept(AstVisitor& v) \
+{ \
+    v.visit(*this); \
+}
+
+ACCEPT_DEFINITION(Class)
+ACCEPT_DEFINITION(FeatureDeclaration)
+ACCEPT_DEFINITION(FieldDeclaration)
+ACCEPT_DEFINITION(MethodDefinition)
+ACCEPT_DEFINITION(VariableDeclaration)
+ACCEPT_DEFINITION(ArgumentDeclaration)
+ACCEPT_DEFINITION(DoEndBlock)
+ACCEPT_DEFINITION(Statement)
+ACCEPT_DEFINITION(Expression)
+ACCEPT_DEFINITION(FeatureCall)
+ACCEPT_DEFINITION(AssignmentStatement)
+ACCEPT_DEFINITION(NewVariableStatement)
+ACCEPT_DEFINITION(UnaryOperation)
+ACCEPT_DEFINITION(BinaryOperation)
+
+
+
 Statement::~Statement(void)
 {
 }
 
 
 
+
+
+
+

+ 23 - 18
src/Ast.h

@@ -27,7 +27,7 @@
 #include <memory>
 #include <utility>
 
-//#include "AstVisitor.h"
+#include "Visitor.h"
 
 namespace qlow
 {
@@ -63,11 +63,18 @@ namespace qlow
         struct UnaryOperation;
         struct BinaryOperation;
     }
+
+    namespace sem
+    {
+        class SemanticObject;
+    }
 }
 
 
-struct qlow::ast::AstObject : public Visitable<AstVisitor>
+struct qlow::ast::AstObject :
+    public Visitable<std::unique_ptr<sem::SemanticObject>, AstVisitor>
 {
+    virtual ~AstObject(void);
 };
 
 
@@ -81,7 +88,7 @@ struct qlow::ast::Class : public AstObject
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -95,7 +102,7 @@ struct qlow::ast::FeatureDeclaration : public AstObject
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -106,7 +113,7 @@ struct qlow::ast::FieldDeclaration : public FeatureDeclaration
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -131,7 +138,7 @@ struct qlow::ast::MethodDefinition : public FeatureDeclaration
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -144,7 +151,7 @@ struct qlow::ast::VariableDeclaration  : public AstObject
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -156,7 +163,7 @@ struct qlow::ast::ArgumentDeclaration :
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -169,7 +176,7 @@ struct qlow::ast::DoEndBlock : public AstObject
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -177,13 +184,13 @@ struct qlow::ast::Statement : public virtual AstObject
 {
     virtual ~Statement(void);
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
 struct qlow::ast::Expression : public virtual AstObject
 {
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -205,7 +212,7 @@ struct qlow::ast::FeatureCall : public Expression, public Statement
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -219,7 +226,7 @@ struct qlow::ast::AssignmentStatement : public Statement
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -232,7 +239,7 @@ struct qlow::ast::NewVariableStatement : public Statement
     {
     } 
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -247,8 +254,6 @@ struct qlow::ast::Operation : public Expression
         op(op)
     {
     }
-
-    void accept(AstVisitor& v);
 };
 
 
@@ -270,7 +275,7 @@ struct qlow::ast::UnaryOperation : public Operation
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 
@@ -285,7 +290,7 @@ struct qlow::ast::BinaryOperation : public Operation
     {
     }
 
-    void accept(AstVisitor& v);
+    std::unique_ptr<sem::SemanticObject> accept(AstVisitor& v);
 };
 
 

+ 73 - 1
src/AstVisitor.cpp

@@ -1,5 +1,5 @@
 #include "AstVisitor.h"
-
+#include "Ast.h"
 
 using namespace qlow;
 
@@ -12,3 +12,75 @@ std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::Class& ast)
 }
 
 
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::FeatureDeclaration& ast)
+{
+    // not needed, because 
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::FieldDeclaration& ast)
+{
+    auto f = std::make_unique<sem::Field>();
+    f->name = ast.name;
+    return f;
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::MethodDefinition& ast)
+{
+    auto m = std::make_unique<sem::Method>();
+    m->name = ast.name;
+    return m;
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::VariableDeclaration& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::ArgumentDeclaration& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::DoEndBlock& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::Statement& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::Expression& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::FeatureCall& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::AssignmentStatement& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::NewVariableStatement& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::UnaryOperation& ast)
+{
+}
+
+
+std::unique_ptr<sem::SemanticObject> AstVisitor::visit(ast::BinaryOperation& ast)
+{
+}
+
+

+ 0 - 1
src/AstVisitor.h

@@ -86,7 +86,6 @@ public:
     ReturnType visit(ast::FeatureCall& ast) override;
     ReturnType visit(ast::AssignmentStatement& ast) override;
     ReturnType visit(ast::NewVariableStatement& ast) override;
-    ReturnType visit(ast::Operation& ast) override;
     ReturnType visit(ast::UnaryOperation& ast) override;
     ReturnType visit(ast::BinaryOperation& ast) override;
 };

+ 19 - 3
src/Semantic.h

@@ -4,6 +4,7 @@
 #include <string>
 #include <map>
 #include "Util.h"
+#include "Ast.h"
 
 namespace qlow
 {
@@ -18,11 +19,19 @@ namespace qlow
 
         struct Field;
         struct Method;
+
+        void createFromAst(std::vector<std::unique_ptr<qlow::ast::Class>>& classes);
     }
 }
 
 
-struct Class
+struct qlow::sem::SemanticObject
+{
+    virtual ~SemanticObject(void);
+};
+
+
+struct qlow::sem::Class : public SemanticObject
 {
     std::string name;
     SymbolTable<Field> fields;
@@ -30,11 +39,18 @@ struct Class
 };
 
 
-struct Field
+struct qlow::sem::Field : public SemanticObject
 {
     Class* type;
     std::string name;
-}
+};
+
+
+struct qlow::sem::Method : public SemanticObject
+{
+    Class* returnType;
+    std::string name;
+};
 
 
 

+ 15 - 3
src/main.cpp

@@ -1,5 +1,6 @@
 #include <iostream>
 #include "Ast.h"
+#include "Semantic.h"
 
 extern std::unique_ptr<std::vector<std::unique_ptr<qlow::ast::Class>>> parsedClasses;
 extern FILE* qlow_parser_in;
@@ -7,9 +8,20 @@ extern int qlow_parser_parse(void);
 
 int main()
 {
-    qlow_parser_in = stdin;
-    ::qlow_parser_parse();
-    std::cout << parsedClasses->size() << std::endl;
+    try {
+        qlow_parser_in = stdin;
+        ::qlow_parser_parse();
+        std::cout << parsedClasses->size() << std::endl;
+
+        qlow::sem::createFromAst(*parsedClasses.get());
+    }
+    catch (const char* err)
+    {
+        std::cerr << err << std::endl;
+    }
+    catch (...)
+    {
+    }
 }
 
 

+ 3 - 2
src/makefile

@@ -1,5 +1,5 @@
 CXX := g++
-CXXFLAGS := -Wall -std=c++17
+CXXFLAGS := -Wall -Wextra -std=c++17
 LINKFLAGS :=
 
 YACC := bison
@@ -7,7 +7,8 @@ YACCFLAGS := -d
 LEX := flex
 LEXFLAGS :=
 
-OBJECTS := $(patsubst %.cpp, %.o, $(wildcard *.cpp */*.cpp)) \
+#OBJECTS := $(patsubst %.cpp, %.o, $(wildcard *.cpp */*.cpp))
+OBJECTS := $(patsubst %.cpp, %.o, $(wildcard *.cpp)) \
     parser.o lexer.o
 LIBRARIES := 
 EXECUTABLE := qlow

+ 0 - 2
src/tests/full_tests/simple_arithmetic.qlw

@@ -1,6 +1,4 @@
 
-
-
 class Main
     compute do
         // define our variables