--- /dev/null
+
+#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
--- /dev/null
+
+#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
#include <vector>
#include <ast/module.hpp>
+#include <compiler/base.hpp>
#include <message/message.hpp>
#include <boost/optional.hpp>
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);
~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;
};
+add_subdirectory(ast2ir)
add_subdirectory(midiwriter)
add_subdirectory(parser)
--- /dev/null
+
+set(AST2IRHeaders
+ ../../include/ast2ir/ast2ir.hpp
+ ../../include/compiler/base.hpp
+)
+
+set(AST2IRSources
+ ast2ir.cpp
+)
+
+yamml_add_library(AST2IR STATIC AST2IRSources AST2IRHeaders)
+
--- /dev/null
+
+#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
+
--- /dev/null
+
+#pragma once
+
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <boost/optional.hpp>
+#include <boost/variant.hpp>
set(ParserHeaders
+ ../../include/compiler/base.hpp
../../include/parser/parser.hpp
action.hpp
action_state_attribute.hpp
}
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))
{
}
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;
}
}
-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;
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