OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library yaml.parser; | 5 library yaml.parser; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
| 9 import 'package:source_maps/source_maps.dart'; |
9 import 'package:string_scanner/string_scanner.dart'; | 10 import 'package:string_scanner/string_scanner.dart'; |
10 | 11 |
| 12 import 'equality.dart'; |
11 import 'model.dart'; | 13 import 'model.dart'; |
| 14 import 'utils.dart'; |
12 import 'yaml_exception.dart'; | 15 import 'yaml_exception.dart'; |
13 import 'yaml_map.dart'; | |
14 | 16 |
15 /// Translates a string of characters into a YAML serialization tree. | 17 /// Translates a string of characters into a YAML serialization tree. |
16 /// | 18 /// |
17 /// This parser is designed to closely follow the spec. All productions in the | 19 /// This parser is designed to closely follow the spec. All productions in the |
18 /// spec are numbered, and the corresponding methods in the parser have the same | 20 /// spec are numbered, and the corresponding methods in the parser have the same |
19 /// numbers. This is certainly not the most efficient way of parsing YAML, but | 21 /// numbers. This is certainly not the most efficient way of parsing YAML, but |
20 /// it is the easiest to write and read in the context of the spec. | 22 /// it is the easiest to write and read in the context of the spec. |
21 /// | 23 /// |
22 /// Methods corresponding to productions are also named as in the spec, | 24 /// Methods corresponding to productions are also named as in the spec, |
23 /// translating the name of the method (although not the annotation characters) | 25 /// translating the name of the method (although not the annotation characters) |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 return res; | 312 return res; |
311 } | 313 } |
312 | 314 |
313 void flushCapture() { | 315 void flushCapture() { |
314 _capturedString.write(_scanner.string.substring( | 316 _capturedString.write(_scanner.string.substring( |
315 _captureStart, _scanner.position)); | 317 _captureStart, _scanner.position)); |
316 _captureStart = _scanner.position; | 318 _captureStart = _scanner.position; |
317 } | 319 } |
318 | 320 |
319 /// Adds a tag and an anchor to [node], if they're defined. | 321 /// Adds a tag and an anchor to [node], if they're defined. |
320 Node addProps(Node node, _Pair<Tag, String> props) { | 322 Node addProps(Node node, Pair<Tag, String> props) { |
321 if (props == null || node == null) return node; | 323 if (props == null || node == null) return node; |
322 if (truth(props.first)) node.tag = props.first; | 324 if (truth(props.first)) node.tag = props.first; |
323 if (truth(props.last)) node.anchor = props.last; | 325 if (truth(props.last)) node.anchor = props.last; |
324 return node; | 326 return node; |
325 } | 327 } |
326 | 328 |
327 /// Creates a MappingNode from [pairs]. | 329 /// Creates a MappingNode from [pairs]. |
328 MappingNode map(List<_Pair<Node, Node>> pairs) { | 330 MappingNode map(List<Pair<Node, Node>> pairs, Span span) { |
329 var content = new Map<Node, Node>(); | 331 var content = new Map<Node, Node>(); |
330 pairs.forEach((pair) => content[pair.first] = pair.last); | 332 pairs.forEach((pair) => content[pair.first] = pair.last); |
331 return new MappingNode("?", content); | 333 return new MappingNode("?", content, span); |
332 } | 334 } |
333 | 335 |
334 /// Runs [fn] in a context named [name]. Used for error reporting. | 336 /// Runs [fn] in a context named [name]. Used for error reporting. |
335 context(String name, fn()) { | 337 context(String name, fn()) { |
336 try { | 338 try { |
337 _contextStack.add(name); | 339 _contextStack.add(name); |
338 return fn(); | 340 return fn(); |
339 } finally { | 341 } finally { |
340 var popped = _contextStack.removeLast(); | 342 var popped = _contextStack.removeLast(); |
341 assert(popped == name); | 343 assert(popped == name); |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 // 81 | 754 // 81 |
753 bool s_separateLines(int indent) { | 755 bool s_separateLines(int indent) { |
754 return transaction(() => s_l_comments() && s_flowLinePrefix(indent)) || | 756 return transaction(() => s_l_comments() && s_flowLinePrefix(indent)) || |
755 s_separateInLine(); | 757 s_separateInLine(); |
756 } | 758 } |
757 | 759 |
758 // 82 | 760 // 82 |
759 bool l_directive() => false; // TODO(nweiz): implement | 761 bool l_directive() => false; // TODO(nweiz): implement |
760 | 762 |
761 // 96 | 763 // 96 |
762 _Pair<Tag, String> c_ns_properties(int indent, int ctx) { | 764 Pair<Tag, String> c_ns_properties(int indent, int ctx) { |
763 var tag, anchor; | 765 var tag, anchor; |
764 tag = c_ns_tagProperty(); | 766 tag = c_ns_tagProperty(); |
765 if (truth(tag)) { | 767 if (truth(tag)) { |
766 anchor = transaction(() { | 768 anchor = transaction(() { |
767 if (!truth(s_separate(indent, ctx))) return null; | 769 if (!truth(s_separate(indent, ctx))) return null; |
768 return c_ns_anchorProperty(); | 770 return c_ns_anchorProperty(); |
769 }); | 771 }); |
770 return new _Pair<Tag, String>(tag, anchor); | 772 return new Pair<Tag, String>(tag, anchor); |
771 } | 773 } |
772 | 774 |
773 anchor = c_ns_anchorProperty(); | 775 anchor = c_ns_anchorProperty(); |
774 if (truth(anchor)) { | 776 if (truth(anchor)) { |
775 tag = transaction(() { | 777 tag = transaction(() { |
776 if (!truth(s_separate(indent, ctx))) return null; | 778 if (!truth(s_separate(indent, ctx))) return null; |
777 return c_ns_tagProperty(); | 779 return c_ns_tagProperty(); |
778 }); | 780 }); |
779 return new _Pair<Tag, String>(tag, anchor); | 781 return new Pair<Tag, String>(tag, anchor); |
780 } | 782 } |
781 | 783 |
782 return null; | 784 return null; |
783 } | 785 } |
784 | 786 |
785 // 97 | 787 // 97 |
786 Tag c_ns_tagProperty() => null; // TODO(nweiz): implement | 788 Tag c_ns_tagProperty() => null; // TODO(nweiz): implement |
787 | 789 |
788 // 101 | 790 // 101 |
789 String c_ns_anchorProperty() => null; // TODO(nweiz): implement | 791 String c_ns_anchorProperty() => null; // TODO(nweiz): implement |
790 | 792 |
791 // 102 | 793 // 102 |
792 bool isAnchorChar(int char) => isNonSpace(char) && !isFlowIndicator(char); | 794 bool isAnchorChar(int char) => isNonSpace(char) && !isFlowIndicator(char); |
793 | 795 |
794 // 103 | 796 // 103 |
795 String ns_anchorName() => | 797 String ns_anchorName() => |
796 captureString(() => oneOrMore(() => consume(isAnchorChar))); | 798 captureString(() => oneOrMore(() => consume(isAnchorChar))); |
797 | 799 |
798 // 104 | 800 // 104 |
799 Node c_ns_aliasNode() { | 801 Node c_ns_aliasNode() { |
| 802 var start = _scanner.state; |
800 if (!truth(c_indicator(C_ALIAS))) return null; | 803 if (!truth(c_indicator(C_ALIAS))) return null; |
801 var name = expect(ns_anchorName(), 'anchor name'); | 804 var name = expect(ns_anchorName(), 'anchor name'); |
802 return new AliasNode(name); | 805 return new AliasNode(name, _scanner.spanFrom(start)); |
803 } | 806 } |
804 | 807 |
805 // 105 | 808 // 105 |
806 ScalarNode e_scalar() => new ScalarNode("?", content: ""); | 809 ScalarNode e_scalar() => new ScalarNode("?", _scanner.emptySpan, content: ""); |
807 | 810 |
808 // 106 | 811 // 106 |
809 ScalarNode e_node() => e_scalar(); | 812 ScalarNode e_node() => e_scalar(); |
810 | 813 |
811 // 107 | 814 // 107 |
812 bool nb_doubleChar() => or([ | 815 bool nb_doubleChar() => or([ |
813 c_ns_escChar, | 816 c_ns_escChar, |
814 () => consume((c) => isJson(c) && c != BACKSLASH && c != DOUBLE_QUOTE) | 817 () => consume((c) => isJson(c) && c != BACKSLASH && c != DOUBLE_QUOTE) |
815 ]); | 818 ]); |
816 | 819 |
817 // 108 | 820 // 108 |
818 bool ns_doubleChar() => !isSpace(peek()) && truth(nb_doubleChar()); | 821 bool ns_doubleChar() => !isSpace(peek()) && truth(nb_doubleChar()); |
819 | 822 |
820 // 109 | 823 // 109 |
821 Node c_doubleQuoted(int indent, int ctx) => context('string', () { | 824 Node c_doubleQuoted(int indent, int ctx) => context('string', () { |
822 return transaction(() { | 825 return transaction(() { |
| 826 var start = _scanner.state; |
823 if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; | 827 if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; |
824 var contents = nb_doubleText(indent, ctx); | 828 var contents = nb_doubleText(indent, ctx); |
825 if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; | 829 if (!truth(c_indicator(C_DOUBLE_QUOTE))) return null; |
826 return new ScalarNode("!", content: contents); | 830 return new ScalarNode("!", _scanner.spanFrom(start), content: contents); |
827 }); | 831 }); |
828 }); | 832 }); |
829 | 833 |
830 // 110 | 834 // 110 |
831 String nb_doubleText(int indent, int ctx) => captureString(() { | 835 String nb_doubleText(int indent, int ctx) => captureString(() { |
832 switch (ctx) { | 836 switch (ctx) { |
833 case FLOW_OUT: | 837 case FLOW_OUT: |
834 case FLOW_IN: | 838 case FLOW_IN: |
835 nb_doubleMultiLine(indent); | 839 nb_doubleMultiLine(indent); |
836 break; | 840 break; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 c_quotedQuote, | 905 c_quotedQuote, |
902 () => consume((c) => isJson(c) && c != SINGLE_QUOTE) | 906 () => consume((c) => isJson(c) && c != SINGLE_QUOTE) |
903 ]); | 907 ]); |
904 | 908 |
905 // 119 | 909 // 119 |
906 bool ns_singleChar() => !isSpace(peek()) && truth(nb_singleChar()); | 910 bool ns_singleChar() => !isSpace(peek()) && truth(nb_singleChar()); |
907 | 911 |
908 // 120 | 912 // 120 |
909 Node c_singleQuoted(int indent, int ctx) => context('string', () { | 913 Node c_singleQuoted(int indent, int ctx) => context('string', () { |
910 return transaction(() { | 914 return transaction(() { |
| 915 var start = _scanner.state; |
911 if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; | 916 if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; |
912 var contents = nb_singleText(indent, ctx); | 917 var contents = nb_singleText(indent, ctx); |
913 if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; | 918 if (!truth(c_indicator(C_SINGLE_QUOTE))) return null; |
914 return new ScalarNode("!", content: contents); | 919 return new ScalarNode("!", _scanner.spanFrom(start), content: contents); |
915 }); | 920 }); |
916 }); | 921 }); |
917 | 922 |
918 // 121 | 923 // 121 |
919 String nb_singleText(int indent, int ctx) => captureString(() { | 924 String nb_singleText(int indent, int ctx) => captureString(() { |
920 switch (ctx) { | 925 switch (ctx) { |
921 case FLOW_OUT: | 926 case FLOW_OUT: |
922 case FLOW_IN: | 927 case FLOW_IN: |
923 nb_singleMultiLine(indent); | 928 nb_singleMultiLine(indent); |
924 break; | 929 break; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1068 return FLOW_IN; | 1073 return FLOW_IN; |
1069 case BLOCK_KEY: | 1074 case BLOCK_KEY: |
1070 case FLOW_KEY: | 1075 case FLOW_KEY: |
1071 return FLOW_KEY; | 1076 return FLOW_KEY; |
1072 } | 1077 } |
1073 throw "unreachable"; | 1078 throw "unreachable"; |
1074 } | 1079 } |
1075 | 1080 |
1076 // 137 | 1081 // 137 |
1077 SequenceNode c_flowSequence(int indent, int ctx) => transaction(() { | 1082 SequenceNode c_flowSequence(int indent, int ctx) => transaction(() { |
| 1083 var start = _scanner.state; |
1078 if (!truth(c_indicator(C_SEQUENCE_START))) return null; | 1084 if (!truth(c_indicator(C_SEQUENCE_START))) return null; |
1079 zeroOrOne(() => s_separate(indent, ctx)); | 1085 zeroOrOne(() => s_separate(indent, ctx)); |
1080 var content = zeroOrOne(() => ns_s_flowSeqEntries(indent, inFlow(ctx))); | 1086 var content = zeroOrOne(() => ns_s_flowSeqEntries(indent, inFlow(ctx))); |
1081 if (!truth(c_indicator(C_SEQUENCE_END))) return null; | 1087 if (!truth(c_indicator(C_SEQUENCE_END))) return null; |
1082 return new SequenceNode("?", new List<Node>.from(content)); | 1088 return new SequenceNode("?", new List<Node>.from(content), |
| 1089 _scanner.spanFrom(start)); |
1083 }); | 1090 }); |
1084 | 1091 |
1085 // 138 | 1092 // 138 |
1086 Iterable<Node> ns_s_flowSeqEntries(int indent, int ctx) { | 1093 Iterable<Node> ns_s_flowSeqEntries(int indent, int ctx) { |
1087 var first = ns_flowSeqEntry(indent, ctx); | 1094 var first = ns_flowSeqEntry(indent, ctx); |
1088 if (!truth(first)) return new Queue<Node>(); | 1095 if (!truth(first)) return new Queue<Node>(); |
1089 zeroOrOne(() => s_separate(indent, ctx)); | 1096 zeroOrOne(() => s_separate(indent, ctx)); |
1090 | 1097 |
1091 var rest; | 1098 var rest; |
1092 if (truth(c_indicator(C_COLLECT_ENTRY))) { | 1099 if (truth(c_indicator(C_COLLECT_ENTRY))) { |
1093 zeroOrOne(() => s_separate(indent, ctx)); | 1100 zeroOrOne(() => s_separate(indent, ctx)); |
1094 rest = zeroOrOne(() => ns_s_flowSeqEntries(indent, ctx)); | 1101 rest = zeroOrOne(() => ns_s_flowSeqEntries(indent, ctx)); |
1095 } | 1102 } |
1096 | 1103 |
1097 if (rest == null) rest = new Queue<Node>(); | 1104 if (rest == null) rest = new Queue<Node>(); |
1098 rest.addFirst(first); | 1105 rest.addFirst(first); |
1099 | 1106 |
1100 return rest; | 1107 return rest; |
1101 } | 1108 } |
1102 | 1109 |
1103 // 139 | 1110 // 139 |
1104 Node ns_flowSeqEntry(int indent, int ctx) => or([ | 1111 Node ns_flowSeqEntry(int indent, int ctx) => or([ |
1105 () => ns_flowPair(indent, ctx), | 1112 () => ns_flowPair(indent, ctx), |
1106 () => ns_flowNode(indent, ctx) | 1113 () => ns_flowNode(indent, ctx) |
1107 ]); | 1114 ]); |
1108 | 1115 |
1109 // 140 | 1116 // 140 |
1110 Node c_flowMapping(int indent, int ctx) { | 1117 Node c_flowMapping(int indent, int ctx) { |
| 1118 var start = _scanner.state; |
1111 if (!truth(c_indicator(C_MAPPING_START))) return null; | 1119 if (!truth(c_indicator(C_MAPPING_START))) return null; |
1112 zeroOrOne(() => s_separate(indent, ctx)); | 1120 zeroOrOne(() => s_separate(indent, ctx)); |
1113 var content = zeroOrOne(() => ns_s_flowMapEntries(indent, inFlow(ctx))); | 1121 var content = zeroOrOne(() => ns_s_flowMapEntries(indent, inFlow(ctx))); |
1114 if (!truth(c_indicator(C_MAPPING_END))) return null; | 1122 if (!truth(c_indicator(C_MAPPING_END))) return null; |
1115 return new MappingNode("?", content); | 1123 return new MappingNode("?", content, _scanner.spanFrom(start)); |
1116 } | 1124 } |
1117 | 1125 |
1118 // 141 | 1126 // 141 |
1119 YamlMap ns_s_flowMapEntries(int indent, int ctx) { | 1127 Map ns_s_flowMapEntries(int indent, int ctx) { |
1120 var first = ns_flowMapEntry(indent, ctx); | 1128 var first = ns_flowMapEntry(indent, ctx); |
1121 if (!truth(first)) return new YamlMap(); | 1129 if (!truth(first)) return deepEqualsMap(); |
1122 zeroOrOne(() => s_separate(indent, ctx)); | 1130 zeroOrOne(() => s_separate(indent, ctx)); |
1123 | 1131 |
1124 var rest; | 1132 var rest; |
1125 if (truth(c_indicator(C_COLLECT_ENTRY))) { | 1133 if (truth(c_indicator(C_COLLECT_ENTRY))) { |
1126 zeroOrOne(() => s_separate(indent, ctx)); | 1134 zeroOrOne(() => s_separate(indent, ctx)); |
1127 rest = ns_s_flowMapEntries(indent, ctx); | 1135 rest = ns_s_flowMapEntries(indent, ctx); |
1128 } | 1136 } |
1129 | 1137 |
1130 if (rest == null) rest = new YamlMap(); | 1138 if (rest == null) rest = deepEqualsMap(); |
1131 | 1139 |
1132 // TODO(nweiz): Duplicate keys should be an error. This includes keys with | 1140 // TODO(nweiz): Duplicate keys should be an error. This includes keys with |
1133 // different representations but the same value (e.g. 10 vs 0xa). To make | 1141 // different representations but the same value (e.g. 10 vs 0xa). To make |
1134 // this user-friendly we'll probably also want to associate nodes with a | 1142 // this user-friendly we'll probably also want to associate nodes with a |
1135 // source range. | 1143 // source range. |
1136 if (!rest.containsKey(first.first)) rest[first.first] = first.last; | 1144 if (!rest.containsKey(first.first)) rest[first.first] = first.last; |
1137 | 1145 |
1138 return rest; | 1146 return rest; |
1139 } | 1147 } |
1140 | 1148 |
1141 // 142 | 1149 // 142 |
1142 _Pair<Node, Node> ns_flowMapEntry(int indent, int ctx) => or([ | 1150 Pair<Node, Node> ns_flowMapEntry(int indent, int ctx) => or([ |
1143 () => transaction(() { | 1151 () => transaction(() { |
1144 if (!truth(c_indicator(C_MAPPING_KEY))) return false; | 1152 if (!truth(c_indicator(C_MAPPING_KEY))) return false; |
1145 if (!truth(s_separate(indent, ctx))) return false; | 1153 if (!truth(s_separate(indent, ctx))) return false; |
1146 return ns_flowMapExplicitEntry(indent, ctx); | 1154 return ns_flowMapExplicitEntry(indent, ctx); |
1147 }), | 1155 }), |
1148 () => ns_flowMapImplicitEntry(indent, ctx) | 1156 () => ns_flowMapImplicitEntry(indent, ctx) |
1149 ]); | 1157 ]); |
1150 | 1158 |
1151 // 143 | 1159 // 143 |
1152 _Pair<Node, Node> ns_flowMapExplicitEntry(int indent, int ctx) => or([ | 1160 Pair<Node, Node> ns_flowMapExplicitEntry(int indent, int ctx) => or([ |
1153 () => ns_flowMapImplicitEntry(indent, ctx), | 1161 () => ns_flowMapImplicitEntry(indent, ctx), |
1154 () => new _Pair<Node, Node>(e_node(), e_node()) | 1162 () => new Pair<Node, Node>(e_node(), e_node()) |
1155 ]); | 1163 ]); |
1156 | 1164 |
1157 // 144 | 1165 // 144 |
1158 _Pair<Node, Node> ns_flowMapImplicitEntry(int indent, int ctx) => or([ | 1166 Pair<Node, Node> ns_flowMapImplicitEntry(int indent, int ctx) => or([ |
1159 () => ns_flowMapYamlKeyEntry(indent, ctx), | 1167 () => ns_flowMapYamlKeyEntry(indent, ctx), |
1160 () => c_ns_flowMapEmptyKeyEntry(indent, ctx), | 1168 () => c_ns_flowMapEmptyKeyEntry(indent, ctx), |
1161 () => c_ns_flowMapJsonKeyEntry(indent, ctx) | 1169 () => c_ns_flowMapJsonKeyEntry(indent, ctx) |
1162 ]); | 1170 ]); |
1163 | 1171 |
1164 // 145 | 1172 // 145 |
1165 _Pair<Node, Node> ns_flowMapYamlKeyEntry(int indent, int ctx) { | 1173 Pair<Node, Node> ns_flowMapYamlKeyEntry(int indent, int ctx) { |
1166 var key = ns_flowYamlNode(indent, ctx); | 1174 var key = ns_flowYamlNode(indent, ctx); |
1167 if (!truth(key)) return null; | 1175 if (!truth(key)) return null; |
1168 var value = or([ | 1176 var value = or([ |
1169 () => transaction(() { | 1177 () => transaction(() { |
1170 zeroOrOne(() => s_separate(indent, ctx)); | 1178 zeroOrOne(() => s_separate(indent, ctx)); |
1171 return c_ns_flowMapSeparateValue(indent, ctx); | 1179 return c_ns_flowMapSeparateValue(indent, ctx); |
1172 }), | 1180 }), |
1173 e_node | 1181 e_node |
1174 ]); | 1182 ]); |
1175 return new _Pair<Node, Node>(key, value); | 1183 return new Pair<Node, Node>(key, value); |
1176 } | 1184 } |
1177 | 1185 |
1178 // 146 | 1186 // 146 |
1179 _Pair<Node, Node> c_ns_flowMapEmptyKeyEntry(int indent, int ctx) { | 1187 Pair<Node, Node> c_ns_flowMapEmptyKeyEntry(int indent, int ctx) { |
1180 var value = c_ns_flowMapSeparateValue(indent, ctx); | 1188 var value = c_ns_flowMapSeparateValue(indent, ctx); |
1181 if (!truth(value)) return null; | 1189 if (!truth(value)) return null; |
1182 return new _Pair<Node, Node>(e_node(), value); | 1190 return new Pair<Node, Node>(e_node(), value); |
1183 } | 1191 } |
1184 | 1192 |
1185 // 147 | 1193 // 147 |
1186 Node c_ns_flowMapSeparateValue(int indent, int ctx) => transaction(() { | 1194 Node c_ns_flowMapSeparateValue(int indent, int ctx) => transaction(() { |
1187 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; | 1195 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; |
1188 if (isPlainSafe(ctx, peek())) return null; | 1196 if (isPlainSafe(ctx, peek())) return null; |
1189 | 1197 |
1190 return or([ | 1198 return or([ |
1191 () => transaction(() { | 1199 () => transaction(() { |
1192 if (!s_separate(indent, ctx)) return null; | 1200 if (!s_separate(indent, ctx)) return null; |
1193 return ns_flowNode(indent, ctx); | 1201 return ns_flowNode(indent, ctx); |
1194 }), | 1202 }), |
1195 e_node | 1203 e_node |
1196 ]); | 1204 ]); |
1197 }); | 1205 }); |
1198 | 1206 |
1199 // 148 | 1207 // 148 |
1200 _Pair<Node, Node> c_ns_flowMapJsonKeyEntry(int indent, int ctx) { | 1208 Pair<Node, Node> c_ns_flowMapJsonKeyEntry(int indent, int ctx) { |
1201 var key = c_flowJsonNode(indent, ctx); | 1209 var key = c_flowJsonNode(indent, ctx); |
1202 if (!truth(key)) return null; | 1210 if (!truth(key)) return null; |
1203 var value = or([ | 1211 var value = or([ |
1204 () => transaction(() { | 1212 () => transaction(() { |
1205 zeroOrOne(() => s_separate(indent, ctx)); | 1213 zeroOrOne(() => s_separate(indent, ctx)); |
1206 return c_ns_flowMapAdjacentValue(indent, ctx); | 1214 return c_ns_flowMapAdjacentValue(indent, ctx); |
1207 }), | 1215 }), |
1208 e_node | 1216 e_node |
1209 ]); | 1217 ]); |
1210 return new _Pair<Node, Node>(key, value); | 1218 return new Pair<Node, Node>(key, value); |
1211 } | 1219 } |
1212 | 1220 |
1213 // 149 | 1221 // 149 |
1214 Node c_ns_flowMapAdjacentValue(int indent, int ctx) { | 1222 Node c_ns_flowMapAdjacentValue(int indent, int ctx) { |
1215 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; | 1223 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; |
1216 return or([ | 1224 return or([ |
1217 () => transaction(() { | 1225 () => transaction(() { |
1218 zeroOrOne(() => s_separate(indent, ctx)); | 1226 zeroOrOne(() => s_separate(indent, ctx)); |
1219 return ns_flowNode(indent, ctx); | 1227 return ns_flowNode(indent, ctx); |
1220 }), | 1228 }), |
1221 e_node | 1229 e_node |
1222 ]); | 1230 ]); |
1223 } | 1231 } |
1224 | 1232 |
1225 // 150 | 1233 // 150 |
1226 Node ns_flowPair(int indent, int ctx) { | 1234 Node ns_flowPair(int indent, int ctx) { |
| 1235 var start = _scanner.state; |
1227 var pair = or([ | 1236 var pair = or([ |
1228 () => transaction(() { | 1237 () => transaction(() { |
1229 if (!truth(c_indicator(C_MAPPING_KEY))) return null; | 1238 if (!truth(c_indicator(C_MAPPING_KEY))) return null; |
1230 if (!truth(s_separate(indent, ctx))) return null; | 1239 if (!truth(s_separate(indent, ctx))) return null; |
1231 return ns_flowMapExplicitEntry(indent, ctx); | 1240 return ns_flowMapExplicitEntry(indent, ctx); |
1232 }), | 1241 }), |
1233 () => ns_flowPairEntry(indent, ctx) | 1242 () => ns_flowPairEntry(indent, ctx) |
1234 ]); | 1243 ]); |
1235 if (!truth(pair)) return null; | 1244 if (!truth(pair)) return null; |
1236 | 1245 |
1237 return map([pair]); | 1246 return map([pair], _scanner.spanFrom(start)); |
1238 } | 1247 } |
1239 | 1248 |
1240 // 151 | 1249 // 151 |
1241 _Pair<Node, Node> ns_flowPairEntry(int indent, int ctx) => or([ | 1250 Pair<Node, Node> ns_flowPairEntry(int indent, int ctx) => or([ |
1242 () => ns_flowPairYamlKeyEntry(indent, ctx), | 1251 () => ns_flowPairYamlKeyEntry(indent, ctx), |
1243 () => c_ns_flowMapEmptyKeyEntry(indent, ctx), | 1252 () => c_ns_flowMapEmptyKeyEntry(indent, ctx), |
1244 () => c_ns_flowPairJsonKeyEntry(indent, ctx) | 1253 () => c_ns_flowPairJsonKeyEntry(indent, ctx) |
1245 ]); | 1254 ]); |
1246 | 1255 |
1247 // 152 | 1256 // 152 |
1248 _Pair<Node, Node> ns_flowPairYamlKeyEntry(int indent, int ctx) => | 1257 Pair<Node, Node> ns_flowPairYamlKeyEntry(int indent, int ctx) => |
1249 transaction(() { | 1258 transaction(() { |
1250 var key = ns_s_implicitYamlKey(FLOW_KEY); | 1259 var key = ns_s_implicitYamlKey(FLOW_KEY); |
1251 if (!truth(key)) return null; | 1260 if (!truth(key)) return null; |
1252 var value = c_ns_flowMapSeparateValue(indent, ctx); | 1261 var value = c_ns_flowMapSeparateValue(indent, ctx); |
1253 if (!truth(value)) return null; | 1262 if (!truth(value)) return null; |
1254 return new _Pair<Node, Node>(key, value); | 1263 return new Pair<Node, Node>(key, value); |
1255 }); | 1264 }); |
1256 | 1265 |
1257 // 153 | 1266 // 153 |
1258 _Pair<Node, Node> c_ns_flowPairJsonKeyEntry(int indent, int ctx) => | 1267 Pair<Node, Node> c_ns_flowPairJsonKeyEntry(int indent, int ctx) => |
1259 transaction(() { | 1268 transaction(() { |
1260 var key = c_s_implicitJsonKey(FLOW_KEY); | 1269 var key = c_s_implicitJsonKey(FLOW_KEY); |
1261 if (!truth(key)) return null; | 1270 if (!truth(key)) return null; |
1262 var value = c_ns_flowMapAdjacentValue(indent, ctx); | 1271 var value = c_ns_flowMapAdjacentValue(indent, ctx); |
1263 if (!truth(value)) return null; | 1272 if (!truth(value)) return null; |
1264 return new _Pair<Node, Node>(key, value); | 1273 return new Pair<Node, Node>(key, value); |
1265 }); | 1274 }); |
1266 | 1275 |
1267 // 154 | 1276 // 154 |
1268 Node ns_s_implicitYamlKey(int ctx) => transaction(() { | 1277 Node ns_s_implicitYamlKey(int ctx) => transaction(() { |
1269 // TODO(nweiz): this is supposed to be limited to 1024 characters. | 1278 // TODO(nweiz): this is supposed to be limited to 1024 characters. |
1270 | 1279 |
1271 // The indentation parameter is "null" since it's unused in this path | 1280 // The indentation parameter is "null" since it's unused in this path |
1272 var node = ns_flowYamlNode(null, ctx); | 1281 var node = ns_flowYamlNode(null, ctx); |
1273 if (!truth(node)) return null; | 1282 if (!truth(node)) return null; |
1274 zeroOrOne(s_separateInLine); | 1283 zeroOrOne(s_separateInLine); |
1275 return node; | 1284 return node; |
1276 }); | 1285 }); |
1277 | 1286 |
1278 // 155 | 1287 // 155 |
1279 Node c_s_implicitJsonKey(int ctx) => transaction(() { | 1288 Node c_s_implicitJsonKey(int ctx) => transaction(() { |
1280 // TODO(nweiz): this is supposed to be limited to 1024 characters. | 1289 // TODO(nweiz): this is supposed to be limited to 1024 characters. |
1281 | 1290 |
1282 // The indentation parameter is "null" since it's unused in this path | 1291 // The indentation parameter is "null" since it's unused in this path |
1283 var node = c_flowJsonNode(null, ctx); | 1292 var node = c_flowJsonNode(null, ctx); |
1284 if (!truth(node)) return null; | 1293 if (!truth(node)) return null; |
1285 zeroOrOne(s_separateInLine); | 1294 zeroOrOne(s_separateInLine); |
1286 return node; | 1295 return node; |
1287 }); | 1296 }); |
1288 | 1297 |
1289 // 156 | 1298 // 156 |
1290 Node ns_flowYamlContent(int indent, int ctx) { | 1299 Node ns_flowYamlContent(int indent, int ctx) { |
| 1300 var start = _scanner.state; |
1291 var str = ns_plain(indent, ctx); | 1301 var str = ns_plain(indent, ctx); |
1292 if (!truth(str)) return null; | 1302 if (!truth(str)) return null; |
1293 return new ScalarNode("?", content: str); | 1303 return new ScalarNode("?", _scanner.spanFrom(start), content: str); |
1294 } | 1304 } |
1295 | 1305 |
1296 // 157 | 1306 // 157 |
1297 Node c_flowJsonContent(int indent, int ctx) => or([ | 1307 Node c_flowJsonContent(int indent, int ctx) => or([ |
1298 () => c_flowSequence(indent, ctx), | 1308 () => c_flowSequence(indent, ctx), |
1299 () => c_flowMapping(indent, ctx), | 1309 () => c_flowMapping(indent, ctx), |
1300 () => c_singleQuoted(indent, ctx), | 1310 () => c_singleQuoted(indent, ctx), |
1301 () => c_doubleQuoted(indent, ctx) | 1311 () => c_doubleQuoted(indent, ctx) |
1302 ]); | 1312 ]); |
1303 | 1313 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1430 bool l_trailComments(int indent) => transaction(() { | 1440 bool l_trailComments(int indent) => transaction(() { |
1431 if (!truth(s_indentLessThanOrEqualTo(indent))) return false; | 1441 if (!truth(s_indentLessThanOrEqualTo(indent))) return false; |
1432 if (!truth(c_nb_commentText())) return false; | 1442 if (!truth(c_nb_commentText())) return false; |
1433 if (!truth(b_comment())) return false; | 1443 if (!truth(b_comment())) return false; |
1434 zeroOrMore(l_comment); | 1444 zeroOrMore(l_comment); |
1435 return true; | 1445 return true; |
1436 }); | 1446 }); |
1437 | 1447 |
1438 // 170 | 1448 // 170 |
1439 Node c_l_literal(int indent) => transaction(() { | 1449 Node c_l_literal(int indent) => transaction(() { |
| 1450 var start = _scanner.state; |
1440 if (!truth(c_indicator(C_LITERAL))) return null; | 1451 if (!truth(c_indicator(C_LITERAL))) return null; |
1441 var header = c_b_blockHeader(); | 1452 var header = c_b_blockHeader(); |
1442 if (!truth(header)) return null; | 1453 if (!truth(header)) return null; |
1443 | 1454 |
1444 var additionalIndent = blockScalarAdditionalIndentation(header, indent); | 1455 var additionalIndent = blockScalarAdditionalIndentation(header, indent); |
1445 var content = l_literalContent(indent + additionalIndent, header.chomping); | 1456 var content = l_literalContent(indent + additionalIndent, header.chomping); |
1446 if (!truth(content)) return null; | 1457 if (!truth(content)) return null; |
1447 | 1458 |
1448 return new ScalarNode("!", content: content); | 1459 return new ScalarNode("!", _scanner.spanFrom(start), content: content); |
1449 }); | 1460 }); |
1450 | 1461 |
1451 // 171 | 1462 // 171 |
1452 bool l_nb_literalText(int indent) => transaction(() { | 1463 bool l_nb_literalText(int indent) => transaction(() { |
1453 zeroOrMore(() => captureAs("\n", () => l_empty(indent, BLOCK_IN))); | 1464 zeroOrMore(() => captureAs("\n", () => l_empty(indent, BLOCK_IN))); |
1454 if (!truth(captureAs("", () => s_indent(indent)))) return false; | 1465 if (!truth(captureAs("", () => s_indent(indent)))) return false; |
1455 return truth(oneOrMore(() => consume(isNonBreak))); | 1466 return truth(oneOrMore(() => consume(isNonBreak))); |
1456 }); | 1467 }); |
1457 | 1468 |
1458 // 172 | 1469 // 172 |
1459 bool b_nb_literalNext(int indent) => transaction(() { | 1470 bool b_nb_literalNext(int indent) => transaction(() { |
1460 if (!truth(b_asLineFeed())) return false; | 1471 if (!truth(b_asLineFeed())) return false; |
1461 return l_nb_literalText(indent); | 1472 return l_nb_literalText(indent); |
1462 }); | 1473 }); |
1463 | 1474 |
1464 // 173 | 1475 // 173 |
1465 String l_literalContent(int indent, int chomping) => captureString(() { | 1476 String l_literalContent(int indent, int chomping) => captureString(() { |
1466 transaction(() { | 1477 transaction(() { |
1467 if (!truth(l_nb_literalText(indent))) return false; | 1478 if (!truth(l_nb_literalText(indent))) return false; |
1468 zeroOrMore(() => b_nb_literalNext(indent)); | 1479 zeroOrMore(() => b_nb_literalNext(indent)); |
1469 return b_chompedLast(chomping); | 1480 return b_chompedLast(chomping); |
1470 }); | 1481 }); |
1471 l_chompedEmpty(indent, chomping); | 1482 l_chompedEmpty(indent, chomping); |
1472 return true; | 1483 return true; |
1473 }); | 1484 }); |
1474 | 1485 |
1475 // 174 | 1486 // 174 |
1476 Node c_l_folded(int indent) => transaction(() { | 1487 Node c_l_folded(int indent) => transaction(() { |
| 1488 var start = _scanner.state; |
1477 if (!truth(c_indicator(C_FOLDED))) return null; | 1489 if (!truth(c_indicator(C_FOLDED))) return null; |
1478 var header = c_b_blockHeader(); | 1490 var header = c_b_blockHeader(); |
1479 if (!truth(header)) return null; | 1491 if (!truth(header)) return null; |
1480 | 1492 |
1481 var additionalIndent = blockScalarAdditionalIndentation(header, indent); | 1493 var additionalIndent = blockScalarAdditionalIndentation(header, indent); |
1482 var content = l_foldedContent(indent + additionalIndent, header.chomping); | 1494 var content = l_foldedContent(indent + additionalIndent, header.chomping); |
1483 if (!truth(content)) return null; | 1495 if (!truth(content)) return null; |
1484 | 1496 |
1485 return new ScalarNode("!", content: content); | 1497 return new ScalarNode("!", _scanner.spanFrom(start), content: content); |
1486 }); | 1498 }); |
1487 | 1499 |
1488 // 175 | 1500 // 175 |
1489 bool s_nb_foldedText(int indent) => transaction(() { | 1501 bool s_nb_foldedText(int indent) => transaction(() { |
1490 if (!truth(captureAs('', () => s_indent(indent)))) return false; | 1502 if (!truth(captureAs('', () => s_indent(indent)))) return false; |
1491 if (!truth(consume(isNonSpace))) return false; | 1503 if (!truth(consume(isNonSpace))) return false; |
1492 zeroOrMore(() => consume(isNonBreak)); | 1504 zeroOrMore(() => consume(isNonBreak)); |
1493 return true; | 1505 return true; |
1494 }); | 1506 }); |
1495 | 1507 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 }); | 1567 }); |
1556 l_chompedEmpty(indent, chomping); | 1568 l_chompedEmpty(indent, chomping); |
1557 return true; | 1569 return true; |
1558 }); | 1570 }); |
1559 | 1571 |
1560 // 183 | 1572 // 183 |
1561 SequenceNode l_blockSequence(int indent) => context('sequence', () { | 1573 SequenceNode l_blockSequence(int indent) => context('sequence', () { |
1562 var additionalIndent = countIndentation() - indent; | 1574 var additionalIndent = countIndentation() - indent; |
1563 if (additionalIndent <= 0) return null; | 1575 if (additionalIndent <= 0) return null; |
1564 | 1576 |
| 1577 var start = _scanner.state; |
1565 var content = oneOrMore(() => transaction(() { | 1578 var content = oneOrMore(() => transaction(() { |
1566 if (!truth(s_indent(indent + additionalIndent))) return null; | 1579 if (!truth(s_indent(indent + additionalIndent))) return null; |
1567 return c_l_blockSeqEntry(indent + additionalIndent); | 1580 return c_l_blockSeqEntry(indent + additionalIndent); |
1568 })); | 1581 })); |
1569 if (!truth(content)) return null; | 1582 if (!truth(content)) return null; |
1570 | 1583 |
1571 return new SequenceNode("?", content); | 1584 return new SequenceNode("?", content, _scanner.spanFrom(start)); |
1572 }); | 1585 }); |
1573 | 1586 |
1574 // 184 | 1587 // 184 |
1575 Node c_l_blockSeqEntry(int indent) => transaction(() { | 1588 Node c_l_blockSeqEntry(int indent) => transaction(() { |
1576 if (!truth(c_indicator(C_SEQUENCE_ENTRY))) return null; | 1589 if (!truth(c_indicator(C_SEQUENCE_ENTRY))) return null; |
1577 if (isNonSpace(peek())) return null; | 1590 if (isNonSpace(peek())) return null; |
1578 | 1591 |
1579 return s_l_blockIndented(indent, BLOCK_IN); | 1592 return s_l_blockIndented(indent, BLOCK_IN); |
1580 }); | 1593 }); |
1581 | 1594 |
1582 // 185 | 1595 // 185 |
1583 Node s_l_blockIndented(int indent, int ctx) { | 1596 Node s_l_blockIndented(int indent, int ctx) { |
1584 var additionalIndent = countIndentation(); | 1597 var additionalIndent = countIndentation(); |
1585 return or([ | 1598 return or([ |
1586 () => transaction(() { | 1599 () => transaction(() { |
1587 if (!truth(s_indent(additionalIndent))) return null; | 1600 if (!truth(s_indent(additionalIndent))) return null; |
1588 return or([ | 1601 return or([ |
1589 () => ns_l_compactSequence(indent + 1 + additionalIndent), | 1602 () => ns_l_compactSequence(indent + 1 + additionalIndent), |
1590 () => ns_l_compactMapping(indent + 1 + additionalIndent)]); | 1603 () => ns_l_compactMapping(indent + 1 + additionalIndent)]); |
1591 }), | 1604 }), |
1592 () => s_l_blockNode(indent, ctx), | 1605 () => s_l_blockNode(indent, ctx), |
1593 () => s_l_comments() ? e_node() : null]); | 1606 () => s_l_comments() ? e_node() : null]); |
1594 } | 1607 } |
1595 | 1608 |
1596 // 186 | 1609 // 186 |
1597 Node ns_l_compactSequence(int indent) => context('sequence', () { | 1610 Node ns_l_compactSequence(int indent) => context('sequence', () { |
| 1611 var start = _scanner.state; |
1598 var first = c_l_blockSeqEntry(indent); | 1612 var first = c_l_blockSeqEntry(indent); |
1599 if (!truth(first)) return null; | 1613 if (!truth(first)) return null; |
1600 | 1614 |
1601 var content = zeroOrMore(() => transaction(() { | 1615 var content = zeroOrMore(() => transaction(() { |
1602 if (!truth(s_indent(indent))) return null; | 1616 if (!truth(s_indent(indent))) return null; |
1603 return c_l_blockSeqEntry(indent); | 1617 return c_l_blockSeqEntry(indent); |
1604 })); | 1618 })); |
1605 content.insert(0, first); | 1619 content.insert(0, first); |
1606 | 1620 |
1607 return new SequenceNode("?", content); | 1621 return new SequenceNode("?", content, _scanner.spanFrom(start)); |
1608 }); | 1622 }); |
1609 | 1623 |
1610 // 187 | 1624 // 187 |
1611 Node l_blockMapping(int indent) => context('mapping', () { | 1625 Node l_blockMapping(int indent) => context('mapping', () { |
1612 var additionalIndent = countIndentation() - indent; | 1626 var additionalIndent = countIndentation() - indent; |
1613 if (additionalIndent <= 0) return null; | 1627 if (additionalIndent <= 0) return null; |
1614 | 1628 |
| 1629 var start = _scanner.state; |
1615 var pairs = oneOrMore(() => transaction(() { | 1630 var pairs = oneOrMore(() => transaction(() { |
1616 if (!truth(s_indent(indent + additionalIndent))) return null; | 1631 if (!truth(s_indent(indent + additionalIndent))) return null; |
1617 return ns_l_blockMapEntry(indent + additionalIndent); | 1632 return ns_l_blockMapEntry(indent + additionalIndent); |
1618 })); | 1633 })); |
1619 if (!truth(pairs)) return null; | 1634 if (!truth(pairs)) return null; |
1620 | 1635 |
1621 return map(pairs); | 1636 return map(pairs, _scanner.spanFrom(start)); |
1622 }); | 1637 }); |
1623 | 1638 |
1624 // 188 | 1639 // 188 |
1625 _Pair<Node, Node> ns_l_blockMapEntry(int indent) => or([ | 1640 Pair<Node, Node> ns_l_blockMapEntry(int indent) => or([ |
1626 () => c_l_blockMapExplicitEntry(indent), | 1641 () => c_l_blockMapExplicitEntry(indent), |
1627 () => ns_l_blockMapImplicitEntry(indent) | 1642 () => ns_l_blockMapImplicitEntry(indent) |
1628 ]); | 1643 ]); |
1629 | 1644 |
1630 // 189 | 1645 // 189 |
1631 _Pair<Node, Node> c_l_blockMapExplicitEntry(int indent) { | 1646 Pair<Node, Node> c_l_blockMapExplicitEntry(int indent) { |
1632 var key = c_l_blockMapExplicitKey(indent); | 1647 var key = c_l_blockMapExplicitKey(indent); |
1633 if (!truth(key)) return null; | 1648 if (!truth(key)) return null; |
1634 | 1649 |
1635 var value = or([ | 1650 var value = or([ |
1636 () => l_blockMapExplicitValue(indent), | 1651 () => l_blockMapExplicitValue(indent), |
1637 e_node | 1652 e_node |
1638 ]); | 1653 ]); |
1639 | 1654 |
1640 return new _Pair<Node, Node>(key, value); | 1655 return new Pair<Node, Node>(key, value); |
1641 } | 1656 } |
1642 | 1657 |
1643 // 190 | 1658 // 190 |
1644 Node c_l_blockMapExplicitKey(int indent) => transaction(() { | 1659 Node c_l_blockMapExplicitKey(int indent) => transaction(() { |
1645 if (!truth(c_indicator(C_MAPPING_KEY))) return null; | 1660 if (!truth(c_indicator(C_MAPPING_KEY))) return null; |
1646 return s_l_blockIndented(indent, BLOCK_OUT); | 1661 return s_l_blockIndented(indent, BLOCK_OUT); |
1647 }); | 1662 }); |
1648 | 1663 |
1649 // 191 | 1664 // 191 |
1650 Node l_blockMapExplicitValue(int indent) => transaction(() { | 1665 Node l_blockMapExplicitValue(int indent) => transaction(() { |
1651 if (!truth(s_indent(indent))) return null; | 1666 if (!truth(s_indent(indent))) return null; |
1652 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; | 1667 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; |
1653 return s_l_blockIndented(indent, BLOCK_OUT); | 1668 return s_l_blockIndented(indent, BLOCK_OUT); |
1654 }); | 1669 }); |
1655 | 1670 |
1656 // 192 | 1671 // 192 |
1657 _Pair<Node, Node> ns_l_blockMapImplicitEntry(int indent) => transaction(() { | 1672 Pair<Node, Node> ns_l_blockMapImplicitEntry(int indent) => transaction(() { |
1658 var key = or([ns_s_blockMapImplicitKey, e_node]); | 1673 var key = or([ns_s_blockMapImplicitKey, e_node]); |
1659 var value = c_l_blockMapImplicitValue(indent); | 1674 var value = c_l_blockMapImplicitValue(indent); |
1660 return truth(value) ? new _Pair<Node, Node>(key, value) : null; | 1675 return truth(value) ? new Pair<Node, Node>(key, value) : null; |
1661 }); | 1676 }); |
1662 | 1677 |
1663 // 193 | 1678 // 193 |
1664 Node ns_s_blockMapImplicitKey() => context('mapping key', () => or([ | 1679 Node ns_s_blockMapImplicitKey() => context('mapping key', () => or([ |
1665 () => c_s_implicitJsonKey(BLOCK_KEY), | 1680 () => c_s_implicitJsonKey(BLOCK_KEY), |
1666 () => ns_s_implicitYamlKey(BLOCK_KEY) | 1681 () => ns_s_implicitYamlKey(BLOCK_KEY) |
1667 ])); | 1682 ])); |
1668 | 1683 |
1669 // 194 | 1684 // 194 |
1670 Node c_l_blockMapImplicitValue(int indent) => context('mapping value', () => | 1685 Node c_l_blockMapImplicitValue(int indent) => context('mapping value', () => |
1671 transaction(() { | 1686 transaction(() { |
1672 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; | 1687 if (!truth(c_indicator(C_MAPPING_VALUE))) return null; |
1673 return or([ | 1688 return or([ |
1674 () => s_l_blockNode(indent, BLOCK_OUT), | 1689 () => s_l_blockNode(indent, BLOCK_OUT), |
1675 () => s_l_comments() ? e_node() : null | 1690 () => s_l_comments() ? e_node() : null |
1676 ]); | 1691 ]); |
1677 })); | 1692 })); |
1678 | 1693 |
1679 // 195 | 1694 // 195 |
1680 Node ns_l_compactMapping(int indent) => context('mapping', () { | 1695 Node ns_l_compactMapping(int indent) => context('mapping', () { |
| 1696 var start = _scanner.state; |
1681 var first = ns_l_blockMapEntry(indent); | 1697 var first = ns_l_blockMapEntry(indent); |
1682 if (!truth(first)) return null; | 1698 if (!truth(first)) return null; |
1683 | 1699 |
1684 var pairs = zeroOrMore(() => transaction(() { | 1700 var pairs = zeroOrMore(() => transaction(() { |
1685 if (!truth(s_indent(indent))) return null; | 1701 if (!truth(s_indent(indent))) return null; |
1686 return ns_l_blockMapEntry(indent); | 1702 return ns_l_blockMapEntry(indent); |
1687 })); | 1703 })); |
1688 pairs.insert(0, first); | 1704 pairs.insert(0, first); |
1689 | 1705 |
1690 return map(pairs); | 1706 return map(pairs, _scanner.spanFrom(start)); |
1691 }); | 1707 }); |
1692 | 1708 |
1693 // 196 | 1709 // 196 |
1694 Node s_l_blockNode(int indent, int ctx) => or([ | 1710 Node s_l_blockNode(int indent, int ctx) => or([ |
1695 () => s_l_blockInBlock(indent, ctx), | 1711 () => s_l_blockInBlock(indent, ctx), |
1696 () => s_l_flowInBlock(indent) | 1712 () => s_l_flowInBlock(indent) |
1697 ]); | 1713 ]); |
1698 | 1714 |
1699 // 197 | 1715 // 197 |
1700 Node s_l_flowInBlock(int indent) => transaction(() { | 1716 Node s_l_flowInBlock(int indent) => transaction(() { |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1800 if (doc != null) return doc; | 1816 if (doc != null) return doc; |
1801 parseFailed(); | 1817 parseFailed(); |
1802 return null; // Unreachable. | 1818 return null; // Unreachable. |
1803 } | 1819 } |
1804 | 1820 |
1805 // 210 | 1821 // 210 |
1806 Node l_anyDocument() => | 1822 Node l_anyDocument() => |
1807 or([l_directiveDocument, l_explicitDocument, l_bareDocument]); | 1823 or([l_directiveDocument, l_explicitDocument, l_bareDocument]); |
1808 | 1824 |
1809 // 211 | 1825 // 211 |
1810 List<Node> l_yamlStream() { | 1826 Pair<List<Node>, Span> l_yamlStream() { |
| 1827 var start = _scanner.state; |
1811 var docs = []; | 1828 var docs = []; |
1812 zeroOrMore(l_documentPrefix); | 1829 zeroOrMore(l_documentPrefix); |
1813 var first = zeroOrOne(l_anyDocument); | 1830 var first = zeroOrOne(l_anyDocument); |
1814 if (!truth(first)) first = e_node(); | 1831 if (!truth(first)) first = e_node(); |
1815 docs.add(first); | 1832 docs.add(first); |
1816 | 1833 |
1817 zeroOrMore(() { | 1834 zeroOrMore(() { |
1818 var doc; | 1835 var doc; |
1819 if (truth(oneOrMore(l_documentSuffix))) { | 1836 if (truth(oneOrMore(l_documentSuffix))) { |
1820 zeroOrMore(l_documentPrefix); | 1837 zeroOrMore(l_documentPrefix); |
1821 doc = zeroOrOne(l_anyDocument); | 1838 doc = zeroOrOne(l_anyDocument); |
1822 } else { | 1839 } else { |
1823 zeroOrMore(l_documentPrefix); | 1840 zeroOrMore(l_documentPrefix); |
1824 doc = zeroOrOne(l_explicitDocument); | 1841 doc = zeroOrOne(l_explicitDocument); |
1825 } | 1842 } |
1826 if (truth(doc)) docs.add(doc); | 1843 if (truth(doc)) docs.add(doc); |
1827 return doc; | 1844 return doc; |
1828 }); | 1845 }); |
1829 | 1846 |
1830 if (!_scanner.isDone) parseFailed(); | 1847 if (!_scanner.isDone) parseFailed(); |
1831 return docs; | 1848 return new Pair(docs, _scanner.spanFrom(start)); |
1832 } | 1849 } |
1833 } | 1850 } |
1834 | 1851 |
1835 /// A pair of values. | |
1836 class _Pair<E, F> { | |
1837 E first; | |
1838 F last; | |
1839 | |
1840 _Pair(this.first, this.last); | |
1841 | |
1842 String toString() => '($first, $last)'; | |
1843 } | |
1844 | |
1845 /// The information in the header for a block scalar. | 1852 /// The information in the header for a block scalar. |
1846 class _BlockHeader { | 1853 class _BlockHeader { |
1847 final int additionalIndent; | 1854 final int additionalIndent; |
1848 final int chomping; | 1855 final int chomping; |
1849 | 1856 |
1850 _BlockHeader(this.additionalIndent, this.chomping); | 1857 _BlockHeader(this.additionalIndent, this.chomping); |
1851 | 1858 |
1852 bool get autoDetectIndent => additionalIndent == null; | 1859 bool get autoDetectIndent => additionalIndent == null; |
1853 } | 1860 } |
1854 | 1861 |
(...skipping 10 matching lines...) Expand all Loading... |
1865 | 1872 |
1866 /// Returns whether or not [pos] lies within this range. | 1873 /// Returns whether or not [pos] lies within this range. |
1867 bool contains(int pos) => pos >= start && pos <= end; | 1874 bool contains(int pos) => pos >= start && pos <= end; |
1868 } | 1875 } |
1869 | 1876 |
1870 /// A map that associates [E] values with [_Range]s. It's efficient to create | 1877 /// A map that associates [E] values with [_Range]s. It's efficient to create |
1871 /// new associations, but finding the value associated with a position is more | 1878 /// new associations, but finding the value associated with a position is more |
1872 /// expensive. | 1879 /// expensive. |
1873 class _RangeMap<E> { | 1880 class _RangeMap<E> { |
1874 /// The ranges and their associated elements. | 1881 /// The ranges and their associated elements. |
1875 final List<_Pair<_Range, E>> _contents = <_Pair<_Range, E>>[]; | 1882 final List<Pair<_Range, E>> _contents = <Pair<_Range, E>>[]; |
1876 | 1883 |
1877 _RangeMap(); | 1884 _RangeMap(); |
1878 | 1885 |
1879 /// Returns the value associated with the range in which [pos] lies, or null | 1886 /// Returns the value associated with the range in which [pos] lies, or null |
1880 /// if there is no such range. If there's more than one such range, the most | 1887 /// if there is no such range. If there's more than one such range, the most |
1881 /// recently set one is used. | 1888 /// recently set one is used. |
1882 E operator[](int pos) { | 1889 E operator[](int pos) { |
1883 // Iterate backwards through contents so the more recent range takes | 1890 // Iterate backwards through contents so the more recent range takes |
1884 // precedence. | 1891 // precedence. |
1885 for (var pair in _contents.reversed) { | 1892 for (var pair in _contents.reversed) { |
1886 if (pair.first.contains(pos)) return pair.last; | 1893 if (pair.first.contains(pos)) return pair.last; |
1887 } | 1894 } |
1888 return null; | 1895 return null; |
1889 } | 1896 } |
1890 | 1897 |
1891 /// Associates [value] with [range]. | 1898 /// Associates [value] with [range]. |
1892 operator[]=(_Range range, E value) => | 1899 operator[]=(_Range range, E value) => |
1893 _contents.add(new _Pair<_Range, E>(range, value)); | 1900 _contents.add(new Pair<_Range, E>(range, value)); |
1894 } | 1901 } |
OLD | NEW |