{Message::MessageID::GrammarPhrase2, "parse error: GrammarPhrase2"},
{Message::MessageID::GrammarPhrase3, "parse error: GrammarPhrase3"},
{Message::MessageID::GrammarPhrase4, "parse error: GrammarPhrase4"},
+ {Message::MessageID::GrammarSemicolon, "unexpected token '{0}'"},
{Message::MessageID::GrammarPhraseName, "expecting valid name for phrase"},
// IR2MIDI
>::ID = Message::MessageID::GrammarPhrase4;
template<>
+const Message::MessageID ErrorControl<pegtl::one<';'>>::ID = Message::MessageID::GrammarSemicolon;
+
+template<>
const Message::MessageID ErrorControl<Grammar::PhraseName>::ID = Message::MessageID::GrammarPhraseName;
} // namespace Parser
{
};
-class NoteSequence : public pegtl::star<pegtl::pad<NoteAndExpression, Separator>>
+class NoteSequence : public pegtl::plus<pegtl::pad<NoteAndExpression, Separator>>
{
};
-class NoteSequenceStatement : public pegtl::seq<AttributeOptionalSequence, pegtl::pad_opt<NoteSequence, Separator>, pegtl::one<';'>>
+class NoteSequenceStatement
+ : public pegtl::seq<
+ AttributeOptionalSequence,
+ pegtl::if_then_else<
+ NoteSequence,
+ pegtl::must<pegtl::one<';'>>,
+ pegtl::one<';'>
+ >
+>
{
};
class NoteSequenceBlock;
-class NoteSequenceStatementsAndBlocks : public pegtl::star<pegtl::sor<NoteSequenceStatement, NoteSequenceBlock>>
+class NoteSequenceStatementsAndBlocks : public pegtl::star<pegtl::sor<NoteSequenceBlock, NoteSequenceStatement>>
{
};