From 949d992ac60ef51fd5fb2950726ed90a6d1af83a Mon Sep 17 00:00:00 2001 From: starg Date: Tue, 5 Jul 2016 20:31:44 +0900 Subject: [PATCH] =?utf8?q?composition=20=E3=83=91=E3=83=BC=E3=82=B5?= =?utf8?q?=E3=83=BC=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/ast/composition.hpp | 3 +- src/parser/parser_attribute.hpp | 6 ++-- src/parser/parser_composition.hpp | 53 +++++++++++++++++++++++++++++++++++ src/parser/parser_literal.hpp | 6 +++- src/parser/parser_module.hpp | 8 ++++++ test/parser/CMakeLists.txt | 1 + test/parser/compositionparsertest.cpp | 34 ++++++++++++++++++++++ 7 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 test/parser/compositionparsertest.cpp diff --git a/include/ast/composition.hpp b/include/ast/composition.hpp index 992f4d7..99aee48 100644 --- a/include/ast/composition.hpp +++ b/include/ast/composition.hpp @@ -34,6 +34,7 @@ public: class TrackBlock final { public: + std::vector Attributes; int TrackNumber; std::vector Items; SourceLocation Location; @@ -52,7 +53,7 @@ class Composition final public: std::string Name; std::vector Attributes; - std::vector> Statements; + std::vector> Statements; SourceLocation Location; }; diff --git a/src/parser/parser_attribute.hpp b/src/parser/parser_attribute.hpp index be5a815..1d56f41 100644 --- a/src/parser/parser_attribute.hpp +++ b/src/parser/parser_attribute.hpp @@ -16,7 +16,7 @@ namespace Grammar { class AttributeArgumentList - : public pegtl::seq, pegtl::pad_opt, Separator>, Separator>, pegtl::one<')'>> + : public pegtl::if_must, pegtl::pad_opt, Separator>, Separator>, pegtl::one<')'>> { }; @@ -25,7 +25,9 @@ class Attribute pegtl::one<'['>, pegtl::pad< pegtl::list_must< - pegtl::seq>, pegtl::one<','>, Separator + pegtl::seq>, + pegtl::one<','>, + Separator >, Separator >, diff --git a/src/parser/parser_composition.hpp b/src/parser/parser_composition.hpp index 996f1d3..0797641 100644 --- a/src/parser/parser_composition.hpp +++ b/src/parser/parser_composition.hpp @@ -3,6 +3,10 @@ #include +#include "parser_attribute.hpp" +#include "parser_literal.hpp" +#include "parser_skips.hpp" + namespace YAMML { @@ -12,6 +16,55 @@ namespace Parser namespace Grammar { +class Command : public pegtl::seq, Separator>, Separator>, pegtl::one<';'>> +{ +}; + +class TrackItem : public pegtl::seq, pegtl::one<';'>> +{ +}; + +class TrackBlock + : public pegtl::seq< + AttributeOptionalSequence, + pegtl::if_must< + UnsignedInteger, + pegtl::pad, Separator>, + pegtl::star, + pegtl::pad, Separator> + > + > +{ +}; + +class TrackListBlock + : public pegtl::seq< + AttributeOptionalSequence, + pegtl::if_must< + pegtl_string_t("tracks"), + pegtl::pad, Separator>, + pegtl::star, + pegtl::pad, Separator> + > + > +{ +}; + +class Composition + : public pegtl::seq< + AttributeOptionalSequence, + pegtl::if_must< + pegtl_string_t("composition"), + Separator, + Identifier, + pegtl::pad, Separator>, + pegtl::star, TrackListBlock>>, + pegtl::pad, Separator> + > + > +{ +}; + } // namespace Grammar } // namespace Parser diff --git a/src/parser/parser_literal.hpp b/src/parser/parser_literal.hpp index 5f7f510..1b7a1e9 100644 --- a/src/parser/parser_literal.hpp +++ b/src/parser/parser_literal.hpp @@ -14,7 +14,11 @@ namespace Parser namespace Grammar { -class UnsignedInteger : public pegtl::seq, pegtl::star> +class UnsignedInteger + : public pegtl::sor< + pegtl::seq, pegtl::not_at>, + pegtl::seq, pegtl::star> + > { }; diff --git a/src/parser/parser_module.hpp b/src/parser/parser_module.hpp index 996f1d3..89af5e3 100644 --- a/src/parser/parser_module.hpp +++ b/src/parser/parser_module.hpp @@ -3,6 +3,10 @@ #include +#include "parser_composition.hpp" +#include "parser_phrase.hpp" +#include "parser_skips.hpp" + namespace YAMML { @@ -12,6 +16,10 @@ namespace Parser namespace Grammar { +class Module : public pegtl::must, Separator>>, Separators, pegtl::eof> +{ +}; + } // namespace Grammar } // namespace Parser diff --git a/test/parser/CMakeLists.txt b/test/parser/CMakeLists.txt index e85a2fb..3205f8e 100644 --- a/test/parser/CMakeLists.txt +++ b/test/parser/CMakeLists.txt @@ -13,3 +13,4 @@ yamml_add_test_one(ParserTest parsertest.cpp ParserTestHeaders) target_link_libraries(ParserTest_Exe Parser) yamml_add_test_one(PhraseParserTest phraseparsertest.cpp ParserTestHeaders) +yamml_add_test_one(CompositionParserTest compositionparsertest.cpp ParserTestHeaders) diff --git a/test/parser/compositionparsertest.cpp b/test/parser/compositionparsertest.cpp new file mode 100644 index 0000000..e9abe68 --- /dev/null +++ b/test/parser/compositionparsertest.cpp @@ -0,0 +1,34 @@ + +#include + +#include +#include + +#include "../../src/parser/parser_composition.hpp" + +using namespace YAMML::Parser::Grammar; + +BOOST_AUTO_TEST_SUITE(CompositionParserTest) + +BOOST_AUTO_TEST_CASE(CompositionTest1) +{ + std::string data = R"( + +composition Foo +{ + tracks + { + [program(0)] 1 + { + Bar; + } + } +} + +)"; + + bool result = pegtl::parse>(data, "source"); + BOOST_CHECK(result); +} + +BOOST_AUTO_TEST_SUITE_END() -- 2.11.0