#pragma once
#include <string>
-#include <unordered_map>
+#include <vector>
#include <ast/composition.hpp>
#include <ast/phrase.hpp>
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
{
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;
{
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)
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());
}
{
- 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());
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);