2 Copyright (C) 2001, 2002 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
6 The Gedcom parser library is free software; you can redistribute it
7 and/or modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The Gedcom parser library is distributed in the hope that it will be
12 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the Gedcom parser library; if not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 /* WARNING: THIS PARSER RELIES HEAVILY ON SOME FEATURES OF BISON.
25 DON'T TRY TO USE IT WITH YACC, IT WON'T WORK...
28 /* Design of the parser:
30 In general, a GEDCOM file contains records, each consisting of a line
31 (which we'll call a section), hierarchically containing other lines
32 (subsections of the section).
34 This means that in general we have:
36 A 'record' is a 'section' (sect) containing 'subsections' (subs)
37 Each 'subsection' (sub) is again a specific 'section' (sect)
39 In parser notation, this means:
43 sect : <some prefix> subs <some suffix>
45 subs : <empty> | subs sub
47 sub : sect_a | sect_b | ...
49 This pattern is repeated throughout the parser for the different types of
53 Cardinality of the subsections:
54 -------------------------------
55 Note that in the above, the order of the subsections is of no importance.
56 Indeed, this is the case in the GEDCOM grammar. However, this also makes
57 it difficult to check whether there are not too many subsections of a
58 specific type, or whether a mandatory subsection is indeed there.
60 Suppose there is a section A that can contain 0 or 1 B section and
63 This can be expressed in parser notation as follows:
65 A : CC | BCC | CBC | CCB
67 So, cardinality is indeed expressable. However, as the number of subsection
68 types and the limits grow bigger (and even theoretically limitless), listing
69 all possible permutations becomes quickly unfeasible.
71 Much simpler is to say:
74 subs : <empty> | subs sub
77 and then check the cardinality in the semantic actions, which is the
78 solution chosen in the parser below, using the following macros:
81 Make a new context for the <parent> tag to count child tags in
83 - OCCUR2(<child>, <min>, <max>)
84 Express that the <child> tag should occur at least <min> times and
85 at most <max> tags within its parent
87 What this actually does is the following. It increments the counter
88 for that tag and then checks whether the maximum is exceeded. If so,
89 then a parser error is produced. The minimum is not actually checked
90 by this macro, but it makes the statements more declarative.
92 - OCCUR1(<child>, <min>)
93 Express that the <child> tag should occur at least <min> times within
94 its parent (no upper limit)
96 Actually, this only increments the counter for the tag, but it looks
97 very like the previous macro.
99 If the minimum is 0, it is not necessary to express this constraint.
101 - CHECKn(<child1>, ..., <childn>)
102 This closes the context for the parent tag and checks whether the
103 given <child> tags did effectively occur within the parent (i.e.
104 these are the tags that were mandatory).
106 Since the <min> values above are always 0 or 1 in GEDCOM, this is
107 sufficient. All sub-tags that declare a minimum of 1 in the OCCUR
108 macros should be listed in this macro here.
110 The macros CHECK0 to CHECK4 are defined like this (the first one
111 has no arguments and is only used to close the parent context; note
112 that this is necessary for correct functioning).
116 Only sections that have subsections need to use these macros. This can
117 be done like this (the OPEN and CHECK macros are used as mid-rule
118 actions around the subsections):
120 head_sect : OPEN DELIM TAG_HEAD
124 CLOSE { <semantic actions> }
130 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
131 | head_dest_sect { OCCUR2(DEST, 0, 1) }
132 | head_date_sect { OCCUR2(DATE, 0, 1) }
138 - The syntax analysis doesn't handle the contents of the line values;
139 this is done in the semantic analysis.
144 #include "gedcom_internal.h"
145 #include "multilex.h"
146 #include "encoding.h"
147 #include "interface.h"
154 int compat_enabled = 1;
155 int gedcom_high_level_debug = 0;
156 int compatibility = 0;
157 Gedcom_err_mech error_mechanism = IMMED_FAIL;
158 Gedcom_val_struct val1;
159 Gedcom_val_struct val2;
161 char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
162 char *line_item_buf_ptr;
168 /* These are defined at the bottom of the file */
169 void push_countarray();
170 void set_parenttag(char* tag);
171 char* get_parenttag(int offset);
172 void set_parentctxt(Gedcom_ctxt ctxt);
173 Gedcom_ctxt get_parentctxt(int offset);
174 void pop_countarray();
175 int count_tag(int tag);
176 int check_occurrence(int tag);
177 void set_compatibility(char* program);
178 int compat_mode(int flags);
180 #define CLEAR_BUFFER(BUF) \
181 memset(BUF, 0, sizeof(BUF));
183 #define HANDLE_ERROR \
184 { if (error_mechanism == IMMED_FAIL) { \
187 else if (error_mechanism == DEFER_FAIL) { \
190 else if (error_mechanism == IGNORE_ERRORS) { \
194 #define START1(PARENTTAG) \
195 { set_parenttag(#PARENTTAG); \
197 #define START2(PARENTCTXT) \
198 { set_parentctxt(PARENTCTXT); \
202 #define START(PARENTTAG,PARENTCTXT) \
203 { START1(PARENTTAG); \
204 START2(PARENTCTXT); \
208 #define GRANDPARENT(OFF) \
211 { if (!check_occurrence(TAG_##TAG)) { \
212 char* parenttag = get_parenttag(0); \
213 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
219 { pop_countarray(); \
223 #define CHECK1(TAG1) { CHK(TAG1); POP; }
224 #define CHECK2(TAG1,TAG2) \
225 { CHK(TAG1); CHK(TAG2); POP; }
226 #define CHECK3(TAG1,TAG2,TAG3) \
227 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
228 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
229 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
230 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
231 #define OCCUR2(CHILDTAG, MIN, MAX) \
232 { int num = count_tag(TAG_##CHILDTAG); \
234 char* parenttag = get_parenttag(0); \
235 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
236 #CHILDTAG, MAX, parenttag); \
240 #define INVALID_TAG(CHILDTAG) \
241 { char* parenttag = get_parenttag(0); \
242 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
243 CHILDTAG, parenttag); \
246 #define INVALID_TOP_TAG(CHILDTAG) \
247 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
257 struct tag_struct tag;
264 %token <string> BADTOKEN
266 %token <string> CLOSE
267 %token <string> ESCAPE
268 %token <string> DELIM
269 %token <string> ANYCHAR
270 %token <string> POINTER
272 %token <tag> TAG_ABBR
273 %token <tag> TAG_ADDR
274 %token <tag> TAG_ADR1
275 %token <tag> TAG_ADR2
276 %token <tag> TAG_ADOP
279 %token <tag> TAG_AGNC
280 %token <tag> TAG_ALIA
281 %token <tag> TAG_ANCE
282 %token <tag> TAG_ANCI
283 %token <tag> TAG_ANUL
284 %token <tag> TAG_ASSO
285 %token <tag> TAG_AUTH
286 %token <tag> TAG_BAPL
287 %token <tag> TAG_BAPM
288 %token <tag> TAG_BARM
289 %token <tag> TAG_BASM
290 %token <tag> TAG_BIRT
291 %token <tag> TAG_BLES
292 %token <tag> TAG_BLOB
293 %token <tag> TAG_BURI
294 %token <tag> TAG_CALN
295 %token <tag> TAG_CAST
296 %token <tag> TAG_CAUS
297 %token <tag> TAG_CENS
298 %token <tag> TAG_CHAN
299 %token <tag> TAG_CHAR
300 %token <tag> TAG_CHIL
302 %token <tag> TAG_CHRA
303 %token <tag> TAG_CITY
304 %token <tag> TAG_CONC
305 %token <tag> TAG_CONF
306 %token <tag> TAG_CONL
307 %token <tag> TAG_CONT
308 %token <tag> TAG_COPR
309 %token <tag> TAG_CORP
310 %token <tag> TAG_CREM
311 %token <tag> TAG_CTRY
312 %token <tag> TAG_DATA
313 %token <tag> TAG_DATE
314 %token <tag> TAG_DEAT
315 %token <tag> TAG_DESC
316 %token <tag> TAG_DESI
317 %token <tag> TAG_DEST
319 %token <tag> TAG_DIVF
320 %token <tag> TAG_DSCR
321 %token <tag> TAG_EDUC
322 %token <tag> TAG_EMIG
323 %token <tag> TAG_ENDL
324 %token <tag> TAG_ENGA
325 %token <tag> TAG_EVEN
327 %token <tag> TAG_FAMC
328 %token <tag> TAG_FAMF
329 %token <tag> TAG_FAMS
330 %token <tag> TAG_FCOM
331 %token <tag> TAG_FILE
332 %token <tag> TAG_FORM
333 %token <tag> TAG_GEDC
334 %token <tag> TAG_GIVN
335 %token <tag> TAG_GRAD
336 %token <tag> TAG_HEAD
337 %token <tag> TAG_HUSB
338 %token <tag> TAG_IDNO
339 %token <tag> TAG_IMMI
340 %token <tag> TAG_INDI
341 %token <tag> TAG_LANG
342 %token <tag> TAG_LEGA
343 %token <tag> TAG_MARB
344 %token <tag> TAG_MARC
345 %token <tag> TAG_MARL
346 %token <tag> TAG_MARR
347 %token <tag> TAG_MARS
348 %token <tag> TAG_MEDI
349 %token <tag> TAG_NAME
350 %token <tag> TAG_NATI
351 %token <tag> TAG_NATU
352 %token <tag> TAG_NCHI
353 %token <tag> TAG_NICK
355 %token <tag> TAG_NOTE
356 %token <tag> TAG_NPFX
357 %token <tag> TAG_NSFX
358 %token <tag> TAG_OBJE
359 %token <tag> TAG_OCCU
360 %token <tag> TAG_ORDI
361 %token <tag> TAG_ORDN
362 %token <tag> TAG_PAGE
363 %token <tag> TAG_PEDI
364 %token <tag> TAG_PHON
365 %token <tag> TAG_PLAC
366 %token <tag> TAG_POST
367 %token <tag> TAG_PROB
368 %token <tag> TAG_PROP
369 %token <tag> TAG_PUBL
370 %token <tag> TAG_QUAY
371 %token <tag> TAG_REFN
372 %token <tag> TAG_RELA
373 %token <tag> TAG_RELI
374 %token <tag> TAG_REPO
375 %token <tag> TAG_RESI
376 %token <tag> TAG_RESN
377 %token <tag> TAG_RETI
380 %token <tag> TAG_ROLE
382 %token <tag> TAG_SLGC
383 %token <tag> TAG_SLGS
384 %token <tag> TAG_SOUR
385 %token <tag> TAG_SPFX
387 %token <tag> TAG_STAE
388 %token <tag> TAG_STAT
389 %token <tag> TAG_SUBM
390 %token <tag> TAG_SUBN
391 %token <tag> TAG_SURN
392 %token <tag> TAG_TEMP
393 %token <tag> TAG_TEXT
394 %token <tag> TAG_TIME
395 %token <tag> TAG_TITL
396 %token <tag> TAG_TRLR
397 %token <tag> TAG_TYPE
398 %token <tag> TAG_VERS
399 %token <tag> TAG_WIFE
400 %token <tag> TAG_WILL
402 %type <tag> anystdtag
403 %type <tag> anytoptag
404 %type <tag> fam_event_tag
405 %type <tag> indiv_attr_tag
406 %type <tag> indiv_birt_tag
407 %type <tag> indiv_gen_tag
408 %type <tag> lio_bapl_tag
409 %type <string> line_item
410 %type <string> mand_line_item
411 %type <string> mand_pointer
412 %type <string> note_line_item
413 %type <string> anychar
414 %type <string> opt_xref
415 %type <string> opt_value
416 %type <string> opt_line_item
417 %type <ctxt> head_sect
421 file : head_sect records trlr_sect
422 { if (fail == 1) YYABORT; }
425 records : /* empty */
440 /*********************************************************************/
442 /*********************************************************************/
443 head_sect : OPEN DELIM TAG_HEAD
444 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
446 NULL, GEDCOM_MAKE_NULL(val2));
447 START(HEAD, $<ctxt>$) }
449 { if (compat_mode(C_FTREE)) {
450 CHECK3(SOUR, GEDC, CHAR);
451 compat_generate_submitter_link($<ctxt>4);
454 CHECK4(SOUR, SUBM, GEDC, CHAR)
457 { end_record(REC_HEAD, $<ctxt>4);
458 if (compat_mode(C_FTREE))
459 compat_generate_submitter();
463 head_subs : /* empty */
467 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
468 | head_dest_sect { OCCUR2(DEST, 0, 1) }
469 | head_date_sect { OCCUR2(DATE, 0, 1) }
470 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
471 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
472 | head_file_sect { OCCUR2(FILE, 0, 1) }
473 | head_copr_sect { OCCUR2(COPR, 0, 1) }
474 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
475 | head_char_sect { OCCUR2(CHAR, 1, 1) }
476 | head_lang_sect { OCCUR2(LANG, 0, 1) }
477 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
478 | head_note_sect { OCCUR2(NOTE, 0, 1) }
483 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
484 { set_compatibility($4);
485 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
487 GEDCOM_MAKE_STRING(val1, $4));
488 START(SOUR, $<ctxt>$)
493 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
496 head_sour_subs : /* empty */
497 | head_sour_subs head_sour_sub
500 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
501 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
502 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
503 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
507 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
508 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
510 GEDCOM_MAKE_STRING(val1, $4));
511 START(VERS, $<ctxt>$)
516 { end_element(ELT_HEAD_SOUR_VERS,
517 PARENT, $<ctxt>5, NULL);
520 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
521 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
523 GEDCOM_MAKE_STRING(val1, $4));
524 START(NAME, $<ctxt>$)
529 { end_element(ELT_HEAD_SOUR_NAME,
530 PARENT, $<ctxt>5, NULL);
533 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
534 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
536 GEDCOM_MAKE_STRING(val1, $4));
537 START(CORP, $<ctxt>$)
542 { end_element(ELT_HEAD_SOUR_CORP,
543 PARENT, $<ctxt>5, NULL);
547 head_sour_corp_subs : /* empty */
548 | head_sour_corp_subs head_sour_corp_sub
551 head_sour_corp_sub : addr_struc_sub /* 0:1 */
555 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
556 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
558 GEDCOM_MAKE_STRING(val1, $4));
559 START(DATA, $<ctxt>$)
564 { end_element(ELT_HEAD_SOUR_DATA,
565 PARENT, $<ctxt>5, NULL);
569 head_sour_data_subs : /* empty */
570 | head_sour_data_subs head_sour_data_sub
573 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
574 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
578 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
579 { struct date_value dv = gedcom_parse_date($4);
581 = start_element(ELT_HEAD_SOUR_DATA_DATE,
583 GEDCOM_MAKE_DATE(val1, dv));
584 START(DATE, $<ctxt>$)
589 { end_element(ELT_HEAD_SOUR_DATA_DATE,
590 PARENT, $<ctxt>5, NULL);
593 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
595 = start_element(ELT_HEAD_SOUR_DATA_COPR,
597 GEDCOM_MAKE_STRING(val1, $4));
598 START(COPR, $<ctxt>$)
603 { end_element(ELT_HEAD_SOUR_DATA_COPR,
604 PARENT, $<ctxt>5, NULL);
609 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
610 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
612 GEDCOM_MAKE_STRING(val1, $4));
613 START(DEST, $<ctxt>$)
618 { end_element(ELT_HEAD_DEST,
619 PARENT, $<ctxt>5, NULL);
624 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
625 { struct date_value dv = gedcom_parse_date($4);
626 $<ctxt>$ = start_element(ELT_HEAD_DATE,
628 GEDCOM_MAKE_DATE(val1, dv));
629 START(DATE, $<ctxt>$)
634 { end_element(ELT_HEAD_DATE,
635 PARENT, $<ctxt>5, NULL);
639 head_date_subs : /* empty */
640 | head_date_subs head_date_sub
643 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
647 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
648 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
650 GEDCOM_MAKE_STRING(val1, $4));
651 START(TIME, $<ctxt>$)
656 { end_element(ELT_HEAD_DATE_TIME,
657 PARENT, $<ctxt>5, NULL);
662 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
663 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
665 if (xr == NULL) HANDLE_ERROR;
666 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
668 GEDCOM_MAKE_XREF_PTR(val1, xr));
669 START(SUBM, $<ctxt>$)
674 { end_element(ELT_HEAD_SUBM,
675 PARENT, $<ctxt>5, NULL);
679 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
680 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
682 if (xr == NULL) HANDLE_ERROR;
683 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
685 GEDCOM_MAKE_XREF_PTR(val1, xr));
686 START(SUBN, $<ctxt>$)
691 { end_element(ELT_HEAD_SUBN,
692 PARENT, $<ctxt>5, NULL);
696 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
697 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
699 GEDCOM_MAKE_STRING(val1, $4));
700 START(FILE, $<ctxt>$)
705 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
709 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
710 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
712 GEDCOM_MAKE_STRING(val1, $4));
713 START(COPR, $<ctxt>$)
718 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
722 head_gedc_sect : OPEN DELIM TAG_GEDC
723 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
724 PARENT, $1, $3, NULL,
725 GEDCOM_MAKE_NULL(val1));
726 START(GEDC, $<ctxt>$)
729 { CHECK2(VERS, FORM) }
731 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
735 head_gedc_subs : /* empty */
736 | head_gedc_subs head_gedc_sub
739 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
740 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
743 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
744 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
746 GEDCOM_MAKE_STRING(val1, $4));
747 START(VERS, $<ctxt>$)
752 { end_element(ELT_HEAD_GEDC_VERS,
753 PARENT, $<ctxt>5, NULL);
756 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
757 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
759 GEDCOM_MAKE_STRING(val1, $4));
760 START(FORM, $<ctxt>$)
765 { end_element(ELT_HEAD_GEDC_FORM,
766 PARENT, $<ctxt>5, NULL);
771 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
772 { /* Don't allow to continue if conversion context couldn't
774 if (open_conv_to_internal($4) == 0) YYABORT;
775 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
777 GEDCOM_MAKE_STRING(val1, $4));
778 START(CHAR, $<ctxt>$)
783 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
787 head_char_subs : /* empty */
788 | head_char_subs head_char_sub
791 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
794 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
795 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
797 GEDCOM_MAKE_STRING(val1, $4));
798 START(VERS, $<ctxt>$)
803 { end_element(ELT_HEAD_CHAR_VERS,
804 PARENT, $<ctxt>5, NULL);
809 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
810 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
812 GEDCOM_MAKE_STRING(val1, $4));
813 START(LANG, $<ctxt>$)
818 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
822 head_plac_sect : OPEN DELIM TAG_PLAC
823 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
824 PARENT, $1, $3, NULL,
825 GEDCOM_MAKE_NULL(val1));
826 START(PLAC, $<ctxt>$)
831 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
835 head_plac_subs : /* empty */
836 | head_plac_subs head_plac_sub
839 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
842 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
843 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
845 GEDCOM_MAKE_STRING(val1, $4));
846 START(FORM, $<ctxt>$)
851 { end_element(ELT_HEAD_PLAC_FORM,
852 PARENT, $<ctxt>5, NULL);
857 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
858 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
860 GEDCOM_MAKE_STRING(val1, $4));
861 START(NOTE, $<ctxt>$)
866 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
870 head_note_subs : /* empty */
871 | head_note_subs head_note_sub
874 head_note_sub : continuation_sub /* 0:M */
878 /*********************************************************************/
880 /*********************************************************************/
881 /* Don't need callbacks here, there is no information... */
882 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
885 /*********************************************************************/
886 /**** Family record ****/
887 /*********************************************************************/
888 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
889 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
891 if (xr == NULL) HANDLE_ERROR;
892 $<ctxt>$ = start_record(REC_FAM,
893 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
895 NULL, GEDCOM_MAKE_NULL(val2));
896 START(FAM, $<ctxt>$) }
900 { end_record(REC_FAM, $<ctxt>6); }
903 fam_subs : /* empty */
907 fam_sub : fam_event_struc_sub /* 0:M */
908 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
909 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
910 | fam_chil_sect /* 0:M */
911 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
912 | fam_subm_sect /* 0:M */
913 | lds_spouse_seal_sub /* 0:M */
914 | source_cit_sub /* 0:M */
915 | multim_link_sub /* 0:M */
916 | note_struc_sub /* 0:M */
917 | ident_struc_sub /* 0:1 */
918 | change_date_sub /* 0:1 */
923 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
924 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
926 if (xr == NULL) HANDLE_ERROR;
927 $<ctxt>$ = start_element(ELT_FAM_HUSB,
929 GEDCOM_MAKE_XREF_PTR(val1, xr));
930 START(HUSB, $<ctxt>$)
935 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
940 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
941 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
943 if (xr == NULL) HANDLE_ERROR;
944 $<ctxt>$ = start_element(ELT_FAM_WIFE,
946 GEDCOM_MAKE_XREF_PTR(val1, xr));
947 START(WIFE, $<ctxt>$)
952 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
957 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
958 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
960 if (xr == NULL) HANDLE_ERROR;
961 $<ctxt>$ = start_element(ELT_FAM_CHIL,
963 GEDCOM_MAKE_XREF_PTR(val1, xr));
964 START(CHIL, $<ctxt>$)
969 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
974 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
975 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
977 GEDCOM_MAKE_STRING(val1, $4));
978 START(NCHI, $<ctxt>$)
983 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
988 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
989 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
991 if (xr == NULL) HANDLE_ERROR;
992 $<ctxt>$ = start_element(ELT_FAM_SUBM,
994 GEDCOM_MAKE_XREF_PTR(val1, xr));
995 START(SUBM, $<ctxt>$)
1000 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1004 /*********************************************************************/
1005 /**** Individual record ****/
1006 /*********************************************************************/
1007 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1008 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1010 if (xr == NULL) HANDLE_ERROR;
1011 $<ctxt>$ = start_record(REC_INDI,
1012 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1013 NULL, GEDCOM_MAKE_NULL(val2));
1014 START(INDI, $<ctxt>$) }
1018 { end_record(REC_INDI, $<ctxt>6); }
1021 indi_subs : /* empty */
1022 | indi_subs indi_sub
1025 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1026 | pers_name_struc_sub /* 0:M */
1027 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1028 | indiv_even_struc_sub /* 0:M */
1029 | indiv_attr_struc_sub /* 0:M */
1030 | lds_indiv_ord_sub /* 0:M */
1031 | chi_fam_link_sub /* 0:M */
1032 | spou_fam_link_sub /* 0:M */
1033 | indi_subm_sect /* 0:M */
1034 | assoc_struc_sub /* 0:M */
1035 | indi_alia_sect /* 0:M */
1036 | indi_anci_sect /* 0:M */
1037 | indi_desi_sect /* 0:M */
1038 | source_cit_sub /* 0:M */
1039 | multim_link_sub /* 0:M */
1040 | note_struc_sub /* 0:M */
1041 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1042 | indi_afn_sect /* 0:M */
1043 | ident_struc_sub /* 0:1 */
1044 | change_date_sub /* 0:1 */
1045 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1046 INVALID_TAG("ADDR");
1052 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1053 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1055 GEDCOM_MAKE_STRING(val1, $4));
1056 START(RESN, $<ctxt>$)
1061 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1066 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1067 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1069 GEDCOM_MAKE_STRING(val1, $4));
1070 START(SEX, $<ctxt>$)
1075 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1080 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1081 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1083 if (xr == NULL) HANDLE_ERROR;
1084 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1086 GEDCOM_MAKE_XREF_PTR(val1, xr));
1087 START(SUBM, $<ctxt>$)
1092 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1097 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1098 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1100 if (xr == NULL) HANDLE_ERROR;
1101 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1103 GEDCOM_MAKE_XREF_PTR(val1, xr));
1104 START(ALIA, $<ctxt>$)
1109 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1114 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1115 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1117 if (xr == NULL) HANDLE_ERROR;
1118 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1120 GEDCOM_MAKE_XREF_PTR(val1, xr));
1121 START(ANCI, $<ctxt>$)
1126 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1131 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1132 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1134 if (xr == NULL) HANDLE_ERROR;
1135 $<ctxt>$ = start_element(ELT_INDI_DESI,
1137 GEDCOM_MAKE_XREF_PTR(val1, xr));
1138 START(DESI, $<ctxt>$)
1143 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1148 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1149 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1151 GEDCOM_MAKE_STRING(val1, $4));
1152 START(RFN, $<ctxt>$)
1157 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1162 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1163 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1165 GEDCOM_MAKE_STRING(val1, $4));
1166 START(AFN, $<ctxt>$)
1171 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1175 /* INDI.ADDR (Only for 'ftree' compatibility) */
1176 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1177 { if (compat_mode(C_FTREE)) {
1178 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1181 = start_element(ELT_SUB_ADDR,
1182 par, $1 + 1, $3, $4,
1183 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1184 START(ADDR, $<ctxt>$);
1186 else { START(ADDR, NULL) }
1191 { if (compat_mode(C_FTREE)) {
1192 Gedcom_ctxt par = PARENT;
1193 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1195 compat_generate_resi_end(PARENT, par);
1199 ftree_addr_subs : /* empty */
1200 | ftree_addr_subs ftree_addr_sub
1203 ftree_addr_sub : continuation_sub
1204 | ftree_addr_phon_sect
1208 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1210 = start_element(ELT_SUB_PHON,
1211 GRANDPARENT(1), $1, $3, $4,
1212 GEDCOM_MAKE_STRING(val1, $4));
1213 START(PHON, $<ctxt>$)
1218 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1223 /*********************************************************************/
1224 /**** Multimedia record ****/
1225 /*********************************************************************/
1226 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1227 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1229 if (xr == NULL) HANDLE_ERROR;
1230 $<ctxt>$ = start_record(REC_OBJE,
1231 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1232 NULL, GEDCOM_MAKE_NULL(val2));
1233 START(OBJE, $<ctxt>$) }
1235 { CHECK2(FORM, BLOB) }
1237 { end_record(REC_OBJE, $<ctxt>6); }
1240 obje_subs : /* empty */
1241 | obje_subs obje_sub
1244 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1245 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1246 | note_struc_sub /* 0:M */
1247 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1248 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1249 | ident_struc_sub /* 0:1 */
1250 | change_date_sub /* 0:1 */
1255 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1256 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1258 GEDCOM_MAKE_STRING(val1, $4));
1259 START(FORM, $<ctxt>$)
1264 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1269 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1270 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1272 GEDCOM_MAKE_STRING(val1, $4));
1273 START(TITL, $<ctxt>$)
1278 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1283 obje_blob_sect : OPEN DELIM TAG_BLOB
1284 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1285 PARENT, $1, $3, NULL,
1286 GEDCOM_MAKE_NULL(val1));
1287 START(BLOB, $<ctxt>$)
1292 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1296 obje_blob_subs : /* empty */
1297 | obje_blob_subs obje_blob_sub
1300 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1304 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1305 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1307 GEDCOM_MAKE_STRING(val1, $4));
1308 START(CONT, $<ctxt>$)
1313 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1319 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1320 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1322 if (xr == NULL) HANDLE_ERROR;
1323 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1325 GEDCOM_MAKE_XREF_PTR(val1, xr));
1326 START(OBJE, $<ctxt>$)
1331 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1335 /*********************************************************************/
1336 /**** Note record ****/
1337 /*********************************************************************/
1338 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1339 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1341 if (xr == NULL) HANDLE_ERROR;
1342 $<ctxt>$ = start_record(REC_NOTE,
1343 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1344 $6, GEDCOM_MAKE_STRING(val2, $6));
1345 START(NOTE, $<ctxt>$) }
1349 { end_record(REC_NOTE, $<ctxt>7); }
1352 note_line_item : /* empty */
1353 { if (!compat_mode(C_FTREE)) {
1354 gedcom_error(_("Missing value")); YYERROR;
1361 { gedcom_debug_print("==Val: %s==", $2);
1365 note_subs : /* empty */
1366 | note_subs note_sub
1369 note_sub : continuation_sub /* 0:M */
1370 | source_cit_sub /* 0:M */
1371 | ident_struc_sub /* 0:1 */
1372 | change_date_sub /* 0:1 */
1376 /*********************************************************************/
1377 /**** Repository record ****/
1378 /*********************************************************************/
1379 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1380 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1382 if (xr == NULL) HANDLE_ERROR;
1383 $<ctxt>$ = start_record(REC_REPO,
1384 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1385 NULL, GEDCOM_MAKE_NULL(val2));
1386 START(REPO, $<ctxt>$) }
1390 { end_record(REC_REPO, $<ctxt>6); }
1393 repo_subs : /* empty */
1394 | repo_subs repo_sub
1397 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1398 | addr_struc_sub /* 0:1 */
1399 | note_struc_sub /* 0:M */
1400 | ident_struc_sub /* 0:1 */
1401 | change_date_sub /* 0:1 */
1406 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1407 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1409 GEDCOM_MAKE_STRING(val1, $4));
1410 START(NAME, $<ctxt>$)
1415 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1419 /*********************************************************************/
1420 /**** Source record ****/
1421 /*********************************************************************/
1422 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1423 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1425 if (xr == NULL) HANDLE_ERROR;
1426 $<ctxt>$ = start_record(REC_SOUR,
1427 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1428 NULL, GEDCOM_MAKE_NULL(val2));
1429 START(SOUR, $<ctxt>$) }
1433 { end_record(REC_SOUR, $<ctxt>6); }
1436 sour_subs : /* empty */
1437 | sour_subs sour_sub
1440 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1441 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1442 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1443 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1444 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1445 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1446 | source_repos_cit_sub /* 0:1 */
1447 | multim_link_sub /* 0:M */
1448 | note_struc_sub /* 0:M */
1449 | ident_struc_sub /* 0:1 */
1450 | change_date_sub /* 0:1 */
1455 sour_data_sect : OPEN DELIM TAG_DATA
1456 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1457 PARENT, $1, $3, NULL,
1458 GEDCOM_MAKE_NULL(val1));
1459 START(DATA, $<ctxt>$)
1464 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1468 sour_data_subs : /* empty */
1469 | sour_data_subs sour_data_sub
1472 sour_data_sub : sour_data_even_sect /* 0:M */
1473 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1474 | note_struc_sub /* 0:M */
1478 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1479 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1481 GEDCOM_MAKE_STRING(val1, $4));
1482 START(EVEN, $<ctxt>$)
1487 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1492 sour_data_even_subs : /* empty */
1493 | sour_data_even_subs sour_data_even_sub
1496 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1497 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1501 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1502 { struct date_value dv = gedcom_parse_date($4);
1504 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1506 GEDCOM_MAKE_DATE(val1, dv));
1507 START(DATE, $<ctxt>$)
1512 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1517 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1519 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1521 GEDCOM_MAKE_STRING(val1, $4));
1522 START(PLAC, $<ctxt>$)
1527 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1532 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1533 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1535 GEDCOM_MAKE_STRING(val1, $4));
1536 START(AGNC, $<ctxt>$)
1541 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1547 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1548 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1550 GEDCOM_MAKE_STRING(val1, $4));
1551 START(AUTH, $<ctxt>$)
1556 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1560 sour_auth_subs : /* empty */
1561 | sour_auth_subs sour_auth_sub
1564 sour_auth_sub : continuation_sub /* 0:M */
1569 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1570 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1572 GEDCOM_MAKE_STRING(val1, $4));
1573 START(TITL, $<ctxt>$)
1578 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1582 sour_titl_subs : /* empty */
1583 | sour_titl_subs sour_titl_sub
1586 sour_titl_sub : continuation_sub /* 0:M */
1591 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1592 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1594 GEDCOM_MAKE_STRING(val1, $4));
1595 START(ABBR, $<ctxt>$)
1600 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1605 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1606 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1608 GEDCOM_MAKE_STRING(val1, $4));
1609 START(PUBL, $<ctxt>$)
1614 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1618 sour_publ_subs : /* empty */
1619 | sour_publ_subs sour_publ_sub
1622 sour_publ_sub : continuation_sub /* 0:M */
1627 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1628 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1630 GEDCOM_MAKE_STRING(val1, $4));
1631 START(TEXT, $<ctxt>$)
1636 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1640 sour_text_subs : /* empty */
1641 | sour_text_subs sour_text_sub
1644 sour_text_sub : continuation_sub /* 0:M */
1648 /*********************************************************************/
1649 /**** Submission record ****/
1650 /*********************************************************************/
1651 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1652 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1654 if (xr == NULL) HANDLE_ERROR;
1655 $<ctxt>$ = start_record(REC_SUBN,
1656 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1657 NULL, GEDCOM_MAKE_NULL(val2));
1658 START(SUBN, $<ctxt>$) }
1662 { end_record(REC_SUBN, $<ctxt>6); }
1665 subn_subs : /* empty */
1666 | subn_subs subn_sub
1669 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1670 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1671 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1672 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1673 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1674 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1675 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1680 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1681 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1683 if (xr == NULL) HANDLE_ERROR;
1684 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1686 GEDCOM_MAKE_XREF_PTR(val1, xr));
1687 START(SUBM, $<ctxt>$)
1692 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1697 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1698 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1700 GEDCOM_MAKE_STRING(val1, $4));
1701 START(FAMF, $<ctxt>$)
1706 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1711 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1712 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1714 GEDCOM_MAKE_STRING(val1, $4));
1715 START(TEMP, $<ctxt>$)
1720 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1725 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1726 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1728 GEDCOM_MAKE_STRING(val1, $4));
1729 START(ANCE, $<ctxt>$)
1734 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1739 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1740 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1742 GEDCOM_MAKE_STRING(val1, $4));
1743 START(DESC, $<ctxt>$)
1748 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1753 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1754 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1756 GEDCOM_MAKE_STRING(val1, $4));
1757 START(ORDI, $<ctxt>$)
1762 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1767 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1768 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1770 GEDCOM_MAKE_STRING(val1, $4));
1771 START(RIN, $<ctxt>$)
1776 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1780 /*********************************************************************/
1781 /**** Submitter record ****/
1782 /*********************************************************************/
1783 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1784 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1786 if (xr == NULL) HANDLE_ERROR;
1787 $<ctxt>$ = start_record(REC_SUBM,
1788 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1789 NULL, GEDCOM_MAKE_NULL(val2));
1790 START(SUBM, $<ctxt>$) }
1794 { end_record(REC_SUBM, $<ctxt>6); }
1797 subm_subs : /* empty */
1798 | subm_subs subm_sub
1801 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1802 | addr_struc_sub /* 0:1 */
1803 | multim_link_sub /* 0:M */
1804 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1805 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1806 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1807 | change_date_sub /* 0:1 */
1812 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1813 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1815 GEDCOM_MAKE_STRING(val1, $4));
1816 START(NAME, $<ctxt>$)
1821 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1826 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1827 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1829 GEDCOM_MAKE_STRING(val1, $4));
1830 START(LANG, $<ctxt>$)
1835 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1840 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1841 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1843 GEDCOM_MAKE_STRING(val1, $4));
1844 START(RFN, $<ctxt>$)
1849 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1854 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1855 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1857 GEDCOM_MAKE_STRING(val1, $4));
1858 START(RIN, $<ctxt>$)
1863 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1867 /*********************************************************************/
1868 /**** Substructures ****/
1869 /*********************************************************************/
1871 /* ADDRESS STRUCTURE */
1872 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1873 | phon_sect { OCCUR2(PHON, 0, 3) }
1876 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1877 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1879 GEDCOM_MAKE_STRING(val1, $4));
1880 START(ADDR, $<ctxt>$)
1885 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1889 addr_subs : /* empty */
1890 | addr_subs addr_sub
1893 addr_sub : addr_cont_sect /* 0:M */
1894 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1895 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1896 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1897 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1898 | addr_post_sect { OCCUR2(POST, 0, 1) }
1899 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1903 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1904 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1906 GEDCOM_MAKE_STRING(val1, $4));
1907 START(CONT, $<ctxt>$)
1912 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1915 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1916 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1918 GEDCOM_MAKE_STRING(val1, $4));
1919 START(ADR1, $<ctxt>$)
1924 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1927 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1928 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1930 GEDCOM_MAKE_STRING(val1, $4));
1931 START(ADR2, $<ctxt>$)
1936 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1939 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1940 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1942 GEDCOM_MAKE_STRING(val1, $4));
1943 START(CITY, $<ctxt>$)
1948 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1951 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1952 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1954 GEDCOM_MAKE_STRING(val1, $4));
1955 START(STAE, $<ctxt>$)
1960 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1963 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1964 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1966 GEDCOM_MAKE_STRING(val1, $4));
1967 START(POST, $<ctxt>$)
1972 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1975 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1976 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1978 GEDCOM_MAKE_STRING(val1, $4));
1979 START(CTRY, $<ctxt>$)
1984 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1988 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1989 { $<ctxt>$ = start_element(ELT_SUB_PHON,
1991 GEDCOM_MAKE_STRING(val1, $4));
1992 START(PHON, $<ctxt>$)
1997 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
2001 /* ASSOCIATION STRUCTURE */
2002 assoc_struc_sub : asso_sect /* 0:M */
2005 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2006 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2008 if (xr == NULL) HANDLE_ERROR;
2009 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2011 GEDCOM_MAKE_XREF_PTR(val1, xr));
2012 START(ASSO, $<ctxt>$)
2015 { CHECK2(TYPE,RELA) }
2017 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2021 asso_subs : /* empty */
2022 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2023 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2029 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2030 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2032 GEDCOM_MAKE_STRING(val1, $4));
2033 START(TYPE, $<ctxt>$)
2038 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2042 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2043 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2045 GEDCOM_MAKE_STRING(val1, $4));
2046 START(RELA, $<ctxt>$)
2051 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2056 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2059 change_date_chan_sect : OPEN DELIM TAG_CHAN
2060 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2061 PARENT, $1, $3, NULL,
2062 GEDCOM_MAKE_NULL(val1));
2063 START(CHAN, $<ctxt>$)
2065 change_date_chan_subs
2068 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2072 change_date_chan_subs : /* empty */
2073 | change_date_chan_subs change_date_chan_sub
2076 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2081 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2082 { struct date_value dv = gedcom_parse_date($4);
2083 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2085 GEDCOM_MAKE_DATE(val1, dv));
2086 START(DATE, $<ctxt>$) }
2087 change_date_date_subs
2090 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2095 change_date_date_subs : /* empty */
2096 | change_date_date_subs change_date_date_sub
2099 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2103 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2105 = start_element(ELT_SUB_CHAN_TIME,
2107 GEDCOM_MAKE_STRING(val1, $4));
2108 START(TIME, $<ctxt>$)
2113 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2118 /* CHILD TO FAMILY LINK */
2119 chi_fam_link_sub : famc_sect /* 0:M */
2122 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2123 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2125 if (xr == NULL) HANDLE_ERROR;
2126 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2128 GEDCOM_MAKE_XREF_PTR(val1, xr));
2129 START(FAMC, $<ctxt>$)
2134 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2138 famc_subs : /* empty */
2139 | famc_subs famc_sub
2142 famc_sub : famc_pedi_sect /* 0:M */
2147 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2148 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2150 GEDCOM_MAKE_STRING(val1, $4));
2151 START(PEDI, $<ctxt>$)
2156 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2160 /* CONTINUATION SUBSECTIONS */
2161 continuation_sub : cont_sect /* 0:M */
2162 | conc_sect /* 0:M */
2165 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2166 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2168 GEDCOM_MAKE_STRING(val1, $4));
2169 START(CONT, $<ctxt>$)
2174 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2178 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2179 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2181 GEDCOM_MAKE_STRING(val1, $4));
2182 START(CONC, $<ctxt>$)
2187 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2192 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2193 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2196 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2197 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2198 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2204 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2206 = start_element(ELT_SUB_EVT_TYPE,
2208 GEDCOM_MAKE_STRING(val1, $4));
2209 START(TYPE, $<ctxt>$)
2214 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2218 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2219 { struct date_value dv = gedcom_parse_date($4);
2221 = start_element(ELT_SUB_EVT_DATE,
2223 GEDCOM_MAKE_DATE(val1, dv));
2224 START(DATE, $<ctxt>$)
2229 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2233 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2235 = start_element(ELT_SUB_EVT_AGE,
2237 GEDCOM_MAKE_STRING(val1, $4));
2238 START(AGE, $<ctxt>$)
2243 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2247 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2249 = start_element(ELT_SUB_EVT_AGNC,
2251 GEDCOM_MAKE_STRING(val1, $4));
2252 START(AGNC, $<ctxt>$)
2257 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2261 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2263 = start_element(ELT_SUB_EVT_CAUS,
2265 GEDCOM_MAKE_STRING(val1, $4));
2266 START(CAUS, $<ctxt>$)
2271 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2276 /* FAMILY EVENT STRUCTURE */
2277 fam_event_struc_sub : fam_event_sect
2278 | fam_gen_even_sect /* 0:M */
2281 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2283 = start_element(ELT_SUB_FAM_EVT,
2285 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2291 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2295 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2296 | TAG_CENS { $$ = $1; START1(CENS) }
2297 | TAG_DIV { $$ = $1; START1(DIV) }
2298 | TAG_DIVF { $$ = $1; START1(DIVF) }
2299 | TAG_ENGA { $$ = $1; START1(ENGA) }
2300 | TAG_MARR { $$ = $1; START1(MARR) }
2301 | TAG_MARB { $$ = $1; START1(MARB) }
2302 | TAG_MARC { $$ = $1; START1(MARC) }
2303 | TAG_MARL { $$ = $1; START1(MARL) }
2304 | TAG_MARS { $$ = $1; START1(MARS) }
2307 fam_event_subs : /* empty */
2308 | fam_event_subs fam_event_sub
2311 fam_event_sub : event_detail_sub
2312 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2313 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2317 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2318 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2319 PARENT, $1, $3, NULL,
2320 GEDCOM_MAKE_NULL(val1));
2321 START(HUSB, $<ctxt>$)
2326 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2331 fam_even_husb_subs : /* empty */
2332 | fam_even_husb_subs fam_even_husb_sub
2335 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2339 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2340 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2342 GEDCOM_MAKE_STRING(val1, $4));
2343 START(AGE, $<ctxt>$)
2348 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2353 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2354 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2355 PARENT, $1, $3, NULL,
2356 GEDCOM_MAKE_NULL(val1));
2357 START(WIFE, $<ctxt>$)
2362 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2367 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2368 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2369 PARENT, $1, $3, NULL,
2370 GEDCOM_MAKE_NULL(val1));
2371 START(EVEN, $<ctxt>$)
2376 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2381 fam_gen_even_subs : /* empty */
2382 | fam_gen_even_subs fam_gen_even_sub
2385 fam_gen_even_sub : event_detail_sub
2386 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2387 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2391 /* IDENTIFICATION STRUCTURE */
2392 ident_struc_sub : ident_refn_sect /* 0:M */
2393 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2396 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2397 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2399 GEDCOM_MAKE_STRING(val1, $4));
2400 START(REFN, $<ctxt>$)
2405 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2410 ident_refn_subs : /* empty */
2411 | ident_refn_subs ident_refn_sub
2414 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2418 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2420 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2422 GEDCOM_MAKE_STRING(val1, $4));
2423 START(TYPE, $<ctxt>$)
2428 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2433 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2434 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2436 GEDCOM_MAKE_STRING(val1, $4));
2437 START(RIN, $<ctxt>$)
2442 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2447 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2448 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2449 | indiv_resi_sect /* 0:M */
2452 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2453 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2455 GEDCOM_MAKE_STRING(val1, $4));
2458 indiv_attr_event_subs
2461 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2464 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2465 | TAG_DSCR { $$ = $1; START1(DSCR) }
2466 | TAG_EDUC { $$ = $1; START1(EDUC) }
2467 | TAG_IDNO { $$ = $1; START1(IDNO) }
2468 | TAG_NATI { $$ = $1; START1(NATI) }
2469 | TAG_NCHI { $$ = $1; START1(NCHI) }
2470 | TAG_NMR { $$ = $1; START1(NMR) }
2471 | TAG_OCCU { $$ = $1; START1(OCCU) }
2472 | TAG_PROP { $$ = $1; START1(PROP) }
2473 | TAG_RELI { $$ = $1; START1(RELI) }
2474 | TAG_SSN { $$ = $1; START1(SSN) }
2475 | TAG_TITL { $$ = $1; START1(TITL) }
2477 indiv_resi_sect : OPEN DELIM TAG_RESI
2478 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2479 PARENT, $1, $3, NULL,
2480 GEDCOM_MAKE_NULL(val1));
2481 START(RESI, $<ctxt>$)
2483 indiv_attr_event_subs
2486 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2490 indiv_attr_event_subs : /* empty */
2491 | indiv_attr_event_subs indiv_attr_event_sub
2494 indiv_attr_event_sub : event_detail_sub
2498 /* INDIVIDUAL EVENT STRUCTURE */
2499 indiv_even_struc_sub : indiv_birt_sect
2501 | indiv_adop_sect /* 0:M */
2502 | indiv_even_sect /* 0:M */
2505 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2507 = start_element(ELT_SUB_INDIV_BIRT,
2509 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2515 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2519 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2520 | TAG_CHR { $$ = $1; START1(CHR) }
2523 indiv_birt_subs : /* empty */
2524 | indiv_birt_subs indiv_birt_sub
2527 indiv_birt_sub : event_detail_sub
2528 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2532 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2533 { struct xref_value *xr = gedcom_parse_xref($4,
2536 if (xr == NULL) HANDLE_ERROR;
2538 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2540 GEDCOM_MAKE_XREF_PTR(val1, xr));
2541 START(FAMC, $<ctxt>$)
2546 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2551 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2553 = start_element(ELT_SUB_INDIV_GEN,
2555 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2561 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2565 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2566 | TAG_BURI { $$ = $1; START1(BURI) }
2567 | TAG_CREM { $$ = $1; START1(CREM) }
2568 | TAG_BAPM { $$ = $1; START1(BAPM) }
2569 | TAG_BARM { $$ = $1; START1(BARM) }
2570 | TAG_BASM { $$ = $1; START1(BASM) }
2571 | TAG_BLES { $$ = $1; START1(BLES) }
2572 | TAG_CHRA { $$ = $1; START1(CHRA) }
2573 | TAG_CONF { $$ = $1; START1(CONF) }
2574 | TAG_FCOM { $$ = $1; START1(FCOM) }
2575 | TAG_ORDN { $$ = $1; START1(ORDN) }
2576 | TAG_NATU { $$ = $1; START1(NATU) }
2577 | TAG_EMIG { $$ = $1; START1(EMIG) }
2578 | TAG_IMMI { $$ = $1; START1(IMMI) }
2579 | TAG_CENS { $$ = $1; START1(CENS) }
2580 | TAG_PROB { $$ = $1; START1(PROB) }
2581 | TAG_WILL { $$ = $1; START1(WILL) }
2582 | TAG_GRAD { $$ = $1; START1(GRAD) }
2583 | TAG_RETI { $$ = $1; START1(RETI) }
2586 indiv_gen_subs : /* empty */
2587 | indiv_gen_subs indiv_gen_sub
2590 indiv_gen_sub : event_detail_sub
2594 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2596 = start_element(ELT_SUB_INDIV_ADOP,
2598 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2599 START(ADOP, $<ctxt>$) }
2603 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2607 indiv_adop_subs : /* empty */
2608 | indiv_adop_subs indiv_adop_sub
2611 indiv_adop_sub : event_detail_sub
2612 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2616 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2617 { struct xref_value *xr = gedcom_parse_xref($4,
2620 if (xr == NULL) HANDLE_ERROR;
2622 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2624 GEDCOM_MAKE_XREF_PTR(val1, xr));
2625 START(FAMC, $<ctxt>$) }
2626 indiv_adop_famc_subs
2629 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2634 indiv_adop_famc_subs : /* empty */
2635 | indiv_adop_famc_subs indiv_adop_famc_sub
2638 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2642 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2644 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2646 GEDCOM_MAKE_STRING(val1, $4));
2647 START(ADOP, $<ctxt>$) }
2651 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2652 PARENT, $<ctxt>5, NULL);
2656 indiv_even_sect : OPEN DELIM TAG_EVEN
2657 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2658 PARENT, $1, $3, NULL,
2659 GEDCOM_MAKE_NULL(val1));
2660 START(EVEN, $<ctxt>$) }
2664 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2668 /* LDS INDIVIDUAL ORDINANCE */
2669 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2670 | lio_slgc_sect /* 0:M */
2673 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2674 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2675 PARENT, $1, $3, NULL,
2676 GEDCOM_MAKE_NULL(val1));
2682 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2686 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2687 | TAG_CONL { $$ = $1; START1(CONL) }
2688 | TAG_ENDL { $$ = $1; START1(ENDL) }
2691 lio_bapl_subs : /* empty */
2692 | lio_bapl_subs lio_bapl_sub
2695 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2696 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2697 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2698 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2704 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2705 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2707 GEDCOM_MAKE_STRING(val1, $4));
2708 START(STAT, $<ctxt>$)
2713 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2717 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2718 { struct date_value dv = gedcom_parse_date($4);
2719 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2721 GEDCOM_MAKE_DATE(val1, dv));
2722 START(DATE, $<ctxt>$)
2727 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2731 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2732 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2734 GEDCOM_MAKE_STRING(val1, $4));
2735 START(TEMP, $<ctxt>$)
2740 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2744 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2745 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2747 GEDCOM_MAKE_STRING(val1, $4));
2748 START(PLAC, $<ctxt>$)
2753 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2758 lio_slgc_sect : OPEN DELIM TAG_SLGC
2759 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2760 PARENT, $1, $3, NULL,
2761 GEDCOM_MAKE_NULL(val1));
2762 START(SLGC, $<ctxt>$)
2767 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2771 lio_slgc_subs : /* empty */
2772 | lio_slgc_subs lio_slgc_sub
2775 lio_slgc_sub : lio_bapl_sub
2776 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2779 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2780 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2782 if (xr == NULL) HANDLE_ERROR;
2784 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2786 GEDCOM_MAKE_XREF_PTR(val1, xr));
2787 START(FAMC, $<ctxt>$)
2792 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2797 /* LDS SPOUSE SEALING */
2798 lds_spouse_seal_sub : lss_slgs_sect
2801 lss_slgs_sect : OPEN DELIM TAG_SLGS
2802 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2803 PARENT, $1, $3, NULL,
2804 GEDCOM_MAKE_NULL(val1));
2805 START(SLGS, $<ctxt>$) }
2809 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2813 lss_slgs_subs : /* empty */
2814 | lss_slgs_subs lss_slgs_sub
2817 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2818 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2819 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2820 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2826 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2827 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2829 GEDCOM_MAKE_STRING(val1, $4));
2830 START(STAT, $<ctxt>$)
2835 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2839 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2840 { struct date_value dv = gedcom_parse_date($4);
2841 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2843 GEDCOM_MAKE_DATE(val1, dv));
2844 START(DATE, $<ctxt>$)
2849 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2853 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2854 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2856 GEDCOM_MAKE_STRING(val1, $4));
2857 START(TEMP, $<ctxt>$)
2862 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2866 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2867 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2869 GEDCOM_MAKE_STRING(val1, $4));
2870 START(PLAC, $<ctxt>$)
2875 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2880 /* MULTIMEDIA LINK */
2881 multim_link_sub : multim_obje_link_sect
2882 | multim_obje_emb_sect
2885 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2886 { struct xref_value *xr = gedcom_parse_xref($5,
2889 if (xr == NULL) HANDLE_ERROR;
2891 = start_element(ELT_SUB_MULTIM_OBJE,
2893 GEDCOM_MAKE_XREF_PTR(val1, xr));
2894 START(OBJE, $<ctxt>$)
2899 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2904 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2905 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2906 PARENT, $1, $3, NULL,
2907 GEDCOM_MAKE_NULL(val1));
2908 START(OBJE, $<ctxt>$)
2910 multim_obje_emb_subs
2911 { CHECK2(FORM,FILE) }
2913 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2918 multim_obje_emb_subs : /* empty */
2919 | multim_obje_emb_subs multim_obje_emb_sub
2922 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2923 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2924 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2929 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2931 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2933 GEDCOM_MAKE_STRING(val1, $4));
2934 START(FORM, $<ctxt>$)
2939 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2940 PARENT, $<ctxt>5, NULL);
2943 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2945 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2947 GEDCOM_MAKE_STRING(val1, $4));
2948 START(TITL, $<ctxt>$)
2953 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2954 PARENT, $<ctxt>5, NULL);
2957 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2959 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2961 GEDCOM_MAKE_STRING(val1, $4));
2962 START(FILE, $<ctxt>$)
2967 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2968 PARENT, $<ctxt>5, NULL);
2972 /* NOTE STRUCTURE */
2973 note_struc_sub : note_struc_link_sect /* 0:M */
2974 | note_struc_emb_sect /* 0:M */
2977 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2978 { struct xref_value *xr = gedcom_parse_xref($5,
2981 if (xr == NULL) HANDLE_ERROR;
2983 = start_element(ELT_SUB_NOTE,
2985 GEDCOM_MAKE_XREF_PTR(val1, xr));
2986 START(NOTE, $<ctxt>$)
2988 note_struc_link_subs
2991 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
2995 note_struc_link_subs : /* empty */
2996 | note_struc_link_subs note_struc_link_sub
2999 note_struc_link_sub : source_cit_sub
3003 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3005 = start_element(ELT_SUB_NOTE,
3007 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3008 START(NOTE, $<ctxt>$)
3013 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3017 note_struc_emb_subs : /* empty */
3018 | note_struc_emb_subs note_struc_emb_sub
3021 note_struc_emb_sub : continuation_sub
3026 /* PERSONAL NAME STRUCTURE */
3027 pers_name_struc_sub : pers_name_sect /* 0:M */
3030 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3031 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3033 GEDCOM_MAKE_STRING(val1, $4));
3034 START(NAME, $<ctxt>$)
3039 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3043 pers_name_subs : /* empty */
3044 | pers_name_subs pers_name_sub
3047 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3048 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3049 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3050 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3051 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3052 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3058 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3059 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3061 GEDCOM_MAKE_STRING(val1, $4));
3062 START(NPFX, $<ctxt>$)
3067 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3071 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3072 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3074 GEDCOM_MAKE_STRING(val1, $4));
3075 START(GIVN, $<ctxt>$)
3080 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3084 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3085 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3087 GEDCOM_MAKE_STRING(val1, $4));
3088 START(NICK, $<ctxt>$)
3093 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3097 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3098 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3100 GEDCOM_MAKE_STRING(val1, $4));
3101 START(SPFX, $<ctxt>$)
3106 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3110 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3111 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3113 GEDCOM_MAKE_STRING(val1, $4));
3114 START(SURN, $<ctxt>$)
3119 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3123 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3124 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3126 GEDCOM_MAKE_STRING(val1, $4));
3127 START(NSFX, $<ctxt>$)
3132 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3137 /* PLACE STRUCTURE */
3138 place_struc_sub : place_struc_plac_sect /* 0:M */
3141 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3143 = start_element(ELT_SUB_PLAC,
3145 GEDCOM_MAKE_STRING(val1, $4));
3146 START(PLAC, $<ctxt>$)
3148 place_struc_plac_subs
3151 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3155 place_struc_plac_subs : /* empty */
3156 | place_struc_plac_subs place_struc_plac_sub
3159 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3165 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3167 = start_element(ELT_SUB_PLAC_FORM,
3169 GEDCOM_MAKE_STRING(val1, $4));
3170 START(FORM, $<ctxt>$)
3175 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3180 /* SOURCE_CITATION */
3181 source_cit_sub : source_cit_link_sect /* 0:M */
3182 | source_cit_emb_sect /* 0:M */
3185 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3186 { struct xref_value *xr = gedcom_parse_xref($5,
3189 if (xr == NULL) HANDLE_ERROR;
3191 = start_element(ELT_SUB_SOUR,
3193 GEDCOM_MAKE_XREF_PTR(val1, xr));
3194 START(SOUR, $<ctxt>$)
3196 source_cit_link_subs
3199 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3203 source_cit_link_subs : /* empty */
3204 | source_cit_link_subs source_cit_link_sub
3207 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3208 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3209 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3210 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3216 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3218 = start_element(ELT_SUB_SOUR_PAGE,
3220 GEDCOM_MAKE_STRING(val1, $4));
3221 START(PAGE, $<ctxt>$)
3226 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3231 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3233 = start_element(ELT_SUB_SOUR_EVEN,
3235 GEDCOM_MAKE_STRING(val1, $4));
3236 START(EVEN, $<ctxt>$)
3238 source_cit_even_subs
3241 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3246 source_cit_even_subs : /* empty */
3247 | source_cit_even_subs source_cit_even_sub
3250 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3254 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3256 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3258 GEDCOM_MAKE_STRING(val1, $4));
3259 START(ROLE, $<ctxt>$)
3264 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3265 PARENT, $<ctxt>5, NULL);
3269 source_cit_data_sect : OPEN DELIM TAG_DATA
3270 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3271 PARENT, $1, $3, NULL,
3272 GEDCOM_MAKE_NULL(val1));
3273 START(DATA, $<ctxt>$)
3275 source_cit_data_subs
3278 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3283 source_cit_data_subs : /* empty */
3284 | source_cit_data_subs source_cit_data_sub
3287 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3288 | source_cit_text_sect /* 0:M */
3292 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3293 { struct date_value dv = gedcom_parse_date($4);
3295 = start_element(ELT_SUB_SOUR_DATA_DATE,
3297 GEDCOM_MAKE_DATE(val1, dv));
3298 START(DATE, $<ctxt>$)
3303 { end_element(ELT_SUB_SOUR_DATA_DATE,
3304 PARENT, $<ctxt>5, NULL);
3308 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3310 = start_element(ELT_SUB_SOUR_TEXT,
3312 GEDCOM_MAKE_STRING(val1, $4));
3313 START(TEXT, $<ctxt>$)
3315 source_cit_text_subs
3318 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3323 source_cit_text_subs : /* empty */
3324 | source_cit_text_subs source_cit_text_sub
3327 source_cit_text_sub : continuation_sub
3331 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3333 = start_element(ELT_SUB_SOUR_QUAY,
3335 GEDCOM_MAKE_STRING(val1, $4));
3336 START(QUAY, $<ctxt>$)
3341 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3346 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3347 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3349 GEDCOM_MAKE_STRING(val1, $4));
3350 START(SOUR, $<ctxt>$)
3355 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3359 source_cit_emb_subs : /* empty */
3360 | source_cit_emb_subs source_cit_emb_sub
3363 source_cit_emb_sub : continuation_sub
3364 | source_cit_text_sect /* 0:M */
3369 /* SOURCE REPOSITORY CITATION */
3370 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3373 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3374 { struct xref_value *xr
3375 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3376 if (xr == NULL) HANDLE_ERROR;
3378 = start_element(ELT_SUB_REPO,
3380 GEDCOM_MAKE_XREF_PTR(val1, xr));
3381 START(REPO, $<ctxt>$)
3383 source_repos_repo_subs
3386 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3390 source_repos_repo_subs : /* empty */
3391 | source_repos_repo_subs source_repos_repo_sub
3394 source_repos_repo_sub : note_struc_sub
3395 | caln_sect /* 0:M */
3399 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3400 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3402 GEDCOM_MAKE_STRING(val1, $4));
3403 START(CALN, $<ctxt>$)
3408 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3412 caln_subs : /* empty */
3413 | caln_subs caln_sub
3416 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3420 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3421 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3423 GEDCOM_MAKE_STRING(val1, $4));
3424 START(MEDI, $<ctxt>$)
3429 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3433 /* SPOUSE TO FAMILY LINK */
3434 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3437 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3438 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3440 if (xr == NULL) HANDLE_ERROR;
3442 = start_element(ELT_SUB_FAMS,
3444 GEDCOM_MAKE_XREF_PTR(val1, xr));
3445 START(FAMS, $<ctxt>$)
3450 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3454 spou_fam_fams_subs : /* empty */
3455 | spou_fam_fams_subs spou_fam_fams_sub
3458 spou_fam_fams_sub : note_struc_sub
3462 /*********************************************************************/
3464 /*********************************************************************/
3466 no_std_subs : /* empty */
3467 | no_std_subs no_std_sub
3470 no_std_sub : user_sect /* 0:M */
3472 | error error_subs CLOSE { HANDLE_ERROR }
3475 no_std_rec : user_rec /* 0:M */
3477 | error error_subs CLOSE { HANDLE_ERROR }
3480 user_rec : OPEN DELIM opt_xref USERTAG
3481 { if ($4.string[0] != '_') {
3482 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3488 { struct xref_value *xr = NULL;
3490 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3491 if (xr == NULL) HANDLE_ERROR;
3493 $<ctxt>$ = start_record(REC_USER,
3495 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3502 { end_record(REC_USER, $<ctxt>7); }
3504 user_sect : OPEN DELIM opt_xref USERTAG
3505 { if ($4.string[0] != '_') {
3506 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3512 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3513 START($4, $<ctxt>$);
3518 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3522 user_sects : /* empty */ { }
3523 | user_sects user_sect { }
3526 opt_xref : /* empty */ { $$ = NULL; }
3527 | POINTER DELIM { $$ = $1; }
3530 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3532 | DELIM POINTER { struct xref_value *xr
3533 = gedcom_parse_xref($2, XREF_USED,
3535 GEDCOM_MAKE_XREF_PTR(val2, xr);
3537 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3541 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3542 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3546 mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
3547 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3551 opt_line_item : /* empty */ { $$ = NULL; }
3552 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3556 line_item : anychar { size_t i;
3557 CLEAR_BUFFER(line_item_buf);
3558 line_item_buf_ptr = line_item_buf;
3559 /* The following also takes care of '@@' */
3560 if (!strncmp($1, "@@", 3))
3561 *line_item_buf_ptr++ = '@';
3563 for (i=0; i < strlen($1); i++)
3564 *line_item_buf_ptr++ = $1[i];
3567 | ESCAPE { size_t i;
3568 CLEAR_BUFFER(line_item_buf);
3569 line_item_buf_ptr = line_item_buf;
3570 for (i=0; i < strlen($1); i++)
3571 *line_item_buf_ptr++ = $1[i];
3576 /* The following also takes care of '@@' */
3577 if (!strncmp($2, "@@", 3))
3578 *line_item_buf_ptr++ = '@';
3580 for (i=0; i < strlen($2); i++)
3581 *line_item_buf_ptr++ = $2[i];
3586 for (i=0; i < strlen($2); i++)
3587 *line_item_buf_ptr++ = $2[i];
3592 anychar : ANYCHAR { }
3596 error_subs : /* empty */
3597 | error_subs error_sect
3600 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3602 gen_sect : OPEN DELIM opt_xref anystdtag
3603 { INVALID_TAG($4.string); }
3604 opt_value opt_sects CLOSE
3608 gen_rec : gen_rec_top
3612 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3613 { INVALID_TOP_TAG($4.string) }
3614 opt_value opt_sects CLOSE
3618 gen_rec_top : OPEN DELIM anytoptag
3619 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3620 opt_value opt_sects CLOSE
3624 opt_sects : /* empty */ { }
3625 | opt_sects gen_sect { }
3628 anytag : USERTAG { }
3642 anystdtag : TAG_ABBR
3772 /* Functions that handle the counting of subtags */
3774 int* count_arrays[MAXGEDCLEVEL+1];
3775 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3776 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3778 void push_countarray()
3781 if (count_level > MAXGEDCLEVEL) {
3782 gedcom_error(_("Internal error: count array overflow"));
3786 count = (int *)calloc(YYNTOKENS, sizeof(int));
3787 if (count == NULL) {
3788 gedcom_error(_("Internal error: count array calloc error"));
3792 count_arrays[count_level] = count;
3797 void set_parenttag(char* tag)
3799 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3802 void set_parentctxt(Gedcom_ctxt ctxt)
3804 ctxt_stack[count_level+1] = ctxt;
3807 char* get_parenttag(int offset)
3809 return tag_stack[count_level - offset];
3812 Gedcom_ctxt get_parentctxt(int offset)
3814 return ctxt_stack[count_level - offset];
3817 int count_tag(int tag)
3819 int *count = count_arrays[count_level];
3820 return ++count[tag - GEDCOMTAGOFFSET];
3823 int check_occurrence(int tag)
3825 int *count = count_arrays[count_level];
3826 return (count[tag - GEDCOMTAGOFFSET] > 0);
3829 void pop_countarray()
3832 if (count_level < 0) {
3833 gedcom_error(_("Internal error: count array underflow"));
3837 count = count_arrays[count_level];
3839 count_arrays[count_level] = NULL;
3843 /* Enabling debug mode */
3844 /* level 0: no debugging */
3845 /* level 1: only internal */
3846 /* level 2: also bison */
3849 void gedcom_set_debug_level(int level, FILE* f)
3854 trace_output = stderr;
3856 gedcom_high_level_debug = 1;
3865 int gedcom_debug_print(char* s, ...)
3868 if (gedcom_high_level_debug) {
3871 res = vfprintf(trace_output, s, ap);
3873 fprintf(trace_output, "\n");
3878 /* Setting the error mechanism */
3879 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3881 error_mechanism = mechanism;
3884 /* Compatibility handling */
3886 void gedcom_set_compat_handling(int enable_compat)
3888 compat_enabled = enable_compat;
3891 void set_compatibility(char* program)
3893 if (compat_enabled) {
3894 if (! strncmp(program, "ftree", 6)) {
3895 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3896 compatibility = C_FTREE;
3904 int compat_mode(int compat_flags)
3906 return (compat_flags & compatibility);