OSDN Git Service

コンパイラーの処理を一部モジュール化 & AST2IR 追加
authorstarg <starg@users.osdn.me>
Mon, 18 Jul 2016 07:15:54 +0000 (16:15 +0900)
committerstarg <starg@users.osdn.me>
Sat, 23 Jul 2016 05:30:50 +0000 (14:30 +0900)
include/ast2ir/ast2ir.hpp [new file with mode: 0644]
include/compiler/base.hpp [new file with mode: 0644]
include/parser/parser.hpp
src/CMakeLists.txt
src/ast2ir/CMakeLists.txt [new file with mode: 0644]
src/ast2ir/ast2ir.cpp [new file with mode: 0644]
src/ast2ir/pch.cpp [new file with mode: 0644]
src/ast2ir/pch.hpp [new file with mode: 0644]
src/parser/CMakeLists.txt
src/parser/parser.cpp

diff --git a/include/ast2ir/ast2ir.hpp b/include/ast2ir/ast2ir.hpp
new file mode 100644 (file)
index 0000000..415ec4d
--- /dev/null
@@ -0,0 +1,30 @@
+
+#pragma once
+
+#include <boost/optional.hpp>
+
+#include <ast/module.hpp>
+#include <compiler/base.hpp>
+#include <ir/module.hpp>
+
+namespace YAMML
+{
+
+namespace AST2IR
+{
+
+class AST2IRCompiler final : public Compiler::CompilerBase
+{
+public:
+    bool Compile(const AST::Module& mod);
+
+    boost::optional<IR::Module>& GetIR();
+    const boost::optional<IR::Module>& GetIR() const;
+
+private:
+    boost::optional<IR::Module> m_IR;
+};
+
+} // namespace AST2IR
+
+} // namespace YAMML
diff --git a/include/compiler/base.hpp b/include/compiler/base.hpp
new file mode 100644 (file)
index 0000000..c297d01
--- /dev/null
@@ -0,0 +1,66 @@
+
+#pragma once
+
+#include <algorithm>
+#include <functional>
+#include <utility>
+#include <vector>
+
+#include <message/message.hpp>
+
+namespace YAMML
+{
+
+namespace Compiler
+{
+
+class CompilerBase
+{
+public:
+    using CallbackFunctionType = bool(const Message::MessageItem&);
+
+    CompilerBase() = default;
+
+    template<typename T>
+    CompilerBase(T func) : m_Callback(std::move(func))
+    {
+    }
+
+    CompilerBase(const CompilerBase&) = delete;
+    CompilerBase& operator=(const CompilerBase&) = delete;
+
+    CompilerBase(CompilerBase&&) = delete;
+    CompilerBase& operator=(CompilerBase&&) = delete;
+
+    void AddMessage(Message::MessageItem msg)
+    {
+        m_Messages.push_back(msg);
+
+        if (m_Callback)
+        {
+            m_Callback(msg);
+        }
+    }
+
+    const std::vector<Message::MessageItem>& GetMessages() const
+    {
+        return m_Messages;
+    }
+
+    bool HasErrors() const
+    {
+        return std::find_if(
+            GetMessages().begin(),
+            GetMessages().end(),
+            [] (auto&& i) { return i.Kind == Message::MessageKind::Error || i.Kind == Message::MessageKind::FetalError; }
+        ) != GetMessages().end();
+    }
+
+private:
+    std::function<CallbackFunctionType> m_Callback;
+    std::vector<Message::MessageItem> m_Messages;
+};
+
+} // namespace Compiler
+
+} // namespace YAMML
index 13a7f43..64ad5d3 100644 (file)
@@ -6,6 +6,7 @@
 #include <vector>
 
 #include <ast/module.hpp>
+#include <compiler/base.hpp>
 #include <message/message.hpp>
 
 #include <boost/optional.hpp>
