From 42f35a79ba65999be0a0f23327b4476bc131d20d Mon Sep 17 00:00:00 2001 From: starg Date: Tue, 2 Aug 2016 21:16:41 +0900 Subject: [PATCH] =?utf8?q?Composition2IRCompiler=20=E3=82=92=E4=B8=80?= =?utf8?q?=E9=80=9A=E3=82=8A=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/ir/track.hpp | 2 +- include/message/id.hpp | 1 + src/ast2ir/composition2ir.cpp | 54 +++++++++++++++++++++++++++++++++++++++---- src/ast2ir/composition2ir.hpp | 3 +++ src/ast2ir/pch.hpp | 1 + 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/include/ir/track.hpp b/include/ir/track.hpp index 201cb30..f05b1b6 100644 --- a/include/ir/track.hpp +++ b/include/ir/track.hpp @@ -33,7 +33,7 @@ class Track final public: std::vector Attributes; int Number; - std::vector Blocks; + std::vector Items; }; class TrackList final diff --git a/include/message/id.hpp b/include/message/id.hpp index 743dea6..bf77efb 100644 --- a/include/message/id.hpp +++ b/include/message/id.hpp @@ -14,6 +14,7 @@ enum class MessageID UnknownInComposition2IR, DuplicatedCompositionName, DuplicatedPhraseName, + NoSuchPhraseName, TooLargeRepeatCount }; diff --git a/src/ast2ir/composition2ir.cpp b/src/ast2ir/composition2ir.cpp index 512f5ea..20bb362 100644 --- a/src/ast2ir/composition2ir.cpp +++ b/src/ast2ir/composition2ir.cpp @@ -1,4 +1,8 @@ +#include +#include + +#include #include #include "composition2ir.hpp" @@ -55,14 +59,56 @@ IR::TrackBlock::BlockType Composition2IRCompiler::operator()(const AST::TrackLis { IR::TrackList trackList; trackList.Attributes = ast.Attributes; - trackList.Tracks.reserve(ast.Tracks.size()); - for (auto&& i : ast.Tracks) - { + std::transform( + ast.Tracks.begin(), + ast.Tracks.end(), + std::back_inserter(trackList.Tracks), + [this] (auto&& x) { return this->Compile(x); } + ); + return trackList; +} + +IR::Track Composition2IRCompiler::Compile(const AST::TrackBlock& ast) +{ + std::vector items; + + std::transform( + ast.Items.begin(), + ast.Items.end(), + std::back_inserter(items), + [this] (auto&& x) { return this->Compile(x); } + ); + + return IR::Track{ + ast.Attributes, + ast.TrackNumber, + items + }; +} + +IR::TrackItem Composition2IRCompiler::Compile(const AST::TrackItem& ast) +{ + auto itName = m_IR.BlockNameMap.find(ast.PhraseName); + + if (itName == m_IR.BlockNameMap.end()) + { + throw Exceptions::MessageException( + { + Message::MessageKind::Error, + Message::MessageID::NoSuchPhraseName, + m_IR.Name, + ast.Location, + {ast.PhraseName} + } + ); } - return trackList; + return IR::TrackItem{ + ast.Attributes, + IR::BlockReference{static_cast(std::distance(m_IR.BlockNameMap.begin(), itName))} + }; } } // namespace AST2IR diff --git a/src/ast2ir/composition2ir.hpp b/src/ast2ir/composition2ir.hpp index 9f33b9a..f1a8812 100644 --- a/src/ast2ir/composition2ir.hpp +++ b/src/ast2ir/composition2ir.hpp @@ -30,6 +30,9 @@ public: IR::TrackBlock::BlockType operator()(const AST::TrackListBlock& ast); private: + IR::Track Compile(const AST::TrackBlock& ast); + IR::TrackItem Compile(const AST::TrackItem& ast); + IR::Module& m_IR; std::deque> m_AttributeStack; }; diff --git a/src/ast2ir/pch.hpp b/src/ast2ir/pch.hpp index 86d631a..8e84ddd 100644 --- a/src/ast2ir/pch.hpp +++ b/src/ast2ir/pch.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include -- 2.11.0