From: starg Date: Mon, 18 Jul 2016 07:15:54 +0000 (+0900) Subject: コンパイラーの処理を一部モジュール化 & AST2IR 追加 X-Git-Tag: v0.1.827.0~106 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=e9e861b2848d97a2823e0d9832ee7c48784c7a54;p=yamml%2Fyamml-git.git コンパイラーの処理を一部モジュール化 & AST2IR 追加 --- diff --git a/include/ast2ir/ast2ir.hpp b/include/ast2ir/ast2ir.hpp new file mode 100644 index 0000000..415ec4d --- /dev/null +++ b/include/ast2ir/ast2ir.hpp @@ -0,0 +1,30 @@ + +#pragma once + +#include + +#include +#include +#include + +namespace YAMML +{ + +namespace AST2IR +{ + +class AST2IRCompiler final : public Compiler::CompilerBase +{ +public: + bool Compile(const AST::Module& mod); + + boost::optional& GetIR(); + const boost::optional& GetIR() const; + +private: + boost::optional m_IR; +}; + +} // namespace AST2IR + +} // namespace YAMML diff --git a/include/compiler/base.hpp b/include/compiler/base.hpp new file mode 100644 index 0000000..c297d01 --- /dev/null +++ b/include/compiler/base.hpp @@ -0,0 +1,66 @@ + +#pragma once + +#include +#include +#include +#include + +#include + +namespace YAMML +{ + +namespace Compiler +{ + +class CompilerBase +{ +public: + using CallbackFunctionType = bool(const Message::MessageItem&); + + CompilerBase() = default; + + template + 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& 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 m_Callback; + std::vector m_Messages; +}; + +} // namespace Compiler + +} // namespace YAMML diff --git a/include/parser/parser.hpp b/include/parser/parser.hpp index 13a7f43..64ad5d3 100644 --- a/include/parser/parser.hpp +++ b/include/parser/parser.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -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 callback); @@ -33,21 +32,15 @@ public: ~YAMMLParser() = default; bool Parse(); - void AddMessage(Message::MessageItem msg); const std::string& GetSourceName() const; boost::optional& GetAST(); const boost::optional& GetAST() const; - std::vector& GetMessages(); - const std::vector& GetMessages() const; - private: const std::string m_Name; const std::string m_Source; - const std::function m_Callback; - std::vector m_Messages; boost::optional m_AST; }; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5247c10..479ca95 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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 index 0000000..5e241b8 --- /dev/null +++ b/src/ast2ir/CMakeLists.txt @@ -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 index 0000000..2b0cadf --- /dev/null +++ b/src/ast2ir/ast2ir.cpp @@ -0,0 +1,29 @@ + +#include + + +namespace YAMML +{ + +namespace AST2IR +{ + +bool AST2IRCompiler::Compile(const AST::Module& mod) +{ + return false; +} + +boost::optional& AST2IRCompiler::GetIR() +{ + return m_IR; +} + +const boost::optional& 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 index 0000000..e69de29 diff --git a/src/ast2ir/pch.hpp b/src/ast2ir/pch.hpp new file mode 100644 index 0000000..d6e5f4a --- /dev/null +++ b/src/ast2ir/pch.hpp @@ -0,0 +1,11 @@ + +#pragma once + +#include +#include +#include +#include +#include + +#include +#include diff --git a/src/parser/CMakeLists.txt b/src/parser/CMakeLists.txt index cc360d2..5d135d7 100644 --- a/src/parser/CMakeLists.txt +++ b/src/parser/CMakeLists.txt @@ -1,5 +1,6 @@ set(ParserHeaders + ../../include/compiler/base.hpp ../../include/parser/parser.hpp action.hpp action_state_attribute.hpp diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index 3242dbf..a1dbe10 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -30,7 +30,7 @@ YAMMLParser::YAMMLParser(std::string name, std::string source) } YAMMLParser::YAMMLParser(std::string name, std::string source, std::function 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(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& YAMMLParser::GetAST() const return m_AST; } -std::vector& YAMMLParser::GetMessages() -{ - return m_Messages; -} - -const std::vector& YAMMLParser::GetMessages() const -{ - return m_Messages; -} - } // namespace Parser } // namespace YAMML