Skip to content

Commit 3cba8d3

Browse files
committed
Parser: ensure error on references with anchors/tags
1 parent 08bff10 commit 3cba8d3

2 files changed

Lines changed: 39 additions & 30 deletions

File tree

src/c4/yml/parse_engine.def.hpp

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4611,6 +4611,24 @@ size_t ParseEngine<EventHandler>::_select_indentation_from_annotations(size_t va
46114611
return curr->line < val_line ? val_indentation : curr->indentation;
46124612
}
46134613

4614+
template<class EventHandler>
4615+
void ParseEngine<EventHandler>::_handle_keyref(csubstr alias)
4616+
{
4617+
if(C4_LIKELY(!(m_pending_anchors.num_entries | m_pending_tags.num_entries)))
4618+
m_evt_handler->set_key_ref(alias);
4619+
else
4620+
_c4err("aliases cannot have anchors or tags");
4621+
}
4622+
4623+
template<class EventHandler>
4624+
void ParseEngine<EventHandler>::_handle_valref(csubstr alias)
4625+
{
4626+
if(C4_LIKELY(!(m_pending_anchors.num_entries | m_pending_tags.num_entries)))
4627+
m_evt_handler->set_val_ref(alias);
4628+
else
4629+
_c4err("aliases cannot have anchors or tags");
4630+
}
4631+
46144632
template<class EventHandler>
46154633
void ParseEngine<EventHandler>::_handle_directive(csubstr rem)
46164634
{
@@ -5100,7 +5118,7 @@ void ParseEngine<EventHandler>::_handle_seq_imap()
51005118
{
51015119
csubstr ref = _scan_ref_seq();
51025120
_c4dbgpf("seqimap[RVAL]: ref! {}", _prs(ref));
5103-
m_evt_handler->set_val_ref(ref);
5121+
_handle_valref(ref);
51045122
addrem_flags(RNXT, RVAL);
51055123
}
51065124
else if(first == '&')
@@ -5215,7 +5233,7 @@ void ParseEngine<EventHandler>::_handle_seq_imap()
52155233
{
52165234
csubstr ref = _scan_ref_seq();
52175235
_c4dbgp("seqimap[QMRK]: ref!");
5218-
m_evt_handler->set_key_ref(ref);
5236+
_handle_keyref(ref);
52195237
addrem_flags(RKCL, QMRK);
52205238
}
52215239
else
@@ -5356,7 +5374,7 @@ void ParseEngine<EventHandler>::_handle_seq_flow()
53565374
else if(first == ']') // this happens on cases such as [] or [.., ]
53575375
{
53585376
_c4dbgp("seqflow[RVAL]: end!");
5359-
if(m_pending_anchors.num_entries || m_pending_tags.num_entries)
5377+
if(m_pending_anchors.num_entries | m_pending_tags.num_entries)
53605378
{
53615379
_c4dbgp("seqflow[RVAL]: add pending annotations");
53625380
_handle_annotations_before_blck_val_scalar();
@@ -5604,7 +5622,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
56045622
{
56055623
csubstr ref = _scan_ref_map();
56065624
_c4dbgpf("mapflow[RKEY]: key ref! {}", _prs(ref));
5607-
m_evt_handler->set_key_ref(ref);
5625+
_handle_keyref(ref);
56085626
addrem_flags(RKCL, RKEY);
56095627
}
56105628
else if(first == '[')
@@ -5752,7 +5770,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57525770
{
57535771
csubstr ref = _scan_ref_map();
57545772
_c4dbgpf("mapflow[RVAL]: key ref! {}", _prs(ref));
5755-
m_evt_handler->set_val_ref(ref);
5773+
_handle_valref(ref);
57565774
addrem_flags(RNXT, RVAL);
57575775
}
57585776
else if(first == '&')
@@ -5869,7 +5887,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58695887
{
58705888
csubstr ref = _scan_ref_map();
58715889
_c4dbgpf("mapflow[QMRK]: key ref! {}", _prs(ref));
5872-
m_evt_handler->set_key_ref(ref);
5890+
_handle_keyref(ref);
58735891
addrem_flags(RKCL, QMRK);
58745892
}
58755893
else if(first == '[')
@@ -6205,8 +6223,7 @@ void ParseEngine<EventHandler>::_handle_seq_block()
62056223
if(!_maybe_scan_following_colon())
62066224
{
62076225
_c4dbgp("seqblck[RVAL]: set ref as val!");
6208-
_handle_annotations_before_blck_val_scalar();
6209-
m_evt_handler->set_val_ref(ref);
6226+
_handle_valref(ref);
62106227
addrem_flags(RNXT, RVAL);
62116228
}
62126229
else
@@ -6216,7 +6233,7 @@ void ParseEngine<EventHandler>::_handle_seq_block()
62166233
_handle_annotations_before_start_mapblck(startline);
62176234
m_evt_handler->begin_map_val_block();
62186235
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
6219-
m_evt_handler->set_key_ref(ref);
6236+
_handle_keyref(ref);
62206237
addrem_flags(RMAP|RVAL, RSEQ|RNXT);
62216238
_set_indentation(startindent);
62226239
_maybe_skip_whitespace_tokens();
@@ -6573,8 +6590,7 @@ void ParseEngine<EventHandler>::_handle_map_block()
65736590
{
65746591
csubstr ref = _scan_ref_map();
65756592
_c4dbgpf("mapblck[RKEY]: key ref! {}", _prs(ref));
6576-
_handle_annotations_before_blck_key_scalar();
6577-
m_evt_handler->set_key_ref(ref);
6593+
_handle_keyref(ref);
65786594
addrem_flags(RVAL, RKEY);
65796595
if(!_maybe_scan_following_colon())
65806596
_c4err("could not find ':' colon after key");
@@ -6961,7 +6977,7 @@ void ParseEngine<EventHandler>::_handle_map_block()
69616977
if(startindent == m_evt_handler->m_curr->indref)
69626978
{
69636979
_c4dbgpf("mapblck[RVAL]: same indentation {}", startindent);
6964-
m_evt_handler->set_val_ref(ref);
6980+
_handle_valref(ref);
69656981
addrem_flags(RNXT, RVAL);
69666982
}
69676983
else
@@ -6972,18 +6988,16 @@ void ParseEngine<EventHandler>::_handle_map_block()
69726988
{
69736989
_c4dbgp("mapblck[RVAL]: start child map, block");
69746990
addrem_flags(RNXT, RVAL);
6975-
_handle_annotations_before_blck_val_scalar();
69766991
m_evt_handler->begin_map_val_block();
6977-
m_evt_handler->set_key_ref(ref);
6992+
_handle_keyref(ref);
69786993
_set_indentation(startindent);
69796994
// keep going in RVAL
69806995
addrem_flags(RVAL, RNXT);
69816996
}
69826997
else
69836998
{
69846999
_c4dbgp("mapblck[RVAL]: was val ref");
6985-
_handle_annotations_before_blck_val_scalar();
6986-
m_evt_handler->set_val_ref(ref);
7000+
_handle_valref(ref);
69877001
addrem_flags(RNXT, RVAL);
69887002
}
69897003
}
@@ -7420,15 +7434,13 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
74207434
if(!_maybe_scan_following_colon())
74217435
{
74227436
_c4dbgp("mapblck[QMRK]: set ref as key");
7423-
_handle_annotations_before_blck_key_scalar();
7424-
m_evt_handler->set_key_ref(ref);
7437+
_handle_keyref(ref);
74257438
}
74267439
else
74277440
{
74287441
_c4dbgp("mapblck[QMRK]: start new block map as key (!), set ref as key");
7429-
_handle_annotations_before_blck_key_scalar();
74307442
m_evt_handler->begin_map_key_block();
7431-
m_evt_handler->set_key_ref(ref);
7443+
_handle_keyref(ref);
74327444
_set_indentation(startindent);
74337445
// keep the child state on RVAL
74347446
addrem_flags(RVAL, RKCL|QMRK);
@@ -7962,8 +7974,7 @@ void ParseEngine<EventHandler>::_handle_unk()
79627974
if(!_maybe_scan_following_colon())
79637975
{
79647976
_c4dbgp("runk: set val ref");
7965-
_handle_annotations_before_blck_val_scalar();
7966-
m_evt_handler->set_val_ref(ref);
7977+
_handle_valref(ref);
79677978
}
79687979
else
79697980
{
@@ -7972,8 +7983,7 @@ void ParseEngine<EventHandler>::_handle_unk()
79727983
const size_t startline = m_evt_handler->m_curr->pos.line; // save
79737984
_handle_annotations_before_start_mapblck(startline);
79747985
m_evt_handler->begin_map_val_block();
7975-
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
7976-
m_evt_handler->set_key_ref(ref);
7986+
_handle_keyref(ref);
79777987
_maybe_skip_whitespace_tokens();
79787988
_set_indentation(0);
79797989
addrem_flags(RMAP|RBLCK|RVAL, RTOP|RUNK|RDOC);
@@ -8262,8 +8272,7 @@ C4_COLD void ParseEngine<EventHandler>::_handle_usty()
82628272
add_flags(RNXT);
82638273
_handle_annotations_before_start_mapblck(startline);
82648274
m_evt_handler->_push();
8265-
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
8266-
m_evt_handler->set_key_ref(ref);
8275+
_handle_keyref(ref);
82678276
_maybe_skip_whitespace_tokens();
82688277
_set_indentation(startindent);
82698278
addrem_flags(RMAP|RBLCK|RVAL, RNXT|USTY);
@@ -8445,8 +8454,7 @@ C4_COLD void ParseEngine<EventHandler>::_handle_usty()
84458454
if(!_maybe_scan_following_colon())
84468455
{
84478456
_c4dbgp("usty[UNK]: set val ref");
8448-
_handle_annotations_before_blck_val_scalar();
8449-
m_evt_handler->set_val_ref(ref);
8457+
_handle_valref(ref);
84508458
}
84518459
else
84528460
{
@@ -8455,8 +8463,7 @@ C4_COLD void ParseEngine<EventHandler>::_handle_usty()
84558463
add_flags(RNXT);
84568464
_handle_annotations_before_start_mapblck(startline);
84578465
m_evt_handler->begin_map_val_block();
8458-
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
8459-
m_evt_handler->set_key_ref(ref);
8466+
_handle_keyref(ref);
84608467
_maybe_skip_whitespace_tokens();
84618468
_set_indentation(startindent);
84628469
addrem_flags(RMAP|RBLCK|RVAL, RNXT|USTY);

src/c4/yml/parse_engine.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ class ParseEngine
661661
void _handle_annotations_before_start_mapblck_as_key();
662662
void _handle_annotations_and_indentation_after_start_mapblck(size_t key_indentation, size_t key_line);
663663
size_t _select_indentation_from_annotations(size_t val_indentation, size_t val_line);
664+
void _handle_keyref(csubstr alias);
665+
void _handle_valref(csubstr alias);
664666
void _handle_directive(csubstr rem);
665667
bool _handle_bom();
666668
void _handle_bom(Encoding_e enc);

0 commit comments

Comments
 (0)