@@ -657,35 +657,22 @@ func trace(args ...interface{}) func() {
657
657
func yaml_parser_fetch_more_tokens (parser * yaml_parser_t ) bool {
658
658
// While we need more tokens to fetch, do it.
659
659
for {
660
- // Check if we really need to fetch more tokens.
661
- need_more_tokens := false
662
-
663
660
// [Go] The comment parsing logic requires a lookahead of two tokens
664
661
// so that foot comments may be parsed in time of associating them
665
662
// with the tokens that are parsed before them, and also for line
666
663
// comments to be transformed into head comments in some edge cases.
667
- if parser .tokens_head >= len (parser .tokens )- 2 {
668
- need_more_tokens = true
669
- } else {
670
- // Check if any potential simple key may occupy the head position.
671
- for i := len (parser .simple_keys ) - 1 ; i >= 0 ; i -- {
672
- simple_key := & parser .simple_keys [i ]
673
- if simple_key .token_number < parser .tokens_parsed {
674
- break
675
- }
676
- if valid , ok := yaml_simple_key_is_valid (parser , simple_key ); ! ok {
677
- return false
678
- } else if valid && simple_key .token_number == parser .tokens_parsed {
679
- need_more_tokens = true
680
- break
681
- }
664
+ if parser .tokens_head < len (parser .tokens )- 2 {
665
+ // If a potential simple key is at the head position, we need to fetch
666
+ // the next token to disambiguate it.
667
+ head_tok_idx , ok := parser .simple_keys_by_tok [parser .tokens_parsed ]
668
+ if ! ok {
669
+ break
670
+ } else if valid , ok := yaml_simple_key_is_valid (parser , & parser .simple_keys [head_tok_idx ]); ! ok {
671
+ return false
672
+ } else if ! valid {
673
+ break
682
674
}
683
675
}
684
-
685
- // We are finished.
686
- if ! need_more_tokens {
687
- break
688
- }
689
676
// Fetch the next token.
690
677
if ! yaml_parser_fetch_next_token (parser ) {
691
678
return false
@@ -938,6 +925,7 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool {
938
925
return false
939
926
}
940
927
parser .simple_keys [len (parser .simple_keys )- 1 ] = simple_key
928
+ parser .simple_keys_by_tok [simple_key .token_number ] = len (parser .simple_keys ) - 1
941
929
}
942
930
return true
943
931
}
@@ -952,9 +940,10 @@ func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool {
952
940
"while scanning a simple key" , parser .simple_keys [i ].mark ,
953
941
"could not find expected ':'" )
954
942
}
943
+ // Remove the key from the stack.
944
+ parser .simple_keys [i ].possible = false
945
+ delete (parser .simple_keys_by_tok , parser .simple_keys [i ].token_number )
955
946
}
956
- // Remove the key from the stack.
957
- parser .simple_keys [i ].possible = false
958
947
return true
959
948
}
960
949
@@ -985,7 +974,9 @@ func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool {
985
974
func yaml_parser_decrease_flow_level (parser * yaml_parser_t ) bool {
986
975
if parser .flow_level > 0 {
987
976
parser .flow_level --
988
- parser .simple_keys = parser .simple_keys [:len (parser .simple_keys )- 1 ]
977
+ last := len (parser .simple_keys ) - 1
978
+ delete (parser .simple_keys_by_tok , parser .simple_keys [last ].token_number )
979
+ parser .simple_keys = parser .simple_keys [:last ]
989
980
}
990
981
return true
991
982
}
@@ -1092,6 +1083,8 @@ func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool {
1092
1083
// Initialize the simple key stack.
1093
1084
parser .simple_keys = append (parser .simple_keys , yaml_simple_key_t {})
1094
1085
1086
+ parser .simple_keys_by_tok = make (map [int ]int )
1087
+
1095
1088
// A simple key is allowed at the beginning of the stream.
1096
1089
parser .simple_key_allowed = true
1097
1090
@@ -1396,6 +1389,7 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool {
1396
1389
1397
1390
// Remove the simple key.
1398
1391
simple_key .possible = false
1392
+ delete (parser .simple_keys_by_tok , simple_key .token_number )
1399
1393
1400
1394
// A simple key cannot follow another simple key.
1401
1395
parser .simple_key_allowed = false
0 commit comments