OSDN Git Service

AST には同名の要素を格納できるように変更
authorstarg <starg@users.osdn.me>
Sat, 23 Jul 2016 05:22:32 +0000 (14:22 +0900)
committerstarg <starg@users.osdn.me>
Sat, 23 Jul 2016 05:23:51 +0000 (14:23 +0900)
include/ast/module.hpp
src/parser/action_state_composition.hpp
src/parser/action_state_phrase.hpp
src/parser/pch.hpp
test/parser/parsertest.cpp

index 9ef7b89..5bcf7e1 100644 (file)
@@ -2,7 +2,7 @@
 #pragma once
 
 #include <string>
-#include <unordered_map>
+#include <vector>
 
 #include <ast/composition.hpp>
 #include <ast/phrase.hpp>
@@ -16,36 +16,9 @@ namespace AST
 class Module final
 {
 public:
-    // returns false if an item with the same name already exists
-    bool TryAdd(const Composition& c)
-    {
-        if (Compositions.find(c.Name) == Compositions.end())
-        {
-            Compositions[c.Name] = c;
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
-    bool TryAdd(const Phrase& ph)
-    {
-        if (Phrases.find(ph.Name) == Phrases.end())
-        {
-            Phrases[ph.Name] = ph;
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-    }
-
     std::string Name;
-    std::unordered_map<std::string, Phrase> Phrases;
-    std::unordered_map<std::string, Composition> Compositions;
+    std::vector<Phrase> Phrases;
+    std::vector<Composition> Compositions;
 };
 
 } // namespace AST
index db2aade..ea2bd2b 100644 (file)
@@ -22,20 +22,9 @@ class CompositionState
 {
 public:
     template<typename... TCommonStates>
-    void success(AST::Module& mod, YAMMLParser& parser, TCommonStates&...)
+    void success(AST::Module& mod, TCommonStates&...)
     {
-        if (!mod.TryAdd(ASTNode))
-        {
-            parser.AddMessage(
-                {
-                    Message::MessageKind::Error,
-                    Message::MessageID::DuplicatedCompositionName,
-                    parser.GetSourceName(),
-                    ASTNode.Location,
-                    {ASTNode.Name}
-                }
-            );
-        }
+        mod.Compositions.push_back(ASTNode);
     }
 
     AST::Composition ASTNode;
index 4b1226e..b9d5c5c 100644 (file)
@@ -24,20 +24,9 @@ class PhraseState
 {
 public:
     template<typename... TCommonStates>
-    void success(AST::Module& mod, YAMMLParser& parser, TCommonStates&...)
-    {
-        if (!mod.TryAdd(ASTNode))
-        {
-            parser.AddMessage(
-                {
-                    Message::MessageKind::Error,
-                    Message::MessageID::DuplicatedPhraseName,
-                    parser.GetSourceName(),
-                    ASTNode.Location,
-                    {ASTNode.Name}
-                }
-            );
-        }
+    void success(AST::Module& mod, TCommonStates&...)
+    {
+        mod.Phrases.push_back(ASTNode);
     }
 
     void OnParse(AST::NoteSequenceBlockWithoutAttributes node)
index 5ff7b01..aa92e84 100644 (file)
@@ -5,7 +5,6 @@
 #include <functional>
 #include <string>
 #include <type_traits>
-#include <unordered_map>
 #include <utility>
 #include <vector>
 
index e2868b8..5cfb201 100644 (file)
@@ -41,13 +41,11 @@ composition Main
     auto module = parser.GetAST();
 
     {
-        auto itPhrase = module->Phrases.find("Foo");
+        auto itPhrase = module->Phrases.begin();
 
         BOOST_REQUIRE(itPhrase != module->Phrases.end());
 
-        BOOST_CHECK_EQUAL(itPhrase->first, "Foo");
-
-        auto phrase = itPhrase->second;
+        auto phrase = *itPhrase;
 
         BOOST_CHECK_EQUAL(phrase.Name, "Foo");
         BOOST_CHECK(phrase.Attributes.empty());
@@ -93,12 +91,10 @@ composition Main
     }
 
     {
-        auto itComposition = module->Compositions.find("Main");
+        auto itComposition = module->Compositions.begin();
         BOOST_REQUIRE(itComposition != module->Compositions.end());
 
-        BOOST_CHECK_EQUAL(itComposition->first, "Main");
-
-        auto composition = itComposition->second;
+        auto composition = *itComposition;
 
         BOOST_CHECK_EQUAL(composition.Name, "Main");
         BOOST_CHECK(composition.Attributes.empty());
@@ -165,13 +161,13 @@ composition Main
     auto module = parser.GetAST();
     BOOST_REQUIRE(module.is_initialized());
 
-    auto itComposition = module->Compositions.find("Main");
+    auto itComposition = module->Compositions.begin();
     BOOST_REQUIRE(itComposition != module->Compositions.end());
 
-    BOOST_CHECK_EQUAL(itComposition->first, "Main");
-    BOOST_CHECK_EQUAL(itComposition->second.Attributes.size(), 1);
+    BOOST_CHECK_EQUAL(itComposition->Name, "Main");
+    BOOST_CHECK_EQUAL(itComposition->Attributes.size(), 1);
     
-    auto attr = itComposition->second.Attributes.at(0);
+    auto attr = itComposition->Attributes.at(0);
 
     BOOST_CHECK_EQUAL(attr.Name, "foo");
     BOOST_CHECK_EQUAL(attr.Location.Line, 3);