OSDN Git Service

エラーメッセージの表示を改善
authorstarg <starg@users.osdn.me>
Thu, 25 Aug 2016 17:36:50 +0000 (02:36 +0900)
committerstarg <starg@users.osdn.me>
Thu, 25 Aug 2016 17:36:50 +0000 (02:36 +0900)
include/message/id.hpp
src/driver/msgcallback.cpp
src/parser/error_phrase.hpp
src/parser/parser_phrase.hpp

index a5c05d1..45d475b 100644 (file)
@@ -71,6 +71,7 @@ enum class MessageID : int
     GrammarPhrase2,
     GrammarPhrase3,
     GrammarPhrase4,
+    GrammarSemicolon,
     GrammarPhraseName,
 
     // IR2MIDI
index ba8e86a..3b5e815 100644 (file)
@@ -92,6 +92,7 @@ MessagePrinter::MessagePrinter(IStdErrWriter* pStdErrWriter)
         {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
index e685929..afe679d 100644 (file)
@@ -52,6 +52,9 @@ const Message::MessageID ErrorControl<
 >::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
index a7cf65e..3770c43 100644 (file)
@@ -149,17 +149,25 @@ class NoteAndExpression
 {
 };
 
-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>>
 {
 };