@@ -16,11 +17,9 @@ namespace YAMML
 namespace Parser
 {
 
-class YAMMLParser final
+class YAMMLParser final : public Compiler::CompilerBase
 {
 public:
-    using CallbackFunctionType = bool(const Message::MessageItem&);
-
     YAMMLParser(std::string name, std::string source);
     YAMMLParser(std::string name, std::string source, std::function<CallbackFunctionType> callback);
 
@@ -33,21 +32,15 @@ public:
     ~YAMMLParser() = default;
 
     bool Parse();
-    void AddMessage(Message::MessageItem msg);
 
     const std::string& GetSourceName() const;
 
     boost::optional<AST::Module>& GetAST();
     const boost::optional<AST::Module>& GetAST() const;
     
-    std::vector<Message::MessageItem>& GetMessages();
-    const std::vector<Message::MessageItem>& GetMessages() const;
-
 private:
     const std::string m_Name;
     const std::string m_Source;
-    const std::function<CallbackFunctionType> m_Callback;
-    std::vector<Message::MessageItem> m_Messages;
     boost::optional<AST::Module> m_AST;
 };
 
index 5247c10..479ca95 100644 (file)
@@ -1,3 +1,4 @@
 
+add_subdirectory(ast2ir)
 add_subdirectory(midiwriter)
 add_subdirectory(parser)
diff --git a/src/ast2ir/CMakeLists.txt b/src/ast2ir/CMakeLists.txt
new file mode 100644 (file)
index 0000000..5e241b8
--- /dev/null
@@ -0,0 +1,12 @@
+
+set(AST2IRHeaders
+    ../../include/ast2ir/ast2ir.hpp
+    ../../include/compiler/base.hpp
+)
+
+set(AST2IRSources
+    ast2ir.cpp
+)
+
+yamml_add_library(AST2IR STATIC AST2IRSources AST2IRHeaders)
+
diff --git a/src/ast2ir/ast2ir.cpp b/src/ast2ir/ast2ir.cpp
new file mode 100644 (file)
index 0000000..2b0cadf
--- /dev/null
@@ -0,0 +1,29 @@
+
+#include <ast2ir/ast2ir.hpp>
+
+
+namespace YAMML
+{
+
+namespace AST2IR
+{
+
+bool AST2IRCompiler::Compile(const AST::Module& mod)
+{
+    return false;
+}
+
+boost::optional<IR::Module>& AST2IRCompiler::GetIR()
+{
+    return m_IR;
+}
+
+const boost::optional<IR::Module>& AST2IRCompiler::GetIR() const
+{
+    return m_IR;
+}
+
+} // namespace AST2IR
+
+} // namespace YAMML
+
diff --git a/src/ast2ir/pch.cpp b/src/ast2ir/pch.cpp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/ast2ir/pch.hpp b/src/ast2ir/pch.hpp
new file mode 100644 (file)
index 0000000..d6e5f4a
--- /dev/null
@@ -0,0 +1,11 @@
+
+#pragma once
+
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <boost/optional.hpp>
+#include <boost/variant.hpp>
index cc360d2..5d135d7 100644 (file)
@@ -1,5 +1,6 @@
 
 set(ParserHeaders
+    ../../include/compiler/base.hpp
     ../../include/parser/parser.hpp
     action.hpp
     action_state_attribute.hpp
index 3242dbf..a1dbe10 100644 (file)
@@ -30,7 +30,7 @@ YAMMLParser::YAMMLParser(std::string name, std::string source)
 }
 
 YAMMLParser::YAMMLParser(std::string name, std::string source, std::function<CallbackFunctionType> callback)
-    : m_Name(std::move(name)), m_Source(std::move(source)), m_Callback(std::move(callback))
+    : CompilerBase(callback), m_Name(std::move(name)), m_Source(std::move(source))
 {
 }
 
@@ -41,13 +41,7 @@ bool YAMMLParser::Parse()
         AST::Module ast;
         bool result = pegtl::parse<Grammar::Module, pegtl::nothing, Control>(m_Source, m_Name, ast, *this);
 
-        bool hasErrors = std::find_if(
-            m_Messages.begin(),
-            m_Messages.end(),
-            [] (auto&& i) { return i.Kind == Message::MessageKind::Error || i.Kind == Message::MessageKind::FetalError; }
-        ) != m_Messages.end();
-
-        if (result && !hasErrors)
+        if (result && !HasErrors())
         {
             m_AST = std::move(ast);
             return true;
@@ -64,16 +58,6 @@ bool YAMMLParser::Parse()
     }
 }
 
-void YAMMLParser::AddMessage(Message::MessageItem msg)
-{
-    m_Messages.push_back(msg);
-
-    if (m_Callback)
-    {
-        m_Callback(msg);
-    }
-}
-
 const std::string & YAMMLParser::GetSourceName() const
 {
     return m_Name;
@@ -89,16 +73,6 @@ const boost::optional<AST::Module>& YAMMLParser::GetAST() const
     return m_AST;
 }
 
-std::vector<Message::MessageItem>& YAMMLParser::GetMessages()
-{
-    return m_Messages;
-}
-
-const std::vector<Message::MessageItem>& YAMMLParser::GetMessages() const
-{
-    return m_Messages;
-}
-
 } // namespace Parser
 
 } // namespace YAMML