225 virtual void at_reduce(
any& result_any,
int prod, std::vector<any>& rhs) {
228 case Teuchos::YAML::PROD_DOC:
229 case Teuchos::YAML::PROD_DOC2: {
230 std::size_t offset = prod == Teuchos::YAML::PROD_DOC2 ? 1 : 0;
232 swap(result_any, rhs.at(offset));
236 case Teuchos::YAML::PROD_TOP_BMAP: {
241 result_any = pair_rhs_any;
244 case Teuchos::YAML::PROD_TOP_FIRST: {
246 swap(result_any, rhs.at(0));
250 case Teuchos::YAML::PROD_TOP_NEXT: {
253 "Can't specify multiple top-level ParameterLists in one YAML file!\n");
254 swap(result_any, rhs.at(1));
256 swap(result_any, rhs.at(0));
260 case Teuchos::YAML::PROD_BMAP_FIRST:
261 case Teuchos::YAML::PROD_FMAP_FIRST: {
267 case Teuchos::YAML::PROD_BMAP_NEXT: {
271 case Teuchos::YAML::PROD_FMAP_NEXT: {
275 case Teuchos::YAML::PROD_BMAP_SCALAR:
276 case Teuchos::YAML::PROD_FMAP_SCALAR:
277 case Teuchos::YAML::PROD_FMAP_FMAP:
278 case Teuchos::YAML::PROD_FMAP_FSEQ: {
283 case Teuchos::YAML::PROD_BMAP_BSCALAR: {
287 case Teuchos::YAML::PROD_BMAP_BVALUE: {
288 map_item(result_any, rhs.at(0), rhs.at(4));
291 case Teuchos::YAML::PROD_BVALUE_EMPTY: {
295 case Teuchos::YAML::PROD_BVALUE_BMAP:
296 case Teuchos::YAML::PROD_BVALUE_BSEQ: {
297 swap(result_any, rhs.at(1));
300 case Teuchos::YAML::PROD_BMAP_FMAP: {
301 map_item(result_any, rhs.at(0), rhs.at(4));
304 case Teuchos::YAML::PROD_BMAP_FSEQ: {
311 case Teuchos::YAML::PROD_BSEQ_FIRST: {
315 case Teuchos::YAML::PROD_BSEQ_NEXT: {
319 case Teuchos::YAML::PROD_BSEQ_SCALAR: {
320 swap(result_any, rhs.at(3));
325 case Teuchos::YAML::PROD_BSEQ_BSCALAR: {
326 swap(result_any, rhs.at(2));
329 case Teuchos::YAML::PROD_BSEQ_BMAP:
330 case Teuchos::YAML::PROD_BSEQ_BMAP_TRAIL:
331 case Teuchos::YAML::PROD_BSEQ_FMAP: {
332 throw ParserFail(
"Can't interpret a map inside a sequence as a Teuchos Parameter");
334 case Teuchos::YAML::PROD_BSEQ_BSEQ: {
335 swap(result_any, rhs.at(3));
338 case Teuchos::YAML::PROD_BSEQ_BSEQ_TRAIL: {
339 swap(result_any, rhs.at(4));
342 case Teuchos::YAML::PROD_BSEQ_FSEQ: {
343 swap(result_any, rhs.at(3));
346 case Teuchos::YAML::PROD_FMAP: {
347 swap(result_any, rhs.at(2));
350 case Teuchos::YAML::PROD_FMAP_EMPTY: {
354 case Teuchos::YAML::PROD_FSEQ: {
355 swap(result_any, rhs.at(2));
360 case Teuchos::YAML::PROD_FSEQ_EMPTY: {
364 case Teuchos::YAML::PROD_FSEQ_FIRST: {
368 case Teuchos::YAML::PROD_FSEQ_NEXT: {
372 case Teuchos::YAML::PROD_FSEQ_SCALAR: {
373 swap(result_any, rhs.at(1));
378 case Teuchos::YAML::PROD_FSEQ_FSEQ:
379 case Teuchos::YAML::PROD_FSEQ_FMAP: {
380 swap(result_any, rhs.at(1));
383 case Teuchos::YAML::PROD_SCALAR_QUOTED:
384 case Teuchos::YAML::PROD_MAP_SCALAR_QUOTED: {
385 swap(result_any, rhs.at(0));
388 case Teuchos::YAML::PROD_SCALAR_RAW:
389 case Teuchos::YAML::PROD_MAP_SCALAR_RAW: {
394 if (prod == Teuchos::YAML::PROD_MAP_SCALAR_RAW) {
402 case Teuchos::YAML::PROD_SCALAR_HEAD_OTHER:
403 case Teuchos::YAML::PROD_SCALAR_HEAD_DOT:
404 case Teuchos::YAML::PROD_SCALAR_HEAD_DASH:
405 case Teuchos::YAML::PROD_SCALAR_HEAD_DOT_DOT: {
407 if (prod == Teuchos::YAML::PROD_SCALAR_HEAD_OTHER) offset = 0;
408 else if (prod == Teuchos::YAML::PROD_SCALAR_HEAD_DOT_DOT) offset = 2;
412 if (prod == Teuchos::YAML::PROD_SCALAR_HEAD_DOT) result +=
'.';
413 else if (prod == Teuchos::YAML::PROD_SCALAR_HEAD_DASH) result +=
'-';
414 else if (prod == Teuchos::YAML::PROD_SCALAR_HEAD_DOT_DOT) result +=
"..";
418 case Teuchos::YAML::PROD_SCALAR_DQUOTED:
419 case Teuchos::YAML::PROD_SCALAR_SQUOTED: {
423 scalar.
text += first;
425 if (prod == Teuchos::YAML::PROD_SCALAR_DQUOTED) {
427 }
else if (prod == Teuchos::YAML::PROD_SCALAR_SQUOTED) {
433 case Teuchos::YAML::PROD_MAP_SCALAR_ESCAPED_EMPTY: {
434 result_any = std::string();
437 case Teuchos::YAML::PROD_MAP_SCALAR_ESCAPED_NEXT: {
438 swap(result_any, rhs.at(0));
444 case Teuchos::YAML::PROD_TAG: {
445 swap(result_any, rhs.at(2));
448 case Teuchos::YAML::PROD_BSCALAR: {
449 std::size_t parent_indent_level =
450 this->symbol_indentation_stack.at(
451 this->symbol_indentation_stack.size() - 5);
453 std::string& leading_empties_or_comments =
460 header, leading_empties_or_comments, rest,
464 case Teuchos::YAML::PROD_BSCALAR_FIRST: {
465 swap(result_any, rhs.at(0));
469 case Teuchos::YAML::PROD_BSCALAR_NEXT:
470 case Teuchos::YAML::PROD_BSCALAR_LINE:
471 case Teuchos::YAML::PROD_DESCAPE_NEXT:
472 case Teuchos::YAML::PROD_SESCAPE_NEXT: {
473 swap(result_any, rhs.at(0));
478 case Teuchos::YAML::PROD_BSCALAR_INDENT: {
479 swap(result_any, rhs.at(1));
482 case Teuchos::YAML::PROD_BSCALAR_HEADER_LITERAL:
483 case Teuchos::YAML::PROD_BSCALAR_HEADER_FOLDED: {
485 if (prod == Teuchos::YAML::PROD_BSCALAR_HEADER_LITERAL) {
494 case Teuchos::YAML::PROD_DESCAPE: {
501 case Teuchos::YAML::PROD_SESCAPE: {
508 case Teuchos::YAML::PROD_OTHER_FIRST:
509 case Teuchos::YAML::PROD_SPACE_PLUS_FIRST: {
514 case Teuchos::YAML::PROD_SCALAR_TAIL_SPACE:
515 case Teuchos::YAML::PROD_SCALAR_TAIL_OTHER:
516 case Teuchos::YAML::PROD_DESCAPED_DQUOTED:
517 case Teuchos::YAML::PROD_DQUOTED_COMMON:
518 case Teuchos::YAML::PROD_SQUOTED_COMMON:
519 case Teuchos::YAML::PROD_ANY_COMMON:
520 case Teuchos::YAML::PROD_COMMON_SPACE:
521 case Teuchos::YAML::PROD_COMMON_OTHER:
522 case Teuchos::YAML::PROD_BSCALAR_HEAD_OTHER: {
523 swap(result_any, rhs.at(0));
527 case Teuchos::YAML::PROD_DQUOTED_NEXT:
528 case Teuchos::YAML::PROD_SQUOTED_NEXT:
529 case Teuchos::YAML::PROD_ANY_NEXT:
530 case Teuchos::YAML::PROD_SCALAR_TAIL_NEXT:
531 case Teuchos::YAML::PROD_SPACE_STAR_NEXT:
532 case Teuchos::YAML::PROD_SPACE_PLUS_NEXT:
533 case Teuchos::YAML::PROD_BSCALAR_HEAD_NEXT: {
535 "leading characters in " << prod <<
": any was empty\n");
536 swap(result_any, rhs.at(0));
541 case Teuchos::YAML::PROD_DQUOTED_EMPTY:
542 case Teuchos::YAML::PROD_SQUOTED_EMPTY:
543 case Teuchos::YAML::PROD_ANY_EMPTY:
544 case Teuchos::YAML::PROD_DESCAPE_EMPTY:
545 case Teuchos::YAML::PROD_SESCAPE_EMPTY:
546 case Teuchos::YAML::PROD_SCALAR_TAIL_EMPTY:
547 case Teuchos::YAML::PROD_SPACE_STAR_EMPTY:
548 case Teuchos::YAML::PROD_BSCALAR_HEAD_EMPTY: {
549 result_any = std::string();
552 case Teuchos::YAML::PROD_DESCAPED_DQUOT:
553 case Teuchos::YAML::PROD_SQUOTED_DQUOT:
554 case Teuchos::YAML::PROD_ANY_DQUOT: {
558 case Teuchos::YAML::PROD_DESCAPED_SLASH:
559 case Teuchos::YAML::PROD_SQUOTED_SLASH:
560 case Teuchos::YAML::PROD_ANY_SLASH: {
564 case Teuchos::YAML::PROD_SCALAR_TAIL_SQUOT:
565 case Teuchos::YAML::PROD_DQUOTED_SQUOT:
566 case Teuchos::YAML::PROD_ANY_SQUOT: {
570 case Teuchos::YAML::PROD_COMMON_COLON: {
574 case Teuchos::YAML::PROD_SCALAR_TAIL_DOT:
575 case Teuchos::YAML::PROD_COMMON_DOT: {
579 case Teuchos::YAML::PROD_SCALAR_TAIL_DASH:
580 case Teuchos::YAML::PROD_COMMON_DASH:
581 case Teuchos::YAML::PROD_BSCALAR_HEAD_DASH: {
585 case Teuchos::YAML::PROD_COMMON_PIPE: {
589 case Teuchos::YAML::PROD_COMMON_LSQUARE: {
593 case Teuchos::YAML::PROD_COMMON_RSQUARE: {
597 case Teuchos::YAML::PROD_COMMON_LCURLY: {
601 case Teuchos::YAML::PROD_COMMON_RCURLY: {
605 case Teuchos::YAML::PROD_COMMON_RANGLE: {
609 case Teuchos::YAML::PROD_COMMON_COMMA: {
613 case Teuchos::YAML::PROD_COMMON_PERCENT: {
617 case Teuchos::YAML::PROD_COMMON_EXCL: {
863 std::size_t parent_indent_level,
864 std::string
const& header,
865 std::string
const& leading_empties_or_comments,
866 std::string
const& rest,
867 std::string& content,
868 std::string& comment) {
871 char chomping_indicator;
872 std::size_t indentation_indicator = 0;
874 std::stringstream ss(header.substr(1,std::string::npos));
875 if (header.size() > 1 &&
my_isdigit(header[1])) {
876 ss >> indentation_indicator;
878 indentation_indicator += parent_indent_level;
880 if (!(ss >> chomping_indicator)) chomping_indicator =
'\0';
883 std::size_t first_newline = leading_empties_or_comments.find_first_of(
"\r\n");
885 if (first_newline > 0 && leading_empties_or_comments[first_newline - 1] ==
'\r') {
890 std::size_t keep_beg = first_newline + 1 - newline.size();
891 if (leading_empties_or_comments[0] ==
'#') {
892 comment = leading_empties_or_comments.substr(1, keep_beg);
895 std::size_t content_beg = leading_empties_or_comments.find_first_not_of(
"\r\n ");
896 if (content_beg == std::string::npos) content_beg = leading_empties_or_comments.size();
897 std::size_t newline_before_content = leading_empties_or_comments.rfind(
"\n", content_beg);
898 std::size_t num_indent_spaces = (content_beg - newline_before_content) - 1;
901 if (indentation_indicator > 0) {
904 "Indentation indicator " << indentation_indicator <<
" > leading spaces " << num_indent_spaces);
905 num_indent_spaces = indentation_indicator;
908 content = leading_empties_or_comments.substr(keep_beg, std::string::npos);
917 auto last_newline = content.find_last_of(
"\n", content.size() - 2);
918 if (last_newline == std::string::npos)
break;
919 std::size_t num_spaces = 0;
920 for (
auto ispace = last_newline + 1;
921 ispace < content.size() && content[ispace] ==
' ';
925 if (num_spaces >= num_indent_spaces)
break;
926 content.erase(content.begin() + last_newline + 1, content.end());
929 std::size_t unindent_pos = 0;
931 std::size_t next_newline = content.find_first_of(
"\n", unindent_pos);
932 if (next_newline == std::string::npos)
break;
933 std::size_t start_cut = next_newline + 1;
935 if (style ==
'>') start_cut -= newline.size();
936 std::size_t end_cut = next_newline + 1;
939 while (end_cut < content.size() && content[end_cut] ==
' ') {
943 end_cut = std::min(next_newline + 1 + num_indent_spaces, end_cut);
945 content = content.substr(0, start_cut) +
946 content.substr(end_cut, std::string::npos);
947 unindent_pos = start_cut;
949 if (chomping_indicator !=
'+') {
951 if (chomping_indicator !=
'-') content += newline;
955 content = content.substr(newline.size(), std::string::npos);