Skip to content

Commit 0bfb286

Browse files
authored
Merge pull request #502 from biojppm/ysfixes
2 parents 8c37616 + 3d66090 commit 0bfb286

5 files changed

Lines changed: 949 additions & 13 deletions

File tree

changelog/current.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,27 @@
22
## Fixes
33

44
- [PR#501](https://github.com/biojppm/rapidyaml/pull/501): fix missing tag in `- !!seq []`
5+
- [PR#502](https://github.com/biojppm/rapidyaml/pull/502): fix parse errors or missing tags:
6+
- missing tags in empty documents:
7+
```yaml
8+
!yamlscript/v0/bare
9+
--- !code
10+
42
11+
```
12+
- trailing empty keys or vals:
13+
```yaml
14+
a:
15+
:
16+
```
17+
- missing tags in trailing empty keys or vals:
18+
```yaml
19+
a: !tag
20+
!tag : !tag
21+
```
22+
- missing tags in complex maps:
23+
```yaml
24+
? a: !tag
25+
!tag : !tag
26+
:
27+
!tag : !tag
28+
```

src/c4/yml/parse_engine.def.hpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,9 +1611,10 @@ void ParseEngine<EventHandler>::_end2_doc()
16111611
{
16121612
_c4dbgp("doc: end");
16131613
_RYML_CB_ASSERT(m_evt_handler->m_stack.m_callbacks, has_any(RDOC));
1614-
if(m_doc_empty)
1614+
if(m_doc_empty || (m_pending_tags.num_entries || m_pending_anchors.num_entries))
16151615
{
16161616
_c4dbgp("doc was empty; add empty val");
1617+
_handle_annotations_before_blck_val_scalar();
16171618
m_evt_handler->set_val_scalar_plain_empty();
16181619
}
16191620
m_evt_handler->end_doc();
@@ -1623,9 +1624,10 @@ template<class EventHandler>
16231624
void ParseEngine<EventHandler>::_end2_doc_expl()
16241625
{
16251626
_c4dbgp("doc: end");
1626-
if(m_doc_empty)
1627+
if(m_doc_empty || (m_pending_tags.num_entries || m_pending_anchors.num_entries))
16271628
{
16281629
_c4dbgp("doc: no children; add empty val");
1630+
_handle_annotations_before_blck_val_scalar();
16291631
m_evt_handler->set_val_scalar_plain_empty();
16301632
}
16311633
m_evt_handler->end_doc_expl();
@@ -1648,6 +1650,14 @@ void ParseEngine<EventHandler>::_maybe_end_doc()
16481650
_c4dbgp("doc must be finished");
16491651
_end2_doc();
16501652
}
1653+
else if(m_doc_empty && (m_pending_tags.num_entries || m_pending_anchors.num_entries))
1654+
{
1655+
_c4dbgp("no doc to finish, but pending annotations");
1656+
m_evt_handler->begin_doc();
1657+
_handle_annotations_before_blck_val_scalar();
1658+
m_evt_handler->set_val_scalar_plain_empty();
1659+
m_evt_handler->end_doc();
1660+
}
16511661
}
16521662

16531663
template<class EventHandler>
@@ -6800,14 +6810,26 @@ void ParseEngine<EventHandler>::_handle_map_block()
68006810
m_evt_handler->set_val_scalar_plain_empty();
68016811
m_evt_handler->add_sibling();
68026812
m_evt_handler->set_key_scalar_plain_empty();
6803-
_line_progressed(1);
6804-
_maybe_skip_whitespace_tokens();
6805-
goto mapblck_again;
6813+
}
6814+
else if(startindent > m_evt_handler->m_curr->indref)
6815+
{
6816+
_c4dbgp("mapblck[RVAL]: start val mapblck");
6817+
addrem_flags(RNXT, RVAL);
6818+
_handle_annotations_before_start_mapblck(startline);
6819+
m_evt_handler->begin_map_val_block();
6820+
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
6821+
m_evt_handler->set_key_scalar_plain_empty();
6822+
_set_indentation(m_evt_handler->m_curr->line_contents.indentation);
6823+
// keep the child state on RVAL
6824+
addrem_flags(RVAL, RNXT);
68066825
}
68076826
else
68086827
{
68096828
_c4err("parse error");
68106829
}
6830+
_line_progressed(1);
6831+
_maybe_skip_whitespace_tokens();
6832+
goto mapblck_again;
68116833
}
68126834
else if(first == '.')
68136835
{
@@ -7160,6 +7182,7 @@ void ParseEngine<EventHandler>::_handle_map_block()
71607182
{
71617183
_c4dbgp("mapblck[QMRK]: start child seqblck (!)");
71627184
addrem_flags(RKCL, RKEY|QMRK);
7185+
_handle_annotations_before_blck_key_scalar();
71637186
m_evt_handler->begin_seq_key_block();
71647187
addrem_flags(RVAL|RSEQ, RMAP|RKCL|QMRK);
71657188
_set_indentation(startindent);
@@ -7521,13 +7544,16 @@ void ParseEngine<EventHandler>::_handle_unk()
75217544
if(m_doc_empty)
75227545
{
75237546
_c4dbgp("it's a map with an empty key");
7547+
const size_t startindent = m_evt_handler->m_curr->line_contents.indentation; // save
7548+
const size_t startline = m_evt_handler->m_curr->pos.line; // save
75247549
m_evt_handler->check_trailing_doc_token();
75257550
_maybe_begin_doc();
7526-
_handle_annotations_before_blck_val_scalar();
7551+
_handle_annotations_before_start_mapblck(startline);
75277552
m_evt_handler->begin_map_val_block();
7553+
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
75287554
m_evt_handler->set_key_scalar_plain_empty();
75297555
m_doc_empty = false;
7530-
_save_indentation();
7556+
_set_indentation(startindent);
75317557
}
75327558
else
75337559
{

0 commit comments

Comments
 (0)