OSDN Git Service

State 変更の一部を OnParse() で処理するようにした
authorstarg <starg@users.osdn.me>
Fri, 15 Jul 2016 11:01:52 +0000 (20:01 +0900)
committerstarg <starg@users.osdn.me>
Fri, 15 Jul 2016 11:01:52 +0000 (20:01 +0900)
src/parser/action_state_phrase.hpp

index 518d989..555182a 100644 (file)
@@ -26,6 +26,11 @@ public:
         mod.Add(ASTNode);
     }
 
+    void OnParse(AST::NoteSequenceBlockWithoutAttributes node)
+    {
+        ASTNode.Block = node;
+    }
+
     AST::Phrase ASTNode;
 };
 
@@ -63,6 +68,11 @@ public:
         st.ASTNode.Sequences.emplace_back(ASTNode);
     }
 
+    void OnParse(AST::NoteSequenceBlockWithoutAttributes node)
+    {
+        ASTNode.Sequences.emplace_back(node);
+    }
+
     AST::NoteSequenceBlock ASTNode;
 };
 
@@ -87,23 +97,9 @@ public:
     template<typename TState>
     void success(TState& st)
     {
-        success(st, std::is_same<TState, PhraseState>{});
-    }
-
-private:
-    template<typename TState>
-    void success(TState& st, std::true_type)
-    {
-        st.ASTNode.Block = ASTNode;
+        st.OnParse(ASTNode);
     }
 
-    template<typename TState>
-    void success(TState& st, std::false_type)
-    {
-        st.ASTNode.Sequences.emplace_back(ASTNode);
-    }
-
-public:
     AST::NoteSequenceBlockWithoutAttributes ASTNode;
 };
 
@@ -131,7 +127,11 @@ public:
         st.ASTNode.Sequences.emplace_back(ASTNode);
     }
 
-public:
+    void OnParse(AST::NoteSequence node)
+    {
+        ASTNode.NoteSeq = node;
+    }
+
     AST::NoteSequenceStatement ASTNode;
 };
 
@@ -156,23 +156,9 @@ public:
     template<typename TState>
     void success(TState& st)
     {
-        success(st, std::is_same<TState, NoteSequenceStatementState>{});
-    }
-
-private:
-    template<typename TState>
-    void success(TState& st, std::true_type)
-    {
-        st.ASTNode.NoteSeq = ASTNode;
-    }
-
-    template<typename TState>
-    void success(TState& st, std::false_type)
-    {
-        st.ASTNode.Notes.emplace_back(ASTNode);
+        st.OnParse(ASTNode);
     }
 
-public:
     AST::NoteSequence ASTNode;
 };
 
@@ -200,6 +186,11 @@ public:
         st.ASTNode.Notes.push_back(ASTNode);
     }
 
+    void OnParse(AST::NoteSequence node)
+    {
+        ASTNode.Notes.emplace_back(node);
+    }
+
     AST::NoteAndExpression ASTNode;
 };
 
@@ -227,6 +218,11 @@ public:
         st.ASTNode.Notes.emplace_back(ASTNode);
     }
 
+    void OnParse(AST::NoteSequence node)
+    {
+        ASTNode.Notes.emplace_back(node);
+    }
+
     AST::NoteRepeatEachExpression ASTNode;
 };
 
@@ -264,6 +260,11 @@ public:
         st.ASTNode.Notes.emplace_back(ASTNode);
     }
 
+    void OnParse(AST::NoteSequence node)
+    {
+        ASTNode.Notes.emplace_back(node);
+    }
+
     AST::NoteRepeatExpression ASTNode;
 };
 
@@ -301,6 +302,16 @@ public:
         st.ASTNode.Notes.emplace_back(ASTNode);
     }
 
+    void OnParse(AST::SimpleDurationWithModifier node)
+    {
+        ASTNode.Duration = node;
+    }
+
+    void OnParse(AST::NoteNumber node)
+    {
+        ASTNode.Note = node;
+    }
+
     AST::NoteAndDuration ASTNode;
 };
 
@@ -328,6 +339,11 @@ public:
         st.ASTNode.Duration = ASTNode;
     }
 
+    void OnParse(AST::SimpleDurationWithModifier node)
+    {
+        ASTNode.Durations.push_back(node);
+    }
+
     AST::DurationSet ASTNode;
 };
 
@@ -352,23 +368,9 @@ public:
     template<typename TState>
     void success(TState& st)
     {
-        success(st, std::is_same<TState, DurationSetState>{});
-    }
-
-private:
-    template<typename TState>
-    void success(TState& st, std::true_type)
-    {
-        st.ASTNode.Durations.push_back(ASTNode);
-    }
-
-    template<typename TState>
-    void success(TState& st, std::false_type)
-    {
-        st.ASTNode.Duration = ASTNode;
+        st.OnParse(ASTNode);
     }
 
-public:
     AST::SimpleDurationWithModifier ASTNode;
 };
 
@@ -470,6 +472,11 @@ public:
         st.ASTNode.Note = ASTNode;
     }
 
+    void OnParse(AST::NoteNumber node)
+    {
+        ASTNode.Notes.push_back(node);
+    }
+
     AST::SimpleChord ASTNode;
 };
 
@@ -494,23 +501,9 @@ public:
     template<typename TState>
     void success(TState& st)
     {
-        success(st, std::is_same<TState, SimpleChordState>{});
-    }
-
-private:
-    template<typename TState>
-    void success(TState& st, std::true_type)
-    {
-        st.ASTNode.Notes.push_back(ASTNode);
+        st.OnParse(ASTNode);
     }
 
-    template<typename TState>
-    void success(TState& st, std::false_type)
-    {
-        st.ASTNode.Note = ASTNode;
-    }
-
-public:
     AST::NoteNumber ASTNode;
 };