瀏覽代碼

long time no commit

Nicolas Winkler 7 年之前
父節點
當前提交
8eb3aef0e9
共有 5 個文件被更改,包括 149 次插入2 次删除
  1. 0 1
      src/AstVisitor.h
  2. 52 0
      src/Semantic.cpp
  3. 4 1
      src/Semantic.h
  4. 7 0
      src/main.cpp
  5. 86 0
      src/tests/VisitorTest.cpp

+ 0 - 1
src/AstVisitor.h

@@ -66,7 +66,6 @@ class qlow::AstVisitor :
         ast::FeatureCall,
         ast::AssignmentStatement,
         ast::NewVariableStatement,
-        ast::Operation,
         ast::UnaryOperation,
         ast::BinaryOperation
     >

+ 52 - 0
src/Semantic.cpp

@@ -0,0 +1,52 @@
+#include "Semantic.h"
+
+#include "AstVisitor.h"
+
+using namespace qlow::sem;
+
+namespace qlow
+{
+    namespace sem
+    {
+
+
+        template<typename T, typename U>
+        std::unique_ptr<T> unique_dynamic_cast(std::unique_ptr<U>&& p)
+        {
+            return std::unique_ptr<T> (dynamic_cast<T*>(p.release()));
+        }
+
+
+        SymbolTable<qlow::sem::Class>
+            createFromAst(std::vector<std::unique_ptr<qlow::ast::Class>>&
+                    classes)
+        {
+            AstVisitor av;
+
+            SymbolTable<sem::Class> semClasses;
+            for (auto& astClass : classes) {
+                auto semObj = av.visit(*astClass.get());
+                semClasses.insert(
+                    {
+                        astClass->name,
+                        unique_dynamic_cast<sem::Class>(std::move(semObj))
+                    }
+                );
+            }
+
+            return semClasses;
+        }
+
+    }
+}
+
+
+SemanticObject::~SemanticObject(void)
+{
+}
+
+
+
+
+
+

+ 4 - 1
src/Semantic.h

@@ -11,6 +11,9 @@ namespace qlow
     namespace sem
     {
 
+        /*!
+         * \brief contains owning pointers to elements
+         */
         template<typename T>
         using SymbolTable = std::map<std::string, std::unique_ptr<T>>;
 
@@ -20,7 +23,7 @@ namespace qlow
         struct Field;
         struct Method;
 
-        void createFromAst(std::vector<std::unique_ptr<qlow::ast::Class>>& classes);
+        SymbolTable<qlow::sem::Class> createFromAst(std::vector<std::unique_ptr<qlow::ast::Class>>& classes);
     }
 }
 

+ 7 - 0
src/main.cpp

@@ -13,7 +13,14 @@ int main()
         ::qlow_parser_parse();
         std::cout << parsedClasses->size() << std::endl;
 
+        std::cout << "parsing completed!" << std::endl;
+
         qlow::sem::createFromAst(*parsedClasses.get());
+        qlow::sem::SymbolTable<qlow::sem::Class> semClasses;
+
+        for (auto& [a, b] : semClasses) {
+            std::cout << "ay: " << a << std::endl;
+        }
     }
     catch (const char* err)
     {

+ 86 - 0
src/tests/VisitorTest.cpp

@@ -0,0 +1,86 @@
+#include "../Visitor.h"
+#include <iostream>
+
+using namespace qlow;
+
+
+class Animal;
+class Pig;
+class Cow;
+class Horse;
+
+
+class AnimalVisitor : public Visitor<void, Pig, Cow, Horse>
+//    public Visitor<
+//        // visitable types
+//        Pig, Cow, Horse
+//    >
+{
+public:
+
+    void visit(Pig& p) override
+    {
+        std::cout << "Hey Piggy" << std::endl;
+    }
+
+    void visit(Cow& p) override
+    {
+        std::cout << "Hay Cow" << std::endl;
+    }
+
+    void visit(Horse& p) override
+    {
+        std::cout << "Hiy Ross" << std::endl;
+    }
+};
+
+
+class Animal : public Visitable<AnimalVisitor>
+{
+};
+
+
+class Pig : public Animal
+{
+public:
+    inline void accept(AnimalVisitor& av) final
+    {
+        return av.visit(*this);
+    }
+};
+
+
+class Cow : public Animal
+{
+public:
+    inline void accept(AnimalVisitor& av) final
+    {
+        return av.visit(*this);
+    }
+};
+
+
+class Horse : public Animal
+{
+public:
+    inline void accept(AnimalVisitor& av) final
+    {
+        return av.visit(*this);
+    }
+};
+
+
+
+int main()
+{
+    Animal* animal = new Pig();
+    AnimalVisitor av;
+
+    animal->accept(av);
+    return 0;
+}
+
+
+
+
+