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();
172 void set_parentctxt(Gedcom_ctxt ctxt);
173 Gedcom_ctxt get_parentctxt();
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); \
209 { if (!check_occurrence(TAG_##TAG)) { \
210 char* parenttag = get_parenttag(); \
211 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
217 { pop_countarray(); \
221 #define CHECK1(TAG1) { CHK(TAG1); POP; }
222 #define CHECK2(TAG1,TAG2) \
223 { CHK(TAG1); CHK(TAG2); POP; }
224 #define CHECK3(TAG1,TAG2,TAG3) \
225 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
226 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
227 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
228 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
229 #define OCCUR2(CHILDTAG, MIN, MAX) \
230 { int num = count_tag(TAG_##CHILDTAG); \
232 char* parenttag = get_parenttag(); \
233 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
234 #CHILDTAG, MAX, parenttag); \
238 #define INVALID_TAG(CHILDTAG) \
239 { char* parenttag = get_parenttag(); \
240 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
241 CHILDTAG, parenttag); \
244 #define INVALID_TOP_TAG(CHILDTAG) \
245 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
255 struct tag_struct tag;
262 %token <string> BADTOKEN
264 %token <string> CLOSE
265 %token <string> ESCAPE
266 %token <string> DELIM
267 %token <string> ANYCHAR
268 %token <string> POINTER
270 %token <tag> TAG_ABBR
271 %token <tag> TAG_ADDR
272 %token <tag> TAG_ADR1
273 %token <tag> TAG_ADR2
274 %token <tag> TAG_ADOP
277 %token <tag> TAG_AGNC
278 %token <tag> TAG_ALIA
279 %token <tag> TAG_ANCE
280 %token <tag> TAG_ANCI
281 %token <tag> TAG_ANUL
282 %token <tag> TAG_ASSO
283 %token <tag> TAG_AUTH
284 %token <tag> TAG_BAPL
285 %token <tag> TAG_BAPM
286 %token <tag> TAG_BARM
287 %token <tag> TAG_BASM
288 %token <tag> TAG_BIRT
289 %token <tag> TAG_BLES
290 %token <tag> TAG_BLOB
291 %token <tag> TAG_BURI
292 %token <tag> TAG_CALN
293 %token <tag> TAG_CAST
294 %token <tag> TAG_CAUS
295 %token <tag> TAG_CENS
296 %token <tag> TAG_CHAN
297 %token <tag> TAG_CHAR
298 %token <tag> TAG_CHIL
300 %token <tag> TAG_CHRA
301 %token <tag> TAG_CITY
302 %token <tag> TAG_CONC
303 %token <tag> TAG_CONF
304 %token <tag> TAG_CONL
305 %token <tag> TAG_CONT
306 %token <tag> TAG_COPR
307 %token <tag> TAG_CORP
308 %token <tag> TAG_CREM
309 %token <tag> TAG_CTRY
310 %token <tag> TAG_DATA
311 %token <tag> TAG_DATE
312 %token <tag> TAG_DEAT
313 %token <tag> TAG_DESC
314 %token <tag> TAG_DESI
315 %token <tag> TAG_DEST
317 %token <tag> TAG_DIVF
318 %token <tag> TAG_DSCR
319 %token <tag> TAG_EDUC
320 %token <tag> TAG_EMIG
321 %token <tag> TAG_ENDL
322 %token <tag> TAG_ENGA
323 %token <tag> TAG_EVEN
325 %token <tag> TAG_FAMC
326 %token <tag> TAG_FAMF
327 %token <tag> TAG_FAMS
328 %token <tag> TAG_FCOM
329 %token <tag> TAG_FILE
330 %token <tag> TAG_FORM
331 %token <tag> TAG_GEDC
332 %token <tag> TAG_GIVN
333 %token <tag> TAG_GRAD
334 %token <tag> TAG_HEAD
335 %token <tag> TAG_HUSB
336 %token <tag> TAG_IDNO
337 %token <tag> TAG_IMMI
338 %token <tag> TAG_INDI
339 %token <tag> TAG_LANG
340 %token <tag> TAG_LEGA
341 %token <tag> TAG_MARB
342 %token <tag> TAG_MARC
343 %token <tag> TAG_MARL
344 %token <tag> TAG_MARR
345 %token <tag> TAG_MARS
346 %token <tag> TAG_MEDI
347 %token <tag> TAG_NAME
348 %token <tag> TAG_NATI
349 %token <tag> TAG_NATU
350 %token <tag> TAG_NCHI
351 %token <tag> TAG_NICK
353 %token <tag> TAG_NOTE
354 %token <tag> TAG_NPFX
355 %token <tag> TAG_NSFX
356 %token <tag> TAG_OBJE
357 %token <tag> TAG_OCCU
358 %token <tag> TAG_ORDI
359 %token <tag> TAG_ORDN
360 %token <tag> TAG_PAGE
361 %token <tag> TAG_PEDI
362 %token <tag> TAG_PHON
363 %token <tag> TAG_PLAC
364 %token <tag> TAG_POST
365 %token <tag> TAG_PROB
366 %token <tag> TAG_PROP
367 %token <tag> TAG_PUBL
368 %token <tag> TAG_QUAY
369 %token <tag> TAG_REFN
370 %token <tag> TAG_RELA
371 %token <tag> TAG_RELI
372 %token <tag> TAG_REPO
373 %token <tag> TAG_RESI
374 %token <tag> TAG_RESN
375 %token <tag> TAG_RETI
378 %token <tag> TAG_ROLE
380 %token <tag> TAG_SLGC
381 %token <tag> TAG_SLGS
382 %token <tag> TAG_SOUR
383 %token <tag> TAG_SPFX
385 %token <tag> TAG_STAE
386 %token <tag> TAG_STAT
387 %token <tag> TAG_SUBM
388 %token <tag> TAG_SUBN
389 %token <tag> TAG_SURN
390 %token <tag> TAG_TEMP
391 %token <tag> TAG_TEXT
392 %token <tag> TAG_TIME
393 %token <tag> TAG_TITL
394 %token <tag> TAG_TRLR
395 %token <tag> TAG_TYPE
396 %token <tag> TAG_VERS
397 %token <tag> TAG_WIFE
398 %token <tag> TAG_WILL
400 %type <tag> anystdtag
401 %type <tag> anytoptag
402 %type <tag> fam_event_tag
403 %type <tag> indiv_attr_tag
404 %type <tag> indiv_birt_tag
405 %type <tag> indiv_gen_tag
406 %type <tag> lio_bapl_tag
407 %type <string> line_item
408 %type <string> mand_line_item
409 %type <string> mand_pointer
410 %type <string> note_line_item
411 %type <string> anychar
412 %type <string> opt_xref
413 %type <string> opt_value
414 %type <string> opt_line_item
415 %type <ctxt> head_sect
419 file : head_sect records trlr_sect
420 { if (fail == 1) YYABORT; }
423 records : /* empty */
438 /*********************************************************************/
440 /*********************************************************************/
441 head_sect : OPEN DELIM TAG_HEAD
442 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
444 NULL, GEDCOM_MAKE_NULL(val2));
445 START(HEAD, $<ctxt>$) }
447 { if (compat_mode(C_FTREE)) {
448 CHECK3(SOUR, GEDC, CHAR);
449 compat_generate_submitter_link($<ctxt>4);
452 CHECK4(SOUR, SUBM, GEDC, CHAR)
455 { end_record(REC_HEAD, $<ctxt>4);
456 if (compat_mode(C_FTREE))
457 compat_generate_submitter();
461 head_subs : /* empty */
465 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
466 | head_dest_sect { OCCUR2(DEST, 0, 1) }
467 | head_date_sect { OCCUR2(DATE, 0, 1) }
468 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
469 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
470 | head_file_sect { OCCUR2(FILE, 0, 1) }
471 | head_copr_sect { OCCUR2(COPR, 0, 1) }
472 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
473 | head_char_sect { OCCUR2(CHAR, 1, 1) }
474 | head_lang_sect { OCCUR2(LANG, 0, 1) }
475 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
476 | head_note_sect { OCCUR2(NOTE, 0, 1) }
481 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
482 { set_compatibility($4);
483 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
485 GEDCOM_MAKE_STRING(val1, $4));
486 START(SOUR, $<ctxt>$)
491 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
494 head_sour_subs : /* empty */
495 | head_sour_subs head_sour_sub
498 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
499 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
500 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
501 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
505 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
506 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
508 GEDCOM_MAKE_STRING(val1, $4));
509 START(VERS, $<ctxt>$)
514 { end_element(ELT_HEAD_SOUR_VERS,
515 PARENT, $<ctxt>5, NULL);
518 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
519 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
521 GEDCOM_MAKE_STRING(val1, $4));
522 START(NAME, $<ctxt>$)
527 { end_element(ELT_HEAD_SOUR_NAME,
528 PARENT, $<ctxt>5, NULL);
531 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
532 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
534 GEDCOM_MAKE_STRING(val1, $4));
535 START(CORP, $<ctxt>$)
540 { end_element(ELT_HEAD_SOUR_CORP,
541 PARENT, $<ctxt>5, NULL);
545 head_sour_corp_subs : /* empty */
546 | head_sour_corp_subs head_sour_corp_sub
549 head_sour_corp_sub : addr_struc_sub /* 0:1 */
553 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
554 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
556 GEDCOM_MAKE_STRING(val1, $4));
557 START(DATA, $<ctxt>$)
562 { end_element(ELT_HEAD_SOUR_DATA,
563 PARENT, $<ctxt>5, NULL);
567 head_sour_data_subs : /* empty */
568 | head_sour_data_subs head_sour_data_sub
571 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
572 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
576 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
577 { struct date_value dv = gedcom_parse_date($4);
579 = start_element(ELT_HEAD_SOUR_DATA_DATE,
581 GEDCOM_MAKE_DATE(val1, dv));
582 START(DATE, $<ctxt>$)
587 { end_element(ELT_HEAD_SOUR_DATA_DATE,
588 PARENT, $<ctxt>5, NULL);
591 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
593 = start_element(ELT_HEAD_SOUR_DATA_COPR,
595 GEDCOM_MAKE_STRING(val1, $4));
596 START(COPR, $<ctxt>$)
601 { end_element(ELT_HEAD_SOUR_DATA_COPR,
602 PARENT, $<ctxt>5, NULL);
607 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
608 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
610 GEDCOM_MAKE_STRING(val1, $4));
611 START(DEST, $<ctxt>$)
616 { end_element(ELT_HEAD_DEST,
617 PARENT, $<ctxt>5, NULL);
622 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
623 { struct date_value dv = gedcom_parse_date($4);
624 $<ctxt>$ = start_element(ELT_HEAD_DATE,
626 GEDCOM_MAKE_DATE(val1, dv));
627 START(DATE, $<ctxt>$)
632 { end_element(ELT_HEAD_DATE,
633 PARENT, $<ctxt>5, NULL);
637 head_date_subs : /* empty */
638 | head_date_subs head_date_sub
641 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
645 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
646 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
648 GEDCOM_MAKE_STRING(val1, $4));
649 START(TIME, $<ctxt>$)
654 { end_element(ELT_HEAD_DATE_TIME,
655 PARENT, $<ctxt>5, NULL);
660 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
661 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
663 if (xr == NULL) HANDLE_ERROR;
664 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
666 GEDCOM_MAKE_XREF_PTR(val1, xr));
667 START(SUBM, $<ctxt>$)
672 { end_element(ELT_HEAD_SUBM,
673 PARENT, $<ctxt>5, NULL);
677 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
678 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
680 if (xr == NULL) HANDLE_ERROR;
681 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
683 GEDCOM_MAKE_XREF_PTR(val1, xr));
684 START(SUBN, $<ctxt>$)
689 { end_element(ELT_HEAD_SUBN,
690 PARENT, $<ctxt>5, NULL);
694 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
695 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
697 GEDCOM_MAKE_STRING(val1, $4));
698 START(FILE, $<ctxt>$)
703 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
707 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
708 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
710 GEDCOM_MAKE_STRING(val1, $4));
711 START(COPR, $<ctxt>$)
716 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
720 head_gedc_sect : OPEN DELIM TAG_GEDC
721 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
722 PARENT, $1, $3, NULL,
723 GEDCOM_MAKE_NULL(val1));
724 START(GEDC, $<ctxt>$)
727 { CHECK2(VERS, FORM) }
729 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
733 head_gedc_subs : /* empty */
734 | head_gedc_subs head_gedc_sub
737 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
738 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
741 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
742 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
744 GEDCOM_MAKE_STRING(val1, $4));
745 START(VERS, $<ctxt>$)
750 { end_element(ELT_HEAD_GEDC_VERS,
751 PARENT, $<ctxt>5, NULL);
754 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
755 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
757 GEDCOM_MAKE_STRING(val1, $4));
758 START(FORM, $<ctxt>$)
763 { end_element(ELT_HEAD_GEDC_FORM,
764 PARENT, $<ctxt>5, NULL);
769 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
770 { /* Don't allow to continue if conversion context couldn't
772 if (open_conv_to_internal($4) == 0) YYABORT;
773 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
775 GEDCOM_MAKE_STRING(val1, $4));
776 START(CHAR, $<ctxt>$)
781 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
785 head_char_subs : /* empty */
786 | head_char_subs head_char_sub
789 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
792 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
793 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
795 GEDCOM_MAKE_STRING(val1, $4));
796 START(VERS, $<ctxt>$)
801 { end_element(ELT_HEAD_CHAR_VERS,
802 PARENT, $<ctxt>5, NULL);
807 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
808 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
810 GEDCOM_MAKE_STRING(val1, $4));
811 START(LANG, $<ctxt>$)
816 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
820 head_plac_sect : OPEN DELIM TAG_PLAC
821 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
822 PARENT, $1, $3, NULL,
823 GEDCOM_MAKE_NULL(val1));
824 START(PLAC, $<ctxt>$)
829 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
833 head_plac_subs : /* empty */
834 | head_plac_subs head_plac_sub
837 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
840 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
841 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
843 GEDCOM_MAKE_STRING(val1, $4));
844 START(FORM, $<ctxt>$)
849 { end_element(ELT_HEAD_PLAC_FORM,
850 PARENT, $<ctxt>5, NULL);
855 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
856 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
858 GEDCOM_MAKE_STRING(val1, $4));
859 START(NOTE, $<ctxt>$)
864 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
868 head_note_subs : /* empty */
869 | head_note_subs head_note_sub
872 head_note_sub : continuation_sub /* 0:M */
876 /*********************************************************************/
878 /*********************************************************************/
879 /* Don't need callbacks here, there is no information... */
880 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
883 /*********************************************************************/
884 /**** Family record ****/
885 /*********************************************************************/
886 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
887 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
889 if (xr == NULL) HANDLE_ERROR;
890 $<ctxt>$ = start_record(REC_FAM,
891 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
893 NULL, GEDCOM_MAKE_NULL(val2));
894 START(FAM, $<ctxt>$) }
898 { end_record(REC_FAM, $<ctxt>6); }
901 fam_subs : /* empty */
905 fam_sub : fam_event_struc_sub /* 0:M */
906 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
907 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
908 | fam_chil_sect /* 0:M */
909 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
910 | fam_subm_sect /* 0:M */
911 | lds_spouse_seal_sub /* 0:M */
912 | source_cit_sub /* 0:M */
913 | multim_link_sub /* 0:M */
914 | note_struc_sub /* 0:M */
915 | ident_struc_sub /* 0:1 */
916 | change_date_sub /* 0:1 */
921 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
922 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
924 if (xr == NULL) HANDLE_ERROR;
925 $<ctxt>$ = start_element(ELT_FAM_HUSB,
927 GEDCOM_MAKE_XREF_PTR(val1, xr));
928 START(HUSB, $<ctxt>$)
933 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
938 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
939 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
941 if (xr == NULL) HANDLE_ERROR;
942 $<ctxt>$ = start_element(ELT_FAM_WIFE,
944 GEDCOM_MAKE_XREF_PTR(val1, xr));
945 START(WIFE, $<ctxt>$)
950 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
955 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
956 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
958 if (xr == NULL) HANDLE_ERROR;
959 $<ctxt>$ = start_element(ELT_FAM_CHIL,
961 GEDCOM_MAKE_XREF_PTR(val1, xr));
962 START(CHIL, $<ctxt>$)
967 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
972 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
973 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
975 GEDCOM_MAKE_STRING(val1, $4));
976 START(NCHI, $<ctxt>$)
981 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
986 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
987 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
989 if (xr == NULL) HANDLE_ERROR;
990 $<ctxt>$ = start_element(ELT_FAM_SUBM,
992 GEDCOM_MAKE_XREF_PTR(val1, xr));
993 START(SUBM, $<ctxt>$)
998 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1002 /*********************************************************************/
1003 /**** Individual record ****/
1004 /*********************************************************************/
1005 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1006 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1008 if (xr == NULL) HANDLE_ERROR;
1009 $<ctxt>$ = start_record(REC_INDI,
1010 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1011 NULL, GEDCOM_MAKE_NULL(val2));
1012 START(INDI, $<ctxt>$) }
1016 { end_record(REC_INDI, $<ctxt>6); }
1019 indi_subs : /* empty */
1020 | indi_subs indi_sub
1023 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1024 | pers_name_struc_sub /* 0:M */
1025 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1026 | indiv_even_struc_sub /* 0:M */
1027 | indiv_attr_struc_sub /* 0:M */
1028 | lds_indiv_ord_sub /* 0:M */
1029 | chi_fam_link_sub /* 0:M */
1030 | spou_fam_link_sub /* 0:M */
1031 | indi_subm_sect /* 0:M */
1032 | assoc_struc_sub /* 0:M */
1033 | indi_alia_sect /* 0:M */
1034 | indi_anci_sect /* 0:M */
1035 | indi_desi_sect /* 0:M */
1036 | source_cit_sub /* 0:M */
1037 | multim_link_sub /* 0:M */
1038 | note_struc_sub /* 0:M */
1039 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1040 | indi_afn_sect /* 0:M */
1041 | ident_struc_sub /* 0:1 */
1042 | change_date_sub /* 0:1 */
1043 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1044 INVALID_TAG("ADDR");
1050 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1051 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1053 GEDCOM_MAKE_STRING(val1, $4));
1054 START(RESN, $<ctxt>$)
1059 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1064 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1065 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1067 GEDCOM_MAKE_STRING(val1, $4));
1068 START(SEX, $<ctxt>$)
1073 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1078 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1079 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1081 if (xr == NULL) HANDLE_ERROR;
1082 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1084 GEDCOM_MAKE_XREF_PTR(val1, xr));
1085 START(SUBM, $<ctxt>$)
1090 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1095 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1096 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1098 if (xr == NULL) HANDLE_ERROR;
1099 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1101 GEDCOM_MAKE_XREF_PTR(val1, xr));
1102 START(ALIA, $<ctxt>$)
1107 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1112 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1113 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1115 if (xr == NULL) HANDLE_ERROR;
1116 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1118 GEDCOM_MAKE_XREF_PTR(val1, xr));
1119 START(ANCI, $<ctxt>$)
1124 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1129 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1130 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1132 if (xr == NULL) HANDLE_ERROR;
1133 $<ctxt>$ = start_element(ELT_INDI_DESI,
1135 GEDCOM_MAKE_XREF_PTR(val1, xr));
1136 START(DESI, $<ctxt>$)
1141 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1146 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1147 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1149 GEDCOM_MAKE_STRING(val1, $4));
1150 START(RFN, $<ctxt>$)
1155 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1160 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1161 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1163 GEDCOM_MAKE_STRING(val1, $4));
1164 START(AFN, $<ctxt>$)
1169 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1173 /* INDI.ADDR (Only for 'ftree' compatibility) */
1174 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1175 { if (compat_mode(C_FTREE)) {
1176 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1179 = start_element(ELT_SUB_ADDR,
1180 par, $1 + 1, $3, $4,
1181 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1182 START(ADDR, $<ctxt>$);
1184 else { START(ADDR, NULL) }
1189 { if (compat_mode(C_FTREE)) {
1190 Gedcom_ctxt par = PARENT;
1191 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1193 compat_generate_resi_end(PARENT, par);
1197 ftree_addr_subs : /* empty */
1198 | ftree_addr_subs ftree_addr_sub
1201 ftree_addr_sub : continuation_sub
1206 /*********************************************************************/
1207 /**** Multimedia record ****/
1208 /*********************************************************************/
1209 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1210 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1212 if (xr == NULL) HANDLE_ERROR;
1213 $<ctxt>$ = start_record(REC_OBJE,
1214 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1215 NULL, GEDCOM_MAKE_NULL(val2));
1216 START(OBJE, $<ctxt>$) }
1218 { CHECK2(FORM, BLOB) }
1220 { end_record(REC_OBJE, $<ctxt>6); }
1223 obje_subs : /* empty */
1224 | obje_subs obje_sub
1227 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1228 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1229 | note_struc_sub /* 0:M */
1230 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1231 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1232 | ident_struc_sub /* 0:1 */
1233 | change_date_sub /* 0:1 */
1238 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1239 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1241 GEDCOM_MAKE_STRING(val1, $4));
1242 START(FORM, $<ctxt>$)
1247 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1252 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1253 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1255 GEDCOM_MAKE_STRING(val1, $4));
1256 START(TITL, $<ctxt>$)
1261 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1266 obje_blob_sect : OPEN DELIM TAG_BLOB
1267 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1268 PARENT, $1, $3, NULL,
1269 GEDCOM_MAKE_NULL(val1));
1270 START(BLOB, $<ctxt>$)
1275 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1279 obje_blob_subs : /* empty */
1280 | obje_blob_subs obje_blob_sub
1283 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1287 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1288 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1290 GEDCOM_MAKE_STRING(val1, $4));
1291 START(CONT, $<ctxt>$)
1296 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1302 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1303 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1305 if (xr == NULL) HANDLE_ERROR;
1306 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1308 GEDCOM_MAKE_XREF_PTR(val1, xr));
1309 START(OBJE, $<ctxt>$)
1314 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1318 /*********************************************************************/
1319 /**** Note record ****/
1320 /*********************************************************************/
1321 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1322 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1324 if (xr == NULL) HANDLE_ERROR;
1325 $<ctxt>$ = start_record(REC_NOTE,
1326 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1327 $6, GEDCOM_MAKE_STRING(val2, $6));
1328 START(NOTE, $<ctxt>$) }
1332 { end_record(REC_NOTE, $<ctxt>7); }
1335 note_line_item : /* empty */
1336 { if (!compat_mode(C_FTREE)) {
1337 gedcom_error(_("Missing value")); YYERROR;
1344 { gedcom_debug_print("==Val: %s==", $2);
1348 note_subs : /* empty */
1349 | note_subs note_sub
1352 note_sub : continuation_sub /* 0:M */
1353 | source_cit_sub /* 0:M */
1354 | ident_struc_sub /* 0:1 */
1355 | change_date_sub /* 0:1 */
1359 /*********************************************************************/
1360 /**** Repository record ****/
1361 /*********************************************************************/
1362 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1363 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1365 if (xr == NULL) HANDLE_ERROR;
1366 $<ctxt>$ = start_record(REC_REPO,
1367 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1368 NULL, GEDCOM_MAKE_NULL(val2));
1369 START(REPO, $<ctxt>$) }
1373 { end_record(REC_REPO, $<ctxt>6); }
1376 repo_subs : /* empty */
1377 | repo_subs repo_sub
1380 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1381 | addr_struc_sub /* 0:1 */
1382 | note_struc_sub /* 0:M */
1383 | ident_struc_sub /* 0:1 */
1384 | change_date_sub /* 0:1 */
1389 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1390 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1392 GEDCOM_MAKE_STRING(val1, $4));
1393 START(NAME, $<ctxt>$)
1398 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1402 /*********************************************************************/
1403 /**** Source record ****/
1404 /*********************************************************************/
1405 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1406 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1408 if (xr == NULL) HANDLE_ERROR;
1409 $<ctxt>$ = start_record(REC_SOUR,
1410 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1411 NULL, GEDCOM_MAKE_NULL(val2));
1412 START(SOUR, $<ctxt>$) }
1416 { end_record(REC_SOUR, $<ctxt>6); }
1419 sour_subs : /* empty */
1420 | sour_subs sour_sub
1423 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1424 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1425 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1426 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1427 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1428 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1429 | source_repos_cit_sub /* 0:1 */
1430 | multim_link_sub /* 0:M */
1431 | note_struc_sub /* 0:M */
1432 | ident_struc_sub /* 0:1 */
1433 | change_date_sub /* 0:1 */
1438 sour_data_sect : OPEN DELIM TAG_DATA
1439 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1440 PARENT, $1, $3, NULL,
1441 GEDCOM_MAKE_NULL(val1));
1442 START(DATA, $<ctxt>$)
1447 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1451 sour_data_subs : /* empty */
1452 | sour_data_subs sour_data_sub
1455 sour_data_sub : sour_data_even_sect /* 0:M */
1456 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1457 | note_struc_sub /* 0:M */
1461 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1462 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1464 GEDCOM_MAKE_STRING(val1, $4));
1465 START(EVEN, $<ctxt>$)
1470 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1475 sour_data_even_subs : /* empty */
1476 | sour_data_even_subs sour_data_even_sub
1479 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1480 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1484 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1485 { struct date_value dv = gedcom_parse_date($4);
1487 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1489 GEDCOM_MAKE_DATE(val1, dv));
1490 START(DATE, $<ctxt>$)
1495 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1500 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1502 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1504 GEDCOM_MAKE_STRING(val1, $4));
1505 START(PLAC, $<ctxt>$)
1510 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1515 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1516 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1518 GEDCOM_MAKE_STRING(val1, $4));
1519 START(AGNC, $<ctxt>$)
1524 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1530 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1531 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1533 GEDCOM_MAKE_STRING(val1, $4));
1534 START(AUTH, $<ctxt>$)
1539 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1543 sour_auth_subs : /* empty */
1544 | sour_auth_subs sour_auth_sub
1547 sour_auth_sub : continuation_sub /* 0:M */
1552 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1553 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1555 GEDCOM_MAKE_STRING(val1, $4));
1556 START(TITL, $<ctxt>$)
1561 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1565 sour_titl_subs : /* empty */
1566 | sour_titl_subs sour_titl_sub
1569 sour_titl_sub : continuation_sub /* 0:M */
1574 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1575 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1577 GEDCOM_MAKE_STRING(val1, $4));
1578 START(ABBR, $<ctxt>$)
1583 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1588 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1589 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1591 GEDCOM_MAKE_STRING(val1, $4));
1592 START(PUBL, $<ctxt>$)
1597 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1601 sour_publ_subs : /* empty */
1602 | sour_publ_subs sour_publ_sub
1605 sour_publ_sub : continuation_sub /* 0:M */
1610 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1611 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1613 GEDCOM_MAKE_STRING(val1, $4));
1614 START(TEXT, $<ctxt>$)
1619 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1623 sour_text_subs : /* empty */
1624 | sour_text_subs sour_text_sub
1627 sour_text_sub : continuation_sub /* 0:M */
1631 /*********************************************************************/
1632 /**** Submission record ****/
1633 /*********************************************************************/
1634 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1635 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1637 if (xr == NULL) HANDLE_ERROR;
1638 $<ctxt>$ = start_record(REC_SUBN,
1639 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1640 NULL, GEDCOM_MAKE_NULL(val2));
1641 START(SUBN, $<ctxt>$) }
1645 { end_record(REC_SUBN, $<ctxt>6); }
1648 subn_subs : /* empty */
1649 | subn_subs subn_sub
1652 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1653 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1654 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1655 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1656 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1657 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1658 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1663 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1664 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1666 if (xr == NULL) HANDLE_ERROR;
1667 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1669 GEDCOM_MAKE_XREF_PTR(val1, xr));
1670 START(SUBM, $<ctxt>$)
1675 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1680 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1681 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1683 GEDCOM_MAKE_STRING(val1, $4));
1684 START(FAMF, $<ctxt>$)
1689 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1694 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1695 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1697 GEDCOM_MAKE_STRING(val1, $4));
1698 START(TEMP, $<ctxt>$)
1703 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1708 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1709 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1711 GEDCOM_MAKE_STRING(val1, $4));
1712 START(ANCE, $<ctxt>$)
1717 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1722 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1723 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1725 GEDCOM_MAKE_STRING(val1, $4));
1726 START(DESC, $<ctxt>$)
1731 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1736 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1737 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1739 GEDCOM_MAKE_STRING(val1, $4));
1740 START(ORDI, $<ctxt>$)
1745 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1750 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1751 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1753 GEDCOM_MAKE_STRING(val1, $4));
1754 START(RIN, $<ctxt>$)
1759 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1763 /*********************************************************************/
1764 /**** Submitter record ****/
1765 /*********************************************************************/
1766 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1767 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1769 if (xr == NULL) HANDLE_ERROR;
1770 $<ctxt>$ = start_record(REC_SUBM,
1771 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1772 NULL, GEDCOM_MAKE_NULL(val2));
1773 START(SUBM, $<ctxt>$) }
1777 { end_record(REC_SUBM, $<ctxt>6); }
1780 subm_subs : /* empty */
1781 | subm_subs subm_sub
1784 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1785 | addr_struc_sub /* 0:1 */
1786 | multim_link_sub /* 0:M */
1787 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1788 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1789 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1790 | change_date_sub /* 0:1 */
1795 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1796 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1798 GEDCOM_MAKE_STRING(val1, $4));
1799 START(NAME, $<ctxt>$)
1804 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1809 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1810 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1812 GEDCOM_MAKE_STRING(val1, $4));
1813 START(LANG, $<ctxt>$)
1818 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1823 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1824 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1826 GEDCOM_MAKE_STRING(val1, $4));
1827 START(RFN, $<ctxt>$)
1832 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1837 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1838 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1840 GEDCOM_MAKE_STRING(val1, $4));
1841 START(RIN, $<ctxt>$)
1846 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1850 /*********************************************************************/
1851 /**** Substructures ****/
1852 /*********************************************************************/
1854 /* ADDRESS STRUCTURE */
1855 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1856 | phon_sect { OCCUR2(PHON, 0, 3) }
1859 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1860 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1862 GEDCOM_MAKE_STRING(val1, $4));
1863 START(ADDR, $<ctxt>$)
1868 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1872 addr_subs : /* empty */
1873 | addr_subs addr_sub
1876 addr_sub : addr_cont_sect /* 0:M */
1877 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1878 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1879 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1880 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1881 | addr_post_sect { OCCUR2(POST, 0, 1) }
1882 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1886 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1887 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1889 GEDCOM_MAKE_STRING(val1, $4));
1890 START(CONT, $<ctxt>$)
1895 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1898 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1899 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1901 GEDCOM_MAKE_STRING(val1, $4));
1902 START(ADR1, $<ctxt>$)
1907 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1910 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1911 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1913 GEDCOM_MAKE_STRING(val1, $4));
1914 START(ADR2, $<ctxt>$)
1919 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1922 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1923 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1925 GEDCOM_MAKE_STRING(val1, $4));
1926 START(CITY, $<ctxt>$)
1931 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1934 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1935 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1937 GEDCOM_MAKE_STRING(val1, $4));
1938 START(STAE, $<ctxt>$)
1943 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1946 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1947 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1949 GEDCOM_MAKE_STRING(val1, $4));
1950 START(POST, $<ctxt>$)
1955 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1958 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1959 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1961 GEDCOM_MAKE_STRING(val1, $4));
1962 START(CTRY, $<ctxt>$)
1967 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1971 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1972 { $<ctxt>$ = start_element(ELT_SUB_PHON,
1974 GEDCOM_MAKE_STRING(val1, $4));
1975 START(PHON, $<ctxt>$)
1980 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
1984 /* ASSOCIATION STRUCTURE */
1985 assoc_struc_sub : asso_sect /* 0:M */
1988 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
1989 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1991 if (xr == NULL) HANDLE_ERROR;
1992 $<ctxt>$ = start_element(ELT_SUB_ASSO,
1994 GEDCOM_MAKE_XREF_PTR(val1, xr));
1995 START(ASSO, $<ctxt>$)
1998 { CHECK2(TYPE,RELA) }
2000 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2004 asso_subs : /* empty */
2005 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2006 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2012 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2013 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2015 GEDCOM_MAKE_STRING(val1, $4));
2016 START(TYPE, $<ctxt>$)
2021 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2025 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2026 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2028 GEDCOM_MAKE_STRING(val1, $4));
2029 START(RELA, $<ctxt>$)
2034 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2039 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2042 change_date_chan_sect : OPEN DELIM TAG_CHAN
2043 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2044 PARENT, $1, $3, NULL,
2045 GEDCOM_MAKE_NULL(val1));
2046 START(CHAN, $<ctxt>$)
2048 change_date_chan_subs
2051 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2055 change_date_chan_subs : /* empty */
2056 | change_date_chan_subs change_date_chan_sub
2059 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2064 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2065 { struct date_value dv = gedcom_parse_date($4);
2066 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2068 GEDCOM_MAKE_DATE(val1, dv));
2069 START(DATE, $<ctxt>$) }
2070 change_date_date_subs
2073 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2078 change_date_date_subs : /* empty */
2079 | change_date_date_subs change_date_date_sub
2082 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2086 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2088 = start_element(ELT_SUB_CHAN_TIME,
2090 GEDCOM_MAKE_STRING(val1, $4));
2091 START(TIME, $<ctxt>$)
2096 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2101 /* CHILD TO FAMILY LINK */
2102 chi_fam_link_sub : famc_sect /* 0:M */
2105 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2106 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2108 if (xr == NULL) HANDLE_ERROR;
2109 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2111 GEDCOM_MAKE_XREF_PTR(val1, xr));
2112 START(FAMC, $<ctxt>$)
2117 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2121 famc_subs : /* empty */
2122 | famc_subs famc_sub
2125 famc_sub : famc_pedi_sect /* 0:M */
2130 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2131 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2133 GEDCOM_MAKE_STRING(val1, $4));
2134 START(PEDI, $<ctxt>$)
2139 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2143 /* CONTINUATION SUBSECTIONS */
2144 continuation_sub : cont_sect /* 0:M */
2145 | conc_sect /* 0:M */
2148 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2149 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2151 GEDCOM_MAKE_STRING(val1, $4));
2152 START(CONT, $<ctxt>$)
2157 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2161 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2162 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2164 GEDCOM_MAKE_STRING(val1, $4));
2165 START(CONC, $<ctxt>$)
2170 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2175 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2176 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2179 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2180 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2181 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2187 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2189 = start_element(ELT_SUB_EVT_TYPE,
2191 GEDCOM_MAKE_STRING(val1, $4));
2192 START(TYPE, $<ctxt>$)
2197 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2201 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2202 { struct date_value dv = gedcom_parse_date($4);
2204 = start_element(ELT_SUB_EVT_DATE,
2206 GEDCOM_MAKE_DATE(val1, dv));
2207 START(DATE, $<ctxt>$)
2212 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2216 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2218 = start_element(ELT_SUB_EVT_AGE,
2220 GEDCOM_MAKE_STRING(val1, $4));
2221 START(AGE, $<ctxt>$)
2226 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2230 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2232 = start_element(ELT_SUB_EVT_AGNC,
2234 GEDCOM_MAKE_STRING(val1, $4));
2235 START(AGNC, $<ctxt>$)
2240 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2244 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2246 = start_element(ELT_SUB_EVT_CAUS,
2248 GEDCOM_MAKE_STRING(val1, $4));
2249 START(CAUS, $<ctxt>$)
2254 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2259 /* FAMILY EVENT STRUCTURE */
2260 fam_event_struc_sub : fam_event_sect
2261 | fam_gen_even_sect /* 0:M */
2264 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2266 = start_element(ELT_SUB_FAM_EVT,
2268 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2274 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2278 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2279 | TAG_CENS { $$ = $1; START1(CENS) }
2280 | TAG_DIV { $$ = $1; START1(DIV) }
2281 | TAG_DIVF { $$ = $1; START1(DIVF) }
2282 | TAG_ENGA { $$ = $1; START1(ENGA) }
2283 | TAG_MARR { $$ = $1; START1(MARR) }
2284 | TAG_MARB { $$ = $1; START1(MARB) }
2285 | TAG_MARC { $$ = $1; START1(MARC) }
2286 | TAG_MARL { $$ = $1; START1(MARL) }
2287 | TAG_MARS { $$ = $1; START1(MARS) }
2290 fam_event_subs : /* empty */
2291 | fam_event_subs fam_event_sub
2294 fam_event_sub : event_detail_sub
2295 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2296 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2300 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2301 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2302 PARENT, $1, $3, NULL,
2303 GEDCOM_MAKE_NULL(val1));
2304 START(HUSB, $<ctxt>$)
2309 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2314 fam_even_husb_subs : /* empty */
2315 | fam_even_husb_subs fam_even_husb_sub
2318 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2322 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2323 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2325 GEDCOM_MAKE_STRING(val1, $4));
2326 START(AGE, $<ctxt>$)
2331 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2336 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2337 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2338 PARENT, $1, $3, NULL,
2339 GEDCOM_MAKE_NULL(val1));
2340 START(WIFE, $<ctxt>$)
2345 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2350 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2351 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2352 PARENT, $1, $3, NULL,
2353 GEDCOM_MAKE_NULL(val1));
2354 START(EVEN, $<ctxt>$)
2359 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2364 fam_gen_even_subs : /* empty */
2365 | fam_gen_even_subs fam_gen_even_sub
2368 fam_gen_even_sub : event_detail_sub
2369 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2370 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2374 /* IDENTIFICATION STRUCTURE */
2375 ident_struc_sub : ident_refn_sect /* 0:M */
2376 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2379 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2380 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2382 GEDCOM_MAKE_STRING(val1, $4));
2383 START(REFN, $<ctxt>$)
2388 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2393 ident_refn_subs : /* empty */
2394 | ident_refn_subs ident_refn_sub
2397 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2401 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2403 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2405 GEDCOM_MAKE_STRING(val1, $4));
2406 START(TYPE, $<ctxt>$)
2411 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2416 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2417 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2419 GEDCOM_MAKE_STRING(val1, $4));
2420 START(RIN, $<ctxt>$)
2425 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2430 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2431 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2432 | indiv_resi_sect /* 0:M */
2435 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2436 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2438 GEDCOM_MAKE_STRING(val1, $4));
2441 indiv_attr_event_subs
2444 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2447 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2448 | TAG_DSCR { $$ = $1; START1(DSCR) }
2449 | TAG_EDUC { $$ = $1; START1(EDUC) }
2450 | TAG_IDNO { $$ = $1; START1(IDNO) }
2451 | TAG_NATI { $$ = $1; START1(NATI) }
2452 | TAG_NCHI { $$ = $1; START1(NCHI) }
2453 | TAG_NMR { $$ = $1; START1(NMR) }
2454 | TAG_OCCU { $$ = $1; START1(OCCU) }
2455 | TAG_PROP { $$ = $1; START1(PROP) }
2456 | TAG_RELI { $$ = $1; START1(RELI) }
2457 | TAG_SSN { $$ = $1; START1(SSN) }
2458 | TAG_TITL { $$ = $1; START1(TITL) }
2460 indiv_resi_sect : OPEN DELIM TAG_RESI
2461 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2462 PARENT, $1, $3, NULL,
2463 GEDCOM_MAKE_NULL(val1));
2464 START(RESI, $<ctxt>$)
2466 indiv_attr_event_subs
2469 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2473 indiv_attr_event_subs : /* empty */
2474 | indiv_attr_event_subs indiv_attr_event_sub
2477 indiv_attr_event_sub : event_detail_sub
2481 /* INDIVIDUAL EVENT STRUCTURE */
2482 indiv_even_struc_sub : indiv_birt_sect
2484 | indiv_adop_sect /* 0:M */
2485 | indiv_even_sect /* 0:M */
2488 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2490 = start_element(ELT_SUB_INDIV_BIRT,
2492 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2498 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2502 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2503 | TAG_CHR { $$ = $1; START1(CHR) }
2506 indiv_birt_subs : /* empty */
2507 | indiv_birt_subs indiv_birt_sub
2510 indiv_birt_sub : event_detail_sub
2511 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2515 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2516 { struct xref_value *xr = gedcom_parse_xref($4,
2519 if (xr == NULL) HANDLE_ERROR;
2521 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2523 GEDCOM_MAKE_XREF_PTR(val1, xr));
2524 START(FAMC, $<ctxt>$)
2529 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2534 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2536 = start_element(ELT_SUB_INDIV_GEN,
2538 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2544 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2548 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2549 | TAG_BURI { $$ = $1; START1(BURI) }
2550 | TAG_CREM { $$ = $1; START1(CREM) }
2551 | TAG_BAPM { $$ = $1; START1(BAPM) }
2552 | TAG_BARM { $$ = $1; START1(BARM) }
2553 | TAG_BASM { $$ = $1; START1(BASM) }
2554 | TAG_BLES { $$ = $1; START1(BLES) }
2555 | TAG_CHRA { $$ = $1; START1(CHRA) }
2556 | TAG_CONF { $$ = $1; START1(CONF) }
2557 | TAG_FCOM { $$ = $1; START1(FCOM) }
2558 | TAG_ORDN { $$ = $1; START1(ORDN) }
2559 | TAG_NATU { $$ = $1; START1(NATU) }
2560 | TAG_EMIG { $$ = $1; START1(EMIG) }
2561 | TAG_IMMI { $$ = $1; START1(IMMI) }
2562 | TAG_CENS { $$ = $1; START1(CENS) }
2563 | TAG_PROB { $$ = $1; START1(PROB) }
2564 | TAG_WILL { $$ = $1; START1(WILL) }
2565 | TAG_GRAD { $$ = $1; START1(GRAD) }
2566 | TAG_RETI { $$ = $1; START1(RETI) }
2569 indiv_gen_subs : /* empty */
2570 | indiv_gen_subs indiv_gen_sub
2573 indiv_gen_sub : event_detail_sub
2577 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2579 = start_element(ELT_SUB_INDIV_ADOP,
2581 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2582 START(ADOP, $<ctxt>$) }
2586 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2590 indiv_adop_subs : /* empty */
2591 | indiv_adop_subs indiv_adop_sub
2594 indiv_adop_sub : event_detail_sub
2595 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2599 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2600 { struct xref_value *xr = gedcom_parse_xref($4,
2603 if (xr == NULL) HANDLE_ERROR;
2605 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2607 GEDCOM_MAKE_XREF_PTR(val1, xr));
2608 START(FAMC, $<ctxt>$) }
2609 indiv_adop_famc_subs
2612 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2617 indiv_adop_famc_subs : /* empty */
2618 | indiv_adop_famc_subs indiv_adop_famc_sub
2621 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2625 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2627 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2629 GEDCOM_MAKE_STRING(val1, $4));
2630 START(ADOP, $<ctxt>$) }
2634 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2635 PARENT, $<ctxt>5, NULL);
2639 indiv_even_sect : OPEN DELIM TAG_EVEN
2640 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2641 PARENT, $1, $3, NULL,
2642 GEDCOM_MAKE_NULL(val1));
2643 START(EVEN, $<ctxt>$) }
2647 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2651 /* LDS INDIVIDUAL ORDINANCE */
2652 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2653 | lio_slgc_sect /* 0:M */
2656 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2657 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2658 PARENT, $1, $3, NULL,
2659 GEDCOM_MAKE_NULL(val1));
2665 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2669 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2670 | TAG_CONL { $$ = $1; START1(CONL) }
2671 | TAG_ENDL { $$ = $1; START1(ENDL) }
2674 lio_bapl_subs : /* empty */
2675 | lio_bapl_subs lio_bapl_sub
2678 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2679 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2680 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2681 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2687 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2688 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2690 GEDCOM_MAKE_STRING(val1, $4));
2691 START(STAT, $<ctxt>$)
2696 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2700 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2701 { struct date_value dv = gedcom_parse_date($4);
2702 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2704 GEDCOM_MAKE_DATE(val1, dv));
2705 START(DATE, $<ctxt>$)
2710 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2714 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2715 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2717 GEDCOM_MAKE_STRING(val1, $4));
2718 START(TEMP, $<ctxt>$)
2723 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2727 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2728 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2730 GEDCOM_MAKE_STRING(val1, $4));
2731 START(PLAC, $<ctxt>$)
2736 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2741 lio_slgc_sect : OPEN DELIM TAG_SLGC
2742 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2743 PARENT, $1, $3, NULL,
2744 GEDCOM_MAKE_NULL(val1));
2745 START(SLGC, $<ctxt>$)
2750 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2754 lio_slgc_subs : /* empty */
2755 | lio_slgc_subs lio_slgc_sub
2758 lio_slgc_sub : lio_bapl_sub
2759 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2762 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2763 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2765 if (xr == NULL) HANDLE_ERROR;
2767 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2769 GEDCOM_MAKE_XREF_PTR(val1, xr));
2770 START(FAMC, $<ctxt>$)
2775 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2780 /* LDS SPOUSE SEALING */
2781 lds_spouse_seal_sub : lss_slgs_sect
2784 lss_slgs_sect : OPEN DELIM TAG_SLGS
2785 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2786 PARENT, $1, $3, NULL,
2787 GEDCOM_MAKE_NULL(val1));
2788 START(SLGS, $<ctxt>$) }
2792 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2796 lss_slgs_subs : /* empty */
2797 | lss_slgs_subs lss_slgs_sub
2800 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2801 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2802 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2803 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2809 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2810 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2812 GEDCOM_MAKE_STRING(val1, $4));
2813 START(STAT, $<ctxt>$)
2818 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2822 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2823 { struct date_value dv = gedcom_parse_date($4);
2824 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2826 GEDCOM_MAKE_DATE(val1, dv));
2827 START(DATE, $<ctxt>$)
2832 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2836 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2837 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2839 GEDCOM_MAKE_STRING(val1, $4));
2840 START(TEMP, $<ctxt>$)
2845 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2849 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2850 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2852 GEDCOM_MAKE_STRING(val1, $4));
2853 START(PLAC, $<ctxt>$)
2858 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2863 /* MULTIMEDIA LINK */
2864 multim_link_sub : multim_obje_link_sect
2865 | multim_obje_emb_sect
2868 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2869 { struct xref_value *xr = gedcom_parse_xref($5,
2872 if (xr == NULL) HANDLE_ERROR;
2874 = start_element(ELT_SUB_MULTIM_OBJE,
2876 GEDCOM_MAKE_XREF_PTR(val1, xr));
2877 START(OBJE, $<ctxt>$)
2882 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2887 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2888 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2889 PARENT, $1, $3, NULL,
2890 GEDCOM_MAKE_NULL(val1));
2891 START(OBJE, $<ctxt>$)
2893 multim_obje_emb_subs
2894 { CHECK2(FORM,FILE) }
2896 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2901 multim_obje_emb_subs : /* empty */
2902 | multim_obje_emb_subs multim_obje_emb_sub
2905 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2906 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2907 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2912 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2914 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2916 GEDCOM_MAKE_STRING(val1, $4));
2917 START(FORM, $<ctxt>$)
2922 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2923 PARENT, $<ctxt>5, NULL);
2926 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2928 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2930 GEDCOM_MAKE_STRING(val1, $4));
2931 START(TITL, $<ctxt>$)
2936 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2937 PARENT, $<ctxt>5, NULL);
2940 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2942 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2944 GEDCOM_MAKE_STRING(val1, $4));
2945 START(FILE, $<ctxt>$)
2950 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2951 PARENT, $<ctxt>5, NULL);
2955 /* NOTE STRUCTURE */
2956 note_struc_sub : note_struc_link_sect /* 0:M */
2957 | note_struc_emb_sect /* 0:M */
2960 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2961 { struct xref_value *xr = gedcom_parse_xref($5,
2964 if (xr == NULL) HANDLE_ERROR;
2966 = start_element(ELT_SUB_NOTE,
2968 GEDCOM_MAKE_XREF_PTR(val1, xr));
2969 START(NOTE, $<ctxt>$)
2971 note_struc_link_subs
2974 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
2978 note_struc_link_subs : /* empty */
2979 | note_struc_link_subs note_struc_link_sub
2982 note_struc_link_sub : source_cit_sub
2986 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
2988 = start_element(ELT_SUB_NOTE,
2990 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2991 START(NOTE, $<ctxt>$)
2996 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3000 note_struc_emb_subs : /* empty */
3001 | note_struc_emb_subs note_struc_emb_sub
3004 note_struc_emb_sub : continuation_sub
3009 /* PERSONAL NAME STRUCTURE */
3010 pers_name_struc_sub : pers_name_sect /* 0:M */
3013 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3014 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3016 GEDCOM_MAKE_STRING(val1, $4));
3017 START(NAME, $<ctxt>$)
3022 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3026 pers_name_subs : /* empty */
3027 | pers_name_subs pers_name_sub
3030 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3031 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3032 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3033 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3034 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3035 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3041 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3042 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3044 GEDCOM_MAKE_STRING(val1, $4));
3045 START(NPFX, $<ctxt>$)
3050 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3054 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3055 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3057 GEDCOM_MAKE_STRING(val1, $4));
3058 START(GIVN, $<ctxt>$)
3063 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3067 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3068 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3070 GEDCOM_MAKE_STRING(val1, $4));
3071 START(NICK, $<ctxt>$)
3076 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3080 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3081 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3083 GEDCOM_MAKE_STRING(val1, $4));
3084 START(SPFX, $<ctxt>$)
3089 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3093 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3094 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3096 GEDCOM_MAKE_STRING(val1, $4));
3097 START(SURN, $<ctxt>$)
3102 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3106 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3107 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3109 GEDCOM_MAKE_STRING(val1, $4));
3110 START(NSFX, $<ctxt>$)
3115 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3120 /* PLACE STRUCTURE */
3121 place_struc_sub : place_struc_plac_sect /* 0:M */
3124 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3126 = start_element(ELT_SUB_PLAC,
3128 GEDCOM_MAKE_STRING(val1, $4));
3129 START(PLAC, $<ctxt>$)
3131 place_struc_plac_subs
3134 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3138 place_struc_plac_subs : /* empty */
3139 | place_struc_plac_subs place_struc_plac_sub
3142 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3148 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3150 = start_element(ELT_SUB_PLAC_FORM,
3152 GEDCOM_MAKE_STRING(val1, $4));
3153 START(FORM, $<ctxt>$)
3158 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3163 /* SOURCE_CITATION */
3164 source_cit_sub : source_cit_link_sect /* 0:M */
3165 | source_cit_emb_sect /* 0:M */
3168 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3169 { struct xref_value *xr = gedcom_parse_xref($5,
3172 if (xr == NULL) HANDLE_ERROR;
3174 = start_element(ELT_SUB_SOUR,
3176 GEDCOM_MAKE_XREF_PTR(val1, xr));
3177 START(SOUR, $<ctxt>$)
3179 source_cit_link_subs
3182 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3186 source_cit_link_subs : /* empty */
3187 | source_cit_link_subs source_cit_link_sub
3190 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3191 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3192 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3193 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3199 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3201 = start_element(ELT_SUB_SOUR_PAGE,
3203 GEDCOM_MAKE_STRING(val1, $4));
3204 START(PAGE, $<ctxt>$)
3209 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3214 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3216 = start_element(ELT_SUB_SOUR_EVEN,
3218 GEDCOM_MAKE_STRING(val1, $4));
3219 START(EVEN, $<ctxt>$)
3221 source_cit_even_subs
3224 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3229 source_cit_even_subs : /* empty */
3230 | source_cit_even_subs source_cit_even_sub
3233 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3237 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3239 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3241 GEDCOM_MAKE_STRING(val1, $4));
3242 START(ROLE, $<ctxt>$)
3247 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3248 PARENT, $<ctxt>5, NULL);
3252 source_cit_data_sect : OPEN DELIM TAG_DATA
3253 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3254 PARENT, $1, $3, NULL,
3255 GEDCOM_MAKE_NULL(val1));
3256 START(DATA, $<ctxt>$)
3258 source_cit_data_subs
3261 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3266 source_cit_data_subs : /* empty */
3267 | source_cit_data_subs source_cit_data_sub
3270 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3271 | source_cit_text_sect /* 0:M */
3275 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3276 { struct date_value dv = gedcom_parse_date($4);
3278 = start_element(ELT_SUB_SOUR_DATA_DATE,
3280 GEDCOM_MAKE_DATE(val1, dv));
3281 START(DATE, $<ctxt>$)
3286 { end_element(ELT_SUB_SOUR_DATA_DATE,
3287 PARENT, $<ctxt>5, NULL);
3291 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3293 = start_element(ELT_SUB_SOUR_TEXT,
3295 GEDCOM_MAKE_STRING(val1, $4));
3296 START(TEXT, $<ctxt>$)
3298 source_cit_text_subs
3301 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3306 source_cit_text_subs : /* empty */
3307 | source_cit_text_subs source_cit_text_sub
3310 source_cit_text_sub : continuation_sub
3314 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3316 = start_element(ELT_SUB_SOUR_QUAY,
3318 GEDCOM_MAKE_STRING(val1, $4));
3319 START(QUAY, $<ctxt>$)
3324 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3329 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3330 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3332 GEDCOM_MAKE_STRING(val1, $4));
3333 START(SOUR, $<ctxt>$)
3338 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3342 source_cit_emb_subs : /* empty */
3343 | source_cit_emb_subs source_cit_emb_sub
3346 source_cit_emb_sub : continuation_sub
3347 | source_cit_text_sect /* 0:M */
3352 /* SOURCE REPOSITORY CITATION */
3353 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3356 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3357 { struct xref_value *xr
3358 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3359 if (xr == NULL) HANDLE_ERROR;
3361 = start_element(ELT_SUB_REPO,
3363 GEDCOM_MAKE_XREF_PTR(val1, xr));
3364 START(REPO, $<ctxt>$)
3366 source_repos_repo_subs
3369 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3373 source_repos_repo_subs : /* empty */
3374 | source_repos_repo_subs source_repos_repo_sub
3377 source_repos_repo_sub : note_struc_sub
3378 | caln_sect /* 0:M */
3382 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3383 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3385 GEDCOM_MAKE_STRING(val1, $4));
3386 START(CALN, $<ctxt>$)
3391 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3395 caln_subs : /* empty */
3396 | caln_subs caln_sub
3399 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3403 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3404 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3406 GEDCOM_MAKE_STRING(val1, $4));
3407 START(MEDI, $<ctxt>$)
3412 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3416 /* SPOUSE TO FAMILY LINK */
3417 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3420 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3421 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3423 if (xr == NULL) HANDLE_ERROR;
3425 = start_element(ELT_SUB_FAMS,
3427 GEDCOM_MAKE_XREF_PTR(val1, xr));
3428 START(FAMS, $<ctxt>$)
3433 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3437 spou_fam_fams_subs : /* empty */
3438 | spou_fam_fams_subs spou_fam_fams_sub
3441 spou_fam_fams_sub : note_struc_sub
3445 /*********************************************************************/
3447 /*********************************************************************/
3449 no_std_subs : /* empty */
3450 | no_std_subs no_std_sub
3453 no_std_sub : user_sect /* 0:M */
3455 | error error_subs CLOSE { HANDLE_ERROR }
3458 no_std_rec : user_rec /* 0:M */
3460 | error error_subs CLOSE { HANDLE_ERROR }
3463 user_rec : OPEN DELIM opt_xref USERTAG
3464 { if ($4.string[0] != '_') {
3465 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3471 { struct xref_value *xr = NULL;
3473 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3474 if (xr == NULL) HANDLE_ERROR;
3476 $<ctxt>$ = start_record(REC_USER,
3478 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3485 { end_record(REC_USER, $<ctxt>7); }
3487 user_sect : OPEN DELIM opt_xref USERTAG
3488 { if ($4.string[0] != '_') {
3489 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3495 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3496 START($4, $<ctxt>$);
3501 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3505 user_sects : /* empty */ { }
3506 | user_sects user_sect { }
3509 opt_xref : /* empty */ { $$ = NULL; }
3510 | POINTER DELIM { $$ = $1; }
3513 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3515 | DELIM POINTER { struct xref_value *xr
3516 = gedcom_parse_xref($2, XREF_USED,
3518 GEDCOM_MAKE_XREF_PTR(val2, xr);
3520 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3524 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3525 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3529 mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
3530 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3534 opt_line_item : /* empty */ { $$ = NULL; }
3535 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3539 line_item : anychar { size_t i;
3540 CLEAR_BUFFER(line_item_buf);
3541 line_item_buf_ptr = line_item_buf;
3542 /* The following also takes care of '@@' */
3543 if (!strncmp($1, "@@", 3))
3544 *line_item_buf_ptr++ = '@';
3546 for (i=0; i < strlen($1); i++)
3547 *line_item_buf_ptr++ = $1[i];
3550 | ESCAPE { size_t i;
3551 CLEAR_BUFFER(line_item_buf);
3552 line_item_buf_ptr = line_item_buf;
3553 for (i=0; i < strlen($1); i++)
3554 *line_item_buf_ptr++ = $1[i];
3559 /* The following also takes care of '@@' */
3560 if (!strncmp($2, "@@", 3))
3561 *line_item_buf_ptr++ = '@';
3563 for (i=0; i < strlen($2); i++)
3564 *line_item_buf_ptr++ = $2[i];
3569 for (i=0; i < strlen($2); i++)
3570 *line_item_buf_ptr++ = $2[i];
3575 anychar : ANYCHAR { }
3579 error_subs : /* empty */
3580 | error_subs error_sect
3583 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3585 gen_sect : OPEN DELIM opt_xref anystdtag
3586 { INVALID_TAG($4.string); }
3587 opt_value opt_sects CLOSE
3591 gen_rec : gen_rec_top
3595 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3596 { INVALID_TOP_TAG($4.string) }
3597 opt_value opt_sects CLOSE
3601 gen_rec_top : OPEN DELIM anytoptag
3602 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3603 opt_value opt_sects CLOSE
3607 opt_sects : /* empty */ { }
3608 | opt_sects gen_sect { }
3611 anytag : USERTAG { }
3625 anystdtag : TAG_ABBR
3755 /* Functions that handle the counting of subtags */
3757 int* count_arrays[MAXGEDCLEVEL+1];
3758 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3759 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3761 void push_countarray()
3764 if (count_level > MAXGEDCLEVEL) {
3765 gedcom_error(_("Internal error: count array overflow"));
3769 count = (int *)calloc(YYNTOKENS, sizeof(int));
3770 if (count == NULL) {
3771 gedcom_error(_("Internal error: count array calloc error"));
3775 count_arrays[count_level] = count;
3780 void set_parenttag(char* tag)
3782 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3785 void set_parentctxt(Gedcom_ctxt ctxt)
3787 ctxt_stack[count_level+1] = ctxt;
3790 char* get_parenttag()
3792 return tag_stack[count_level];
3795 Gedcom_ctxt get_parentctxt()
3797 return ctxt_stack[count_level];
3800 int count_tag(int tag)
3802 int *count = count_arrays[count_level];
3803 return ++count[tag - GEDCOMTAGOFFSET];
3806 int check_occurrence(int tag)
3808 int *count = count_arrays[count_level];
3809 return (count[tag - GEDCOMTAGOFFSET] > 0);
3812 void pop_countarray()
3815 if (count_level < 0) {
3816 gedcom_error(_("Internal error: count array underflow"));
3820 count = count_arrays[count_level];
3822 count_arrays[count_level] = NULL;
3826 /* Enabling debug mode */
3827 /* level 0: no debugging */
3828 /* level 1: only internal */
3829 /* level 2: also bison */
3832 void gedcom_set_debug_level(int level, FILE* f)
3837 trace_output = stderr;
3839 gedcom_high_level_debug = 1;
3848 int gedcom_debug_print(char* s, ...)
3851 if (gedcom_high_level_debug) {
3854 res = vfprintf(trace_output, s, ap);
3856 fprintf(trace_output, "\n");
3861 /* Setting the error mechanism */
3862 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3864 error_mechanism = mechanism;
3867 /* Compatibility handling */
3869 void gedcom_set_compat_handling(int enable_compat)
3871 compat_enabled = enable_compat;
3874 void set_compatibility(char* program)
3876 if (compat_enabled) {
3877 if (! strncmp(program, "ftree", 6)) {
3878 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3879 compatibility = C_FTREE;
3887 int compat_mode(int compat_flags)
3889 return (compat_flags & compatibility);