@@ -23,10 +23,8 @@ namespace tao
2323 {
2424 namespace internal
2525 {
26- template < char Open, char Marker, char Close >
27- struct raw_string_tag
28- {
29- };
26+ template < char Open, char Marker, char Close, typename ... Contents >
27+ struct raw_string_tag ;
3028
3129 template < bool use_action, bool use_apply0, typename Tag >
3230 struct raw_string_state_apply ;
@@ -176,35 +174,6 @@ namespace tao
176174 {
177175 };
178176
179- template < class Tag , typename ... Rules >
180- struct raw_string_switch_state
181- {
182- using analyze_t = analysis::generic< analysis::rule_type::SEQ, Rules... >;
183-
184- template < apply_mode A,
185- rewind_mode M,
186- template < typename ... > class Action ,
187- template < typename ... > class Control ,
188- typename Input,
189- typename ... States >
190- static bool match ( Input& in, States&&... st )
191- {
192- using Iterator = typename Input::iterator_t ;
193- raw_string_state< Tag, Iterator > s ( const_cast < const Input& >( in ), st... );
194-
195- if ( duseltronik< seq< Rules... >, A, M, Action, Control >::match ( in, s ) ) {
196- s.template success < A, M, Action, Control >( in, st... );
197- return true ;
198- }
199- return false ;
200- }
201- };
202-
203- template < typename Tag, typename ... Rules >
204- struct skip_control < raw_string_switch_state< Tag, Rules... > > : std::true_type
205- {
206- };
207-
208177 } // namespace internal
209178
210179 // raw_string matches Lua-style long literals.
@@ -232,17 +201,37 @@ namespace tao
232201 // introduced newline-specific replacements in Lua 5.2, which we do not
233202 // support on the grammar level.
234203
235- template < char Open, char Marker, char Close >
204+ template < char Open, char Marker, char Close, typename ... Contents >
236205 struct raw_string
237- : internal::raw_string_switch_state< internal::raw_string_tag< Open, Marker, Close >,
238- internal::raw_string_open< Open, Marker >,
239- internal::must< internal::until< internal::at_raw_string_close< Marker, Close > > > >
240206 {
241- // This is used to bind an action to the content.
242- using content = internal::raw_string_tag< Open, Marker, Close >;
207+ // This is used as a tag to bind an action to the content.
208+ using content = internal::raw_string_tag< Open, Marker, Close, Contents... >;
209+
210+ // This is used internally.
211+ using open = internal::raw_string_open< Open, Marker >;
243212
244213 // This is used for error-reporting when a raw string is not closed properly.
245- using close = internal::until< internal::at_raw_string_close< Marker, Close > >;
214+ using close = internal::until< internal::at_raw_string_close< Marker, Close >, Contents... >;
215+
216+ using analyze_t = analysis::generic< analysis::rule_type::SEQ, open, internal::must< close > >;
217+
218+ template < apply_mode A,
219+ rewind_mode M,
220+ template < typename ... > class Action ,
221+ template < typename ... > class Control ,
222+ typename Input,
223+ typename ... States >
224+ static bool match ( Input& in, States&&... st )
225+ {
226+ using Iterator = typename Input::iterator_t ;
227+ internal::raw_string_state< content, Iterator > s ( const_cast < const Input& >( in ), st... );
228+
229+ if ( Control< internal::seq< open, internal::must< close > > >::template match< A, M, Action, Control >( in, s ) ) {
230+ s.template success < A, M, Action, Control >( in, st... );
231+ return true ;
232+ }
233+ return false ;
234+ }
246235 };
247236
248237 } // namespace TAOCPP_JSON_PEGTL_NAMESPACE
0 commit comments