OSDN Git Service

Composition2IRCompiler を一通り実装
authorstarg <starg@users.osdn.me>
Tue, 2 Aug 2016 12:16:41 +0000 (21:16 +0900)
committerstarg <starg@users.osdn.me>
Tue, 2 Aug 2016 12:16:41 +0000 (21:16 +0900)
include/ir/track.hpp
include/message/id.hpp
src/ast2ir/composition2ir.cpp
src/ast2ir/composition2ir.hpp
src/ast2ir/pch.hpp

index 201cb30..f05b1b6 100644 (file)
@@ -33,7 +33,7 @@ class Track final
 public:
     std::vector<AST::Attribute> Attributes;
     int Number;
-    std::vector<TrackItem> Blocks;
+    std::vector<TrackItem> Items;
 };
 
 class TrackList final
index 743dea6..bf77efb 100644 (file)
@@ -14,6 +14,7 @@ enum class MessageID
     UnknownInComposition2IR,
     DuplicatedCompositionName,
     DuplicatedPhraseName,
+    NoSuchPhraseName,
     TooLargeRepeatCount
 };
 
index 512f5ea..20bb362 100644 (file)
@@ -1,4 +1,8 @@
 
+#include <algorithm>
+#include <iterator>
+
+#include <exceptions/messageexception.hpp>
 #include <message/message.hpp>
 
 #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<IR::TrackItem> 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::size_t>(std::distance(m_IR.BlockNameMap.begin(), itName))}
+    };
 }
 
 } // namespace AST2IR
index 9f33b9a..f1a8812 100644 (file)
@@ -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<std::vector<AST::Attribute>> m_AttributeStack;
 };
index 86d631a..8e84ddd 100644 (file)
@@ -7,6 +7,7 @@
 #include <deque>
 #include <exception>
 #include <functional>
+#include <iterator>
 #include <string>
 #include <utility>
 #include <vector>