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"
153 int compat_enabled = 1;
154 int gedcom_high_level_debug = 0;
155 int compatibility = 0;
156 Gedcom_err_mech error_mechanism = IMMED_FAIL;
157 Gedcom_val_struct val1;
158 Gedcom_val_struct val2;
160 char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
161 char *line_item_buf_ptr;
167 /* These are defined at the bottom of the file */
168 void push_countarray();
169 void set_parenttag(char* tag);
170 char* get_parenttag();
171 void set_parentctxt(Gedcom_ctxt ctxt);
172 Gedcom_ctxt get_parentctxt();
173 void pop_countarray();
174 int count_tag(int tag);
175 int check_occurrence(int tag);
176 void set_compatibility(char* program);
177 int compat_mode(int flags);
179 #define CLEAR_BUFFER(BUF) \
180 memset(BUF, 0, sizeof(BUF));
182 #define HANDLE_ERROR \
183 { if (error_mechanism == IMMED_FAIL) { \
186 else if (error_mechanism == DEFER_FAIL) { \
189 else if (error_mechanism == IGNORE_ERRORS) { \
193 #define START1(PARENTTAG) \
194 { set_parenttag(#PARENTTAG); \
196 #define START2(PARENTCTXT) \
197 { set_parentctxt(PARENTCTXT); \
201 #define START(PARENTTAG,PARENTCTXT) \
202 { START1(PARENTTAG); \
203 START2(PARENTCTXT); \
208 { if (!check_occurrence(TAG_##TAG)) { \
209 char* parenttag = get_parenttag(); \
210 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
216 { pop_countarray(); \
220 #define CHECK1(TAG1) { CHK(TAG1); POP; }
221 #define CHECK2(TAG1,TAG2) \
222 { CHK(TAG1); CHK(TAG2); POP; }
223 #define CHECK3(TAG1,TAG2,TAG3) \
224 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
225 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
226 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
227 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
228 #define OCCUR2(CHILDTAG, MIN, MAX) \
229 { int num = count_tag(TAG_##CHILDTAG); \
231 char* parenttag = get_parenttag(); \
232 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
233 #CHILDTAG, MAX, parenttag); \
237 #define INVALID_TAG(CHILDTAG) \
238 { char* parenttag = get_parenttag(); \
239 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
240 CHILDTAG, parenttag); \
243 #define INVALID_TOP_TAG(CHILDTAG) \
244 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
254 struct tag_struct tag;
261 %token <string> BADTOKEN
263 %token <string> CLOSE
264 %token <string> ESCAPE
265 %token <string> DELIM
266 %token <string> ANYCHAR
267 %token <string> POINTER
269 %token <tag> TAG_ABBR
270 %token <tag> TAG_ADDR
271 %token <tag> TAG_ADR1
272 %token <tag> TAG_ADR2
273 %token <tag> TAG_ADOP
276 %token <tag> TAG_AGNC
277 %token <tag> TAG_ALIA
278 %token <tag> TAG_ANCE
279 %token <tag> TAG_ANCI
280 %token <tag> TAG_ANUL
281 %token <tag> TAG_ASSO
282 %token <tag> TAG_AUTH
283 %token <tag> TAG_BAPL
284 %token <tag> TAG_BAPM
285 %token <tag> TAG_BARM
286 %token <tag> TAG_BASM
287 %token <tag> TAG_BIRT
288 %token <tag> TAG_BLES
289 %token <tag> TAG_BLOB
290 %token <tag> TAG_BURI
291 %token <tag> TAG_CALN
292 %token <tag> TAG_CAST
293 %token <tag> TAG_CAUS
294 %token <tag> TAG_CENS
295 %token <tag> TAG_CHAN
296 %token <tag> TAG_CHAR
297 %token <tag> TAG_CHIL
299 %token <tag> TAG_CHRA
300 %token <tag> TAG_CITY
301 %token <tag> TAG_CONC
302 %token <tag> TAG_CONF
303 %token <tag> TAG_CONL
304 %token <tag> TAG_CONT
305 %token <tag> TAG_COPR
306 %token <tag> TAG_CORP
307 %token <tag> TAG_CREM
308 %token <tag> TAG_CTRY
309 %token <tag> TAG_DATA
310 %token <tag> TAG_DATE
311 %token <tag> TAG_DEAT
312 %token <tag> TAG_DESC
313 %token <tag> TAG_DESI
314 %token <tag> TAG_DEST
316 %token <tag> TAG_DIVF
317 %token <tag> TAG_DSCR
318 %token <tag> TAG_EDUC
319 %token <tag> TAG_EMIG
320 %token <tag> TAG_ENDL
321 %token <tag> TAG_ENGA
322 %token <tag> TAG_EVEN
324 %token <tag> TAG_FAMC
325 %token <tag> TAG_FAMF
326 %token <tag> TAG_FAMS
327 %token <tag> TAG_FCOM
328 %token <tag> TAG_FILE
329 %token <tag> TAG_FORM
330 %token <tag> TAG_GEDC
331 %token <tag> TAG_GIVN
332 %token <tag> TAG_GRAD
333 %token <tag> TAG_HEAD
334 %token <tag> TAG_HUSB
335 %token <tag> TAG_IDNO
336 %token <tag> TAG_IMMI
337 %token <tag> TAG_INDI
338 %token <tag> TAG_LANG
339 %token <tag> TAG_LEGA
340 %token <tag> TAG_MARB
341 %token <tag> TAG_MARC
342 %token <tag> TAG_MARL
343 %token <tag> TAG_MARR
344 %token <tag> TAG_MARS
345 %token <tag> TAG_MEDI
346 %token <tag> TAG_NAME
347 %token <tag> TAG_NATI
348 %token <tag> TAG_NATU
349 %token <tag> TAG_NCHI
350 %token <tag> TAG_NICK
352 %token <tag> TAG_NOTE
353 %token <tag> TAG_NPFX
354 %token <tag> TAG_NSFX
355 %token <tag> TAG_OBJE
356 %token <tag> TAG_OCCU
357 %token <tag> TAG_ORDI
358 %token <tag> TAG_ORDN
359 %token <tag> TAG_PAGE
360 %token <tag> TAG_PEDI
361 %token <tag> TAG_PHON
362 %token <tag> TAG_PLAC
363 %token <tag> TAG_POST
364 %token <tag> TAG_PROB
365 %token <tag> TAG_PROP
366 %token <tag> TAG_PUBL
367 %token <tag> TAG_QUAY
368 %token <tag> TAG_REFN
369 %token <tag> TAG_RELA
370 %token <tag> TAG_RELI
371 %token <tag> TAG_REPO
372 %token <tag> TAG_RESI
373 %token <tag> TAG_RESN
374 %token <tag> TAG_RETI
377 %token <tag> TAG_ROLE
379 %token <tag> TAG_SLGC
380 %token <tag> TAG_SLGS
381 %token <tag> TAG_SOUR
382 %token <tag> TAG_SPFX
384 %token <tag> TAG_STAE
385 %token <tag> TAG_STAT
386 %token <tag> TAG_SUBM
387 %token <tag> TAG_SUBN
388 %token <tag> TAG_SURN
389 %token <tag> TAG_TEMP
390 %token <tag> TAG_TEXT
391 %token <tag> TAG_TIME
392 %token <tag> TAG_TITL
393 %token <tag> TAG_TRLR
394 %token <tag> TAG_TYPE
395 %token <tag> TAG_VERS
396 %token <tag> TAG_WIFE
397 %token <tag> TAG_WILL
399 %type <tag> anystdtag
400 %type <tag> anytoptag
401 %type <tag> fam_event_tag
402 %type <tag> indiv_attr_tag
403 %type <tag> indiv_birt_tag
404 %type <tag> indiv_gen_tag
405 %type <tag> lio_bapl_tag
406 %type <string> line_item
407 %type <string> mand_line_item
408 %type <string> mand_pointer
409 %type <string> note_line_item
410 %type <string> anychar
411 %type <string> opt_xref
412 %type <string> opt_value
413 %type <string> opt_line_item
414 %type <ctxt> head_sect
418 file : head_sect records trlr_sect
419 { if (fail == 1) YYABORT; }
422 records : /* empty */
437 /*********************************************************************/
439 /*********************************************************************/
440 head_sect : OPEN DELIM TAG_HEAD
441 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
443 NULL, GEDCOM_MAKE_NULL(val2));
444 START(HEAD, $<ctxt>$) }
446 { if (compat_mode(C_FTREE))
447 CHECK3(SOUR, GEDC, CHAR)
449 CHECK4(SOUR, SUBM, GEDC, CHAR)
452 { end_record(REC_HEAD, $<ctxt>4); }
455 head_subs : /* empty */
459 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
460 | head_dest_sect { OCCUR2(DEST, 0, 1) }
461 | head_date_sect { OCCUR2(DATE, 0, 1) }
462 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
463 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
464 | head_file_sect { OCCUR2(FILE, 0, 1) }
465 | head_copr_sect { OCCUR2(COPR, 0, 1) }
466 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
467 | head_char_sect { OCCUR2(CHAR, 1, 1) }
468 | head_lang_sect { OCCUR2(LANG, 0, 1) }
469 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
470 | head_note_sect { OCCUR2(NOTE, 0, 1) }
475 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
476 { set_compatibility($4);
477 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
479 GEDCOM_MAKE_STRING(val1, $4));
480 START(SOUR, $<ctxt>$)
485 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
488 head_sour_subs : /* empty */
489 | head_sour_subs head_sour_sub
492 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
493 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
494 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
495 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
499 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
500 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
502 GEDCOM_MAKE_STRING(val1, $4));
503 START(VERS, $<ctxt>$)
508 { end_element(ELT_HEAD_SOUR_VERS,
509 PARENT, $<ctxt>5, NULL);
512 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
513 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
515 GEDCOM_MAKE_STRING(val1, $4));
516 START(NAME, $<ctxt>$)
521 { end_element(ELT_HEAD_SOUR_NAME,
522 PARENT, $<ctxt>5, NULL);
525 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
526 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
528 GEDCOM_MAKE_STRING(val1, $4));
529 START(CORP, $<ctxt>$)
534 { end_element(ELT_HEAD_SOUR_CORP,
535 PARENT, $<ctxt>5, NULL);
539 head_sour_corp_subs : /* empty */
540 | head_sour_corp_subs head_sour_corp_sub
543 head_sour_corp_sub : addr_struc_sub /* 0:1 */
547 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
548 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
550 GEDCOM_MAKE_STRING(val1, $4));
551 START(DATA, $<ctxt>$)
556 { end_element(ELT_HEAD_SOUR_DATA,
557 PARENT, $<ctxt>5, NULL);
561 head_sour_data_subs : /* empty */
562 | head_sour_data_subs head_sour_data_sub
565 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
566 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
570 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
571 { struct date_value dv = gedcom_parse_date($4);
573 = start_element(ELT_HEAD_SOUR_DATA_DATE,
575 GEDCOM_MAKE_DATE(val1, dv));
576 START(DATE, $<ctxt>$)
581 { end_element(ELT_HEAD_SOUR_DATA_DATE,
582 PARENT, $<ctxt>5, NULL);
585 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
587 = start_element(ELT_HEAD_SOUR_DATA_COPR,
589 GEDCOM_MAKE_STRING(val1, $4));
590 START(COPR, $<ctxt>$)
595 { end_element(ELT_HEAD_SOUR_DATA_COPR,
596 PARENT, $<ctxt>5, NULL);
601 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
602 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
604 GEDCOM_MAKE_STRING(val1, $4));
605 START(DEST, $<ctxt>$)
610 { end_element(ELT_HEAD_DEST,
611 PARENT, $<ctxt>5, NULL);
616 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
617 { struct date_value dv = gedcom_parse_date($4);
618 $<ctxt>$ = start_element(ELT_HEAD_DATE,
620 GEDCOM_MAKE_DATE(val1, dv));
621 START(DATE, $<ctxt>$)
626 { end_element(ELT_HEAD_DATE,
627 PARENT, $<ctxt>5, NULL);
631 head_date_subs : /* empty */
632 | head_date_subs head_date_sub
635 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
639 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
640 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
642 GEDCOM_MAKE_STRING(val1, $4));
643 START(TIME, $<ctxt>$)
648 { end_element(ELT_HEAD_DATE_TIME,
649 PARENT, $<ctxt>5, NULL);
654 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
655 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
657 if (xr == NULL) HANDLE_ERROR;
658 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
660 GEDCOM_MAKE_XREF_PTR(val1, xr));
661 START(SUBM, $<ctxt>$)
666 { end_element(ELT_HEAD_SUBM,
667 PARENT, $<ctxt>5, NULL);
671 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
672 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
674 if (xr == NULL) HANDLE_ERROR;
675 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
677 GEDCOM_MAKE_XREF_PTR(val1, xr));
678 START(SUBN, $<ctxt>$)
683 { end_element(ELT_HEAD_SUBN,
684 PARENT, $<ctxt>5, NULL);
688 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
689 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
691 GEDCOM_MAKE_STRING(val1, $4));
692 START(FILE, $<ctxt>$)
697 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
701 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
702 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
704 GEDCOM_MAKE_STRING(val1, $4));
705 START(COPR, $<ctxt>$)
710 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
714 head_gedc_sect : OPEN DELIM TAG_GEDC
715 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
716 PARENT, $1, $3, NULL,
717 GEDCOM_MAKE_NULL(val1));
718 START(GEDC, $<ctxt>$)
721 { CHECK2(VERS, FORM) }
723 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
727 head_gedc_subs : /* empty */
728 | head_gedc_subs head_gedc_sub
731 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
732 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
735 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
736 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
738 GEDCOM_MAKE_STRING(val1, $4));
739 START(VERS, $<ctxt>$)
744 { end_element(ELT_HEAD_GEDC_VERS,
745 PARENT, $<ctxt>5, NULL);
748 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
749 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
751 GEDCOM_MAKE_STRING(val1, $4));
752 START(FORM, $<ctxt>$)
757 { end_element(ELT_HEAD_GEDC_FORM,
758 PARENT, $<ctxt>5, NULL);
763 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
764 { /* Don't allow to continue if conversion context couldn't
766 if (open_conv_to_internal($4) == 0) YYABORT;
767 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
769 GEDCOM_MAKE_STRING(val1, $4));
770 START(CHAR, $<ctxt>$)
775 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
779 head_char_subs : /* empty */
780 | head_char_subs head_char_sub
783 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
786 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
787 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
789 GEDCOM_MAKE_STRING(val1, $4));
790 START(VERS, $<ctxt>$)
795 { end_element(ELT_HEAD_CHAR_VERS,
796 PARENT, $<ctxt>5, NULL);
801 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
802 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
804 GEDCOM_MAKE_STRING(val1, $4));
805 START(LANG, $<ctxt>$)
810 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
814 head_plac_sect : OPEN DELIM TAG_PLAC
815 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
816 PARENT, $1, $3, NULL,
817 GEDCOM_MAKE_NULL(val1));
818 START(PLAC, $<ctxt>$)
823 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
827 head_plac_subs : /* empty */
828 | head_plac_subs head_plac_sub
831 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
834 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
835 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
837 GEDCOM_MAKE_STRING(val1, $4));
838 START(FORM, $<ctxt>$)
843 { end_element(ELT_HEAD_PLAC_FORM,
844 PARENT, $<ctxt>5, NULL);
849 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
850 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
852 GEDCOM_MAKE_STRING(val1, $4));
853 START(NOTE, $<ctxt>$)
858 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
862 head_note_subs : /* empty */
863 | head_note_subs head_note_sub
866 head_note_sub : continuation_sub /* 0:M */
870 /*********************************************************************/
872 /*********************************************************************/
873 /* Don't need callbacks here, there is no information... */
874 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
877 /*********************************************************************/
878 /**** Family record ****/
879 /*********************************************************************/
880 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
881 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
883 if (xr == NULL) HANDLE_ERROR;
884 $<ctxt>$ = start_record(REC_FAM,
885 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
887 NULL, GEDCOM_MAKE_NULL(val2));
888 START(FAM, $<ctxt>$) }
892 { end_record(REC_FAM, $<ctxt>6); }
895 fam_subs : /* empty */
899 fam_sub : fam_event_struc_sub /* 0:M */
900 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
901 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
902 | fam_chil_sect /* 0:M */
903 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
904 | fam_subm_sect /* 0:M */
905 | lds_spouse_seal_sub /* 0:M */
906 | source_cit_sub /* 0:M */
907 | multim_link_sub /* 0:M */
908 | note_struc_sub /* 0:M */
909 | ident_struc_sub /* 0:1 */
910 | change_date_sub /* 0:1 */
915 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
916 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
918 if (xr == NULL) HANDLE_ERROR;
919 $<ctxt>$ = start_element(ELT_FAM_HUSB,
921 GEDCOM_MAKE_XREF_PTR(val1, xr));
922 START(HUSB, $<ctxt>$)
927 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
932 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
933 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
935 if (xr == NULL) HANDLE_ERROR;
936 $<ctxt>$ = start_element(ELT_FAM_WIFE,
938 GEDCOM_MAKE_XREF_PTR(val1, xr));
939 START(WIFE, $<ctxt>$)
944 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
949 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
950 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
952 if (xr == NULL) HANDLE_ERROR;
953 $<ctxt>$ = start_element(ELT_FAM_CHIL,
955 GEDCOM_MAKE_XREF_PTR(val1, xr));
956 START(CHIL, $<ctxt>$)
961 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
966 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
967 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
969 GEDCOM_MAKE_STRING(val1, $4));
970 START(NCHI, $<ctxt>$)
975 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
980 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
981 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
983 if (xr == NULL) HANDLE_ERROR;
984 $<ctxt>$ = start_element(ELT_FAM_SUBM,
986 GEDCOM_MAKE_XREF_PTR(val1, xr));
987 START(SUBM, $<ctxt>$)
992 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
996 /*********************************************************************/
997 /**** Individual record ****/
998 /*********************************************************************/
999 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1000 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1002 if (xr == NULL) HANDLE_ERROR;
1003 $<ctxt>$ = start_record(REC_INDI,
1004 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1005 NULL, GEDCOM_MAKE_NULL(val2));
1006 START(INDI, $<ctxt>$) }
1010 { end_record(REC_INDI, $<ctxt>6); }
1013 indi_subs : /* empty */
1014 | indi_subs indi_sub
1017 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1018 | pers_name_struc_sub /* 0:M */
1019 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1020 | indiv_even_struc_sub /* 0:M */
1021 | indiv_attr_struc_sub /* 0:M */
1022 | lds_indiv_ord_sub /* 0:M */
1023 | chi_fam_link_sub /* 0:M */
1024 | spou_fam_link_sub /* 0:M */
1025 | indi_subm_sect /* 0:M */
1026 | assoc_struc_sub /* 0:M */
1027 | indi_alia_sect /* 0:M */
1028 | indi_anci_sect /* 0:M */
1029 | indi_desi_sect /* 0:M */
1030 | source_cit_sub /* 0:M */
1031 | multim_link_sub /* 0:M */
1032 | note_struc_sub /* 0:M */
1033 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1034 | indi_afn_sect /* 0:M */
1035 | ident_struc_sub /* 0:1 */
1036 | change_date_sub /* 0:1 */
1037 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1038 INVALID_TAG("ADDR");
1044 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1045 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1047 GEDCOM_MAKE_STRING(val1, $4));
1048 START(RESN, $<ctxt>$)
1053 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1058 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1059 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1061 GEDCOM_MAKE_STRING(val1, $4));
1062 START(SEX, $<ctxt>$)
1067 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1072 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1073 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1075 if (xr == NULL) HANDLE_ERROR;
1076 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1078 GEDCOM_MAKE_XREF_PTR(val1, xr));
1079 START(SUBM, $<ctxt>$)
1084 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1089 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1090 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1092 if (xr == NULL) HANDLE_ERROR;
1093 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1095 GEDCOM_MAKE_XREF_PTR(val1, xr));
1096 START(ALIA, $<ctxt>$)
1101 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1106 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1107 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1109 if (xr == NULL) HANDLE_ERROR;
1110 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1112 GEDCOM_MAKE_XREF_PTR(val1, xr));
1113 START(ANCI, $<ctxt>$)
1118 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1123 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1124 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1126 if (xr == NULL) HANDLE_ERROR;
1127 $<ctxt>$ = start_element(ELT_INDI_DESI,
1129 GEDCOM_MAKE_XREF_PTR(val1, xr));
1130 START(DESI, $<ctxt>$)
1135 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1140 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1141 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1143 GEDCOM_MAKE_STRING(val1, $4));
1144 START(RFN, $<ctxt>$)
1149 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1154 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1155 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1157 GEDCOM_MAKE_STRING(val1, $4));
1158 START(AFN, $<ctxt>$)
1163 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1167 /* INDI.ADDR (Only for 'ftree' compatibility) */
1168 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1169 { START(ADDR, NULL) } no_std_subs { CHECK0 } CLOSE { }
1171 /*********************************************************************/
1172 /**** Multimedia record ****/
1173 /*********************************************************************/
1174 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1175 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1177 if (xr == NULL) HANDLE_ERROR;
1178 $<ctxt>$ = start_record(REC_OBJE,
1179 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1180 NULL, GEDCOM_MAKE_NULL(val2));
1181 START(OBJE, $<ctxt>$) }
1183 { CHECK2(FORM, BLOB) }
1185 { end_record(REC_OBJE, $<ctxt>6); }
1188 obje_subs : /* empty */
1189 | obje_subs obje_sub
1192 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1193 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1194 | note_struc_sub /* 0:M */
1195 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1196 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1197 | ident_struc_sub /* 0:1 */
1198 | change_date_sub /* 0:1 */
1203 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1204 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1206 GEDCOM_MAKE_STRING(val1, $4));
1207 START(FORM, $<ctxt>$)
1212 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1217 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1218 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1220 GEDCOM_MAKE_STRING(val1, $4));
1221 START(TITL, $<ctxt>$)
1226 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1231 obje_blob_sect : OPEN DELIM TAG_BLOB
1232 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1233 PARENT, $1, $3, NULL,
1234 GEDCOM_MAKE_NULL(val1));
1235 START(BLOB, $<ctxt>$)
1240 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1244 obje_blob_subs : /* empty */
1245 | obje_blob_subs obje_blob_sub
1248 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1252 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1253 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1255 GEDCOM_MAKE_STRING(val1, $4));
1256 START(CONT, $<ctxt>$)
1261 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1267 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1268 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1270 if (xr == NULL) HANDLE_ERROR;
1271 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1273 GEDCOM_MAKE_XREF_PTR(val1, xr));
1274 START(OBJE, $<ctxt>$)
1279 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1283 /*********************************************************************/
1284 /**** Note record ****/
1285 /*********************************************************************/
1286 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1287 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1289 if (xr == NULL) HANDLE_ERROR;
1290 $<ctxt>$ = start_record(REC_NOTE,
1291 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1292 $6, GEDCOM_MAKE_STRING(val2, $6));
1293 START(NOTE, $<ctxt>$) }
1297 { end_record(REC_NOTE, $<ctxt>7); }
1300 note_line_item : /* empty */
1301 { if (!compat_mode(C_FTREE)) {
1302 gedcom_error(_("Missing value")); YYERROR;
1309 { gedcom_debug_print("==Val: %s==", $2);
1313 note_subs : /* empty */
1314 | note_subs note_sub
1317 note_sub : continuation_sub /* 0:M */
1318 | source_cit_sub /* 0:M */
1319 | ident_struc_sub /* 0:1 */
1320 | change_date_sub /* 0:1 */
1324 /*********************************************************************/
1325 /**** Repository record ****/
1326 /*********************************************************************/
1327 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1328 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1330 if (xr == NULL) HANDLE_ERROR;
1331 $<ctxt>$ = start_record(REC_REPO,
1332 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1333 NULL, GEDCOM_MAKE_NULL(val2));
1334 START(REPO, $<ctxt>$) }
1338 { end_record(REC_REPO, $<ctxt>6); }
1341 repo_subs : /* empty */
1342 | repo_subs repo_sub
1345 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1346 | addr_struc_sub /* 0:1 */
1347 | note_struc_sub /* 0:M */
1348 | ident_struc_sub /* 0:1 */
1349 | change_date_sub /* 0:1 */
1354 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1355 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1357 GEDCOM_MAKE_STRING(val1, $4));
1358 START(NAME, $<ctxt>$)
1363 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1367 /*********************************************************************/
1368 /**** Source record ****/
1369 /*********************************************************************/
1370 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1371 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1373 if (xr == NULL) HANDLE_ERROR;
1374 $<ctxt>$ = start_record(REC_SOUR,
1375 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1376 NULL, GEDCOM_MAKE_NULL(val2));
1377 START(SOUR, $<ctxt>$) }
1381 { end_record(REC_SOUR, $<ctxt>6); }
1384 sour_subs : /* empty */
1385 | sour_subs sour_sub
1388 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1389 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1390 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1391 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1392 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1393 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1394 | source_repos_cit_sub /* 0:1 */
1395 | multim_link_sub /* 0:M */
1396 | note_struc_sub /* 0:M */
1397 | ident_struc_sub /* 0:1 */
1398 | change_date_sub /* 0:1 */
1403 sour_data_sect : OPEN DELIM TAG_DATA
1404 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1405 PARENT, $1, $3, NULL,
1406 GEDCOM_MAKE_NULL(val1));
1407 START(DATA, $<ctxt>$)
1412 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1416 sour_data_subs : /* empty */
1417 | sour_data_subs sour_data_sub
1420 sour_data_sub : sour_data_even_sect /* 0:M */
1421 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1422 | note_struc_sub /* 0:M */
1426 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1427 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1429 GEDCOM_MAKE_STRING(val1, $4));
1430 START(EVEN, $<ctxt>$)
1435 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1440 sour_data_even_subs : /* empty */
1441 | sour_data_even_subs sour_data_even_sub
1444 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1445 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1449 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1450 { struct date_value dv = gedcom_parse_date($4);
1452 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1454 GEDCOM_MAKE_DATE(val1, dv));
1455 START(DATE, $<ctxt>$)
1460 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1465 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1467 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1469 GEDCOM_MAKE_STRING(val1, $4));
1470 START(PLAC, $<ctxt>$)
1475 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1480 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1481 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1483 GEDCOM_MAKE_STRING(val1, $4));
1484 START(AGNC, $<ctxt>$)
1489 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1495 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1496 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1498 GEDCOM_MAKE_STRING(val1, $4));
1499 START(AUTH, $<ctxt>$)
1504 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1508 sour_auth_subs : /* empty */
1509 | sour_auth_subs sour_auth_sub
1512 sour_auth_sub : continuation_sub /* 0:M */
1517 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1518 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1520 GEDCOM_MAKE_STRING(val1, $4));
1521 START(TITL, $<ctxt>$)
1526 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1530 sour_titl_subs : /* empty */
1531 | sour_titl_subs sour_titl_sub
1534 sour_titl_sub : continuation_sub /* 0:M */
1539 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1540 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1542 GEDCOM_MAKE_STRING(val1, $4));
1543 START(ABBR, $<ctxt>$)
1548 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1553 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1554 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1556 GEDCOM_MAKE_STRING(val1, $4));
1557 START(PUBL, $<ctxt>$)
1562 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1566 sour_publ_subs : /* empty */
1567 | sour_publ_subs sour_publ_sub
1570 sour_publ_sub : continuation_sub /* 0:M */
1575 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1576 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1578 GEDCOM_MAKE_STRING(val1, $4));
1579 START(TEXT, $<ctxt>$)
1584 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1588 sour_text_subs : /* empty */
1589 | sour_text_subs sour_text_sub
1592 sour_text_sub : continuation_sub /* 0:M */
1596 /*********************************************************************/
1597 /**** Submission record ****/
1598 /*********************************************************************/
1599 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1600 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1602 if (xr == NULL) HANDLE_ERROR;
1603 $<ctxt>$ = start_record(REC_SUBN,
1604 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1605 NULL, GEDCOM_MAKE_NULL(val2));
1606 START(SUBN, $<ctxt>$) }
1610 { end_record(REC_SUBN, $<ctxt>6); }
1613 subn_subs : /* empty */
1614 | subn_subs subn_sub
1617 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1618 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1619 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1620 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1621 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1622 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1623 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1628 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1629 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1631 if (xr == NULL) HANDLE_ERROR;
1632 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1634 GEDCOM_MAKE_XREF_PTR(val1, xr));
1635 START(SUBM, $<ctxt>$)
1640 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1645 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1646 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1648 GEDCOM_MAKE_STRING(val1, $4));
1649 START(FAMF, $<ctxt>$)
1654 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1659 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1660 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1662 GEDCOM_MAKE_STRING(val1, $4));
1663 START(TEMP, $<ctxt>$)
1668 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1673 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1674 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1676 GEDCOM_MAKE_STRING(val1, $4));
1677 START(ANCE, $<ctxt>$)
1682 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1687 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1688 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1690 GEDCOM_MAKE_STRING(val1, $4));
1691 START(DESC, $<ctxt>$)
1696 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1701 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1702 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1704 GEDCOM_MAKE_STRING(val1, $4));
1705 START(ORDI, $<ctxt>$)
1710 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1715 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1716 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1718 GEDCOM_MAKE_STRING(val1, $4));
1719 START(RIN, $<ctxt>$)
1724 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1728 /*********************************************************************/
1729 /**** Submitter record ****/
1730 /*********************************************************************/
1731 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1732 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1734 if (xr == NULL) HANDLE_ERROR;
1735 $<ctxt>$ = start_record(REC_SUBM,
1736 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1737 NULL, GEDCOM_MAKE_NULL(val2));
1738 START(SUBM, $<ctxt>$) }
1742 { end_record(REC_SUBM, $<ctxt>6); }
1745 subm_subs : /* empty */
1746 | subm_subs subm_sub
1749 subm_sub : subm_name_sect { OCCUR2(NAME, 0, 1) }
1750 | addr_struc_sub /* 0:1 */
1751 | multim_link_sub /* 0:M */
1752 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1753 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1754 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1755 | change_date_sub /* 0:1 */
1760 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1761 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1763 GEDCOM_MAKE_STRING(val1, $4));
1764 START(NAME, $<ctxt>$)
1769 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1774 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1775 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1777 GEDCOM_MAKE_STRING(val1, $4));
1778 START(LANG, $<ctxt>$)
1783 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1788 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1789 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1791 GEDCOM_MAKE_STRING(val1, $4));
1792 START(RFN, $<ctxt>$)
1797 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1802 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1803 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1805 GEDCOM_MAKE_STRING(val1, $4));
1806 START(RIN, $<ctxt>$)
1811 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1815 /*********************************************************************/
1816 /**** Substructures ****/
1817 /*********************************************************************/
1819 /* ADDRESS STRUCTURE */
1820 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1821 | phon_sect { OCCUR2(PHON, 0, 3) }
1824 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1825 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1827 GEDCOM_MAKE_STRING(val1, $4));
1828 START(ADDR, $<ctxt>$)
1833 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1837 addr_subs : /* empty */
1838 | addr_subs addr_sub
1841 addr_sub : addr_cont_sect /* 0:M */
1842 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1843 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1844 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1845 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1846 | addr_post_sect { OCCUR2(POST, 0, 1) }
1847 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1851 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1852 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1854 GEDCOM_MAKE_STRING(val1, $4));
1855 START(CONT, $<ctxt>$)
1860 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1863 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1864 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1866 GEDCOM_MAKE_STRING(val1, $4));
1867 START(ADR1, $<ctxt>$)
1872 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1875 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1876 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1878 GEDCOM_MAKE_STRING(val1, $4));
1879 START(ADR2, $<ctxt>$)
1884 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1887 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1888 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1890 GEDCOM_MAKE_STRING(val1, $4));
1891 START(CITY, $<ctxt>$)
1896 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1899 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1900 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1902 GEDCOM_MAKE_STRING(val1, $4));
1903 START(STAE, $<ctxt>$)
1908 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1911 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1912 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1914 GEDCOM_MAKE_STRING(val1, $4));
1915 START(POST, $<ctxt>$)
1920 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1923 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1924 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1926 GEDCOM_MAKE_STRING(val1, $4));
1927 START(CTRY, $<ctxt>$)
1932 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1936 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1937 { $<ctxt>$ = start_element(ELT_SUB_PHON,
1939 GEDCOM_MAKE_STRING(val1, $4));
1940 START(PHON, $<ctxt>$)
1945 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
1949 /* ASSOCIATION STRUCTURE */
1950 assoc_struc_sub : asso_sect /* 0:M */
1953 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
1954 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1956 if (xr == NULL) HANDLE_ERROR;
1957 $<ctxt>$ = start_element(ELT_SUB_ASSO,
1959 GEDCOM_MAKE_XREF_PTR(val1, xr));
1960 START(ASSO, $<ctxt>$)
1963 { CHECK2(TYPE,RELA) }
1965 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
1969 asso_subs : /* empty */
1970 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
1971 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
1977 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
1978 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
1980 GEDCOM_MAKE_STRING(val1, $4));
1981 START(TYPE, $<ctxt>$)
1986 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
1990 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
1991 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
1993 GEDCOM_MAKE_STRING(val1, $4));
1994 START(RELA, $<ctxt>$)
1999 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2004 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2007 change_date_chan_sect : OPEN DELIM TAG_CHAN
2008 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2009 PARENT, $1, $3, NULL,
2010 GEDCOM_MAKE_NULL(val1));
2011 START(CHAN, $<ctxt>$)
2013 change_date_chan_subs
2016 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2020 change_date_chan_subs : /* empty */
2021 | change_date_chan_subs change_date_chan_sub
2024 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2029 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2030 { struct date_value dv = gedcom_parse_date($4);
2031 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2033 GEDCOM_MAKE_DATE(val1, dv));
2034 START(DATE, $<ctxt>$) }
2035 change_date_date_subs
2038 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2043 change_date_date_subs : /* empty */
2044 | change_date_date_subs change_date_date_sub
2047 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2051 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2053 = start_element(ELT_SUB_CHAN_TIME,
2055 GEDCOM_MAKE_STRING(val1, $4));
2056 START(TIME, $<ctxt>$)
2061 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2066 /* CHILD TO FAMILY LINK */
2067 chi_fam_link_sub : famc_sect /* 0:M */
2070 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2071 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2073 if (xr == NULL) HANDLE_ERROR;
2074 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2076 GEDCOM_MAKE_XREF_PTR(val1, xr));
2077 START(FAMC, $<ctxt>$)
2082 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2086 famc_subs : /* empty */
2087 | famc_subs famc_sub
2090 famc_sub : famc_pedi_sect /* 0:M */
2095 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2096 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2098 GEDCOM_MAKE_STRING(val1, $4));
2099 START(PEDI, $<ctxt>$)
2104 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2108 /* CONTINUATION SUBSECTIONS */
2109 continuation_sub : cont_sect /* 0:M */
2110 | conc_sect /* 0:M */
2113 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2114 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2116 GEDCOM_MAKE_STRING(val1, $4));
2117 START(CONT, $<ctxt>$)
2122 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2126 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2127 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2129 GEDCOM_MAKE_STRING(val1, $4));
2130 START(CONC, $<ctxt>$)
2135 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2140 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2141 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2144 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2145 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2146 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2152 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2154 = start_element(ELT_SUB_EVT_TYPE,
2156 GEDCOM_MAKE_STRING(val1, $4));
2157 START(TYPE, $<ctxt>$)
2162 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2166 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2167 { struct date_value dv = gedcom_parse_date($4);
2169 = start_element(ELT_SUB_EVT_DATE,
2171 GEDCOM_MAKE_DATE(val1, dv));
2172 START(DATE, $<ctxt>$)
2177 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2181 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2183 = start_element(ELT_SUB_EVT_AGE,
2185 GEDCOM_MAKE_STRING(val1, $4));
2186 START(AGE, $<ctxt>$)
2191 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2195 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2197 = start_element(ELT_SUB_EVT_AGNC,
2199 GEDCOM_MAKE_STRING(val1, $4));
2200 START(AGNC, $<ctxt>$)
2205 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2209 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2211 = start_element(ELT_SUB_EVT_CAUS,
2213 GEDCOM_MAKE_STRING(val1, $4));
2214 START(CAUS, $<ctxt>$)
2219 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2224 /* FAMILY EVENT STRUCTURE */
2225 fam_event_struc_sub : fam_event_sect
2226 | fam_gen_even_sect /* 0:M */
2229 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2231 = start_element(ELT_SUB_FAM_EVT,
2233 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2239 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2243 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2244 | TAG_CENS { $$ = $1; START1(CENS) }
2245 | TAG_DIV { $$ = $1; START1(DIV) }
2246 | TAG_DIVF { $$ = $1; START1(DIVF) }
2247 | TAG_ENGA { $$ = $1; START1(ENGA) }
2248 | TAG_MARR { $$ = $1; START1(MARR) }
2249 | TAG_MARB { $$ = $1; START1(MARB) }
2250 | TAG_MARC { $$ = $1; START1(MARC) }
2251 | TAG_MARL { $$ = $1; START1(MARL) }
2252 | TAG_MARS { $$ = $1; START1(MARS) }
2255 fam_event_subs : /* empty */
2256 | fam_event_subs fam_event_sub
2259 fam_event_sub : event_detail_sub
2260 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2261 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2265 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2266 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2267 PARENT, $1, $3, NULL,
2268 GEDCOM_MAKE_NULL(val1));
2269 START(HUSB, $<ctxt>$)
2274 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2279 fam_even_husb_subs : /* empty */
2280 | fam_even_husb_subs fam_even_husb_sub
2283 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2287 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2288 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2290 GEDCOM_MAKE_STRING(val1, $4));
2291 START(AGE, $<ctxt>$)
2296 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2301 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2302 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2303 PARENT, $1, $3, NULL,
2304 GEDCOM_MAKE_NULL(val1));
2305 START(WIFE, $<ctxt>$)
2310 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2315 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2316 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2317 PARENT, $1, $3, NULL,
2318 GEDCOM_MAKE_NULL(val1));
2319 START(EVEN, $<ctxt>$)
2324 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2329 fam_gen_even_subs : /* empty */
2330 | fam_gen_even_subs fam_gen_even_sub
2333 fam_gen_even_sub : event_detail_sub
2334 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2335 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2339 /* IDENTIFICATION STRUCTURE */
2340 ident_struc_sub : ident_refn_sect /* 0:M */
2341 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2344 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2345 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2347 GEDCOM_MAKE_STRING(val1, $4));
2348 START(REFN, $<ctxt>$)
2353 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2358 ident_refn_subs : /* empty */
2359 | ident_refn_subs ident_refn_sub
2362 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2366 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2368 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2370 GEDCOM_MAKE_STRING(val1, $4));
2371 START(TYPE, $<ctxt>$)
2376 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2381 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2382 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2384 GEDCOM_MAKE_STRING(val1, $4));
2385 START(RIN, $<ctxt>$)
2390 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2395 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2396 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2397 | indiv_resi_sect /* 0:M */
2400 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2401 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2403 GEDCOM_MAKE_STRING(val1, $4));
2406 indiv_attr_event_subs
2409 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2412 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2413 | TAG_DSCR { $$ = $1; START1(DSCR) }
2414 | TAG_EDUC { $$ = $1; START1(EDUC) }
2415 | TAG_IDNO { $$ = $1; START1(IDNO) }
2416 | TAG_NATI { $$ = $1; START1(NATI) }
2417 | TAG_NCHI { $$ = $1; START1(NCHI) }
2418 | TAG_NMR { $$ = $1; START1(NMR) }
2419 | TAG_OCCU { $$ = $1; START1(OCCU) }
2420 | TAG_PROP { $$ = $1; START1(PROP) }
2421 | TAG_RELI { $$ = $1; START1(RELI) }
2422 | TAG_SSN { $$ = $1; START1(SSN) }
2423 | TAG_TITL { $$ = $1; START1(TITL) }
2425 indiv_resi_sect : OPEN DELIM TAG_RESI
2426 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2427 PARENT, $1, $3, NULL,
2428 GEDCOM_MAKE_NULL(val1));
2429 START(RESI, $<ctxt>$)
2431 indiv_attr_event_subs
2434 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2438 indiv_attr_event_subs : /* empty */
2439 | indiv_attr_event_subs indiv_attr_event_sub
2442 indiv_attr_event_sub : event_detail_sub
2446 /* INDIVIDUAL EVENT STRUCTURE */
2447 indiv_even_struc_sub : indiv_birt_sect
2449 | indiv_adop_sect /* 0:M */
2450 | indiv_even_sect /* 0:M */
2453 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2455 = start_element(ELT_SUB_INDIV_BIRT,
2457 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2463 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2467 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2468 | TAG_CHR { $$ = $1; START1(CHR) }
2471 indiv_birt_subs : /* empty */
2472 | indiv_birt_subs indiv_birt_sub
2475 indiv_birt_sub : event_detail_sub
2476 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2480 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2481 { struct xref_value *xr = gedcom_parse_xref($4,
2484 if (xr == NULL) HANDLE_ERROR;
2486 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2488 GEDCOM_MAKE_XREF_PTR(val1, xr));
2489 START(FAMC, $<ctxt>$)
2494 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2499 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2501 = start_element(ELT_SUB_INDIV_GEN,
2503 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2509 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2513 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2514 | TAG_BURI { $$ = $1; START1(BURI) }
2515 | TAG_CREM { $$ = $1; START1(CREM) }
2516 | TAG_BAPM { $$ = $1; START1(BAPM) }
2517 | TAG_BARM { $$ = $1; START1(BARM) }
2518 | TAG_BASM { $$ = $1; START1(BASM) }
2519 | TAG_BLES { $$ = $1; START1(BLES) }
2520 | TAG_CHRA { $$ = $1; START1(CHRA) }
2521 | TAG_CONF { $$ = $1; START1(CONF) }
2522 | TAG_FCOM { $$ = $1; START1(FCOM) }
2523 | TAG_ORDN { $$ = $1; START1(ORDN) }
2524 | TAG_NATU { $$ = $1; START1(NATU) }
2525 | TAG_EMIG { $$ = $1; START1(EMIG) }
2526 | TAG_IMMI { $$ = $1; START1(IMMI) }
2527 | TAG_CENS { $$ = $1; START1(CENS) }
2528 | TAG_PROB { $$ = $1; START1(PROB) }
2529 | TAG_WILL { $$ = $1; START1(WILL) }
2530 | TAG_GRAD { $$ = $1; START1(GRAD) }
2531 | TAG_RETI { $$ = $1; START1(RETI) }
2534 indiv_gen_subs : /* empty */
2535 | indiv_gen_subs indiv_gen_sub
2538 indiv_gen_sub : event_detail_sub
2542 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2544 = start_element(ELT_SUB_INDIV_ADOP,
2546 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2547 START(ADOP, $<ctxt>$) }
2551 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2555 indiv_adop_subs : /* empty */
2556 | indiv_adop_subs indiv_adop_sub
2559 indiv_adop_sub : event_detail_sub
2560 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2564 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2565 { struct xref_value *xr = gedcom_parse_xref($4,
2568 if (xr == NULL) HANDLE_ERROR;
2570 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2572 GEDCOM_MAKE_XREF_PTR(val1, xr));
2573 START(FAMC, $<ctxt>$) }
2574 indiv_adop_famc_subs
2577 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2582 indiv_adop_famc_subs : /* empty */
2583 | indiv_adop_famc_subs indiv_adop_famc_sub
2586 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2590 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2592 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2594 GEDCOM_MAKE_STRING(val1, $4));
2595 START(ADOP, $<ctxt>$) }
2599 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2600 PARENT, $<ctxt>5, NULL);
2604 indiv_even_sect : OPEN DELIM TAG_EVEN
2605 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2606 PARENT, $1, $3, NULL,
2607 GEDCOM_MAKE_NULL(val1));
2608 START(EVEN, $<ctxt>$) }
2612 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2616 /* LDS INDIVIDUAL ORDINANCE */
2617 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2618 | lio_slgc_sect /* 0:M */
2621 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2622 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2623 PARENT, $1, $3, NULL,
2624 GEDCOM_MAKE_NULL(val1));
2630 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2634 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2635 | TAG_CONL { $$ = $1; START1(CONL) }
2636 | TAG_ENDL { $$ = $1; START1(ENDL) }
2639 lio_bapl_subs : /* empty */
2640 | lio_bapl_subs lio_bapl_sub
2643 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2644 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2645 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2646 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2652 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2653 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2655 GEDCOM_MAKE_STRING(val1, $4));
2656 START(STAT, $<ctxt>$)
2661 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2665 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2666 { struct date_value dv = gedcom_parse_date($4);
2667 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2669 GEDCOM_MAKE_DATE(val1, dv));
2670 START(DATE, $<ctxt>$)
2675 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2679 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2680 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2682 GEDCOM_MAKE_STRING(val1, $4));
2683 START(TEMP, $<ctxt>$)
2688 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2692 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2693 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2695 GEDCOM_MAKE_STRING(val1, $4));
2696 START(PLAC, $<ctxt>$)
2701 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2706 lio_slgc_sect : OPEN DELIM TAG_SLGC
2707 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2708 PARENT, $1, $3, NULL,
2709 GEDCOM_MAKE_NULL(val1));
2710 START(SLGC, $<ctxt>$)
2715 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2719 lio_slgc_subs : /* empty */
2720 | lio_slgc_subs lio_slgc_sub
2723 lio_slgc_sub : lio_bapl_sub
2724 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2727 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2728 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2730 if (xr == NULL) HANDLE_ERROR;
2732 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2734 GEDCOM_MAKE_XREF_PTR(val1, xr));
2735 START(FAMC, $<ctxt>$)
2740 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2745 /* LDS SPOUSE SEALING */
2746 lds_spouse_seal_sub : lss_slgs_sect
2749 lss_slgs_sect : OPEN DELIM TAG_SLGS
2750 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2751 PARENT, $1, $3, NULL,
2752 GEDCOM_MAKE_NULL(val1));
2753 START(SLGS, $<ctxt>$) }
2757 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2761 lss_slgs_subs : /* empty */
2762 | lss_slgs_subs lss_slgs_sub
2765 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2766 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2767 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2768 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2774 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2775 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2777 GEDCOM_MAKE_STRING(val1, $4));
2778 START(STAT, $<ctxt>$)
2783 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2787 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2788 { struct date_value dv = gedcom_parse_date($4);
2789 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2791 GEDCOM_MAKE_DATE(val1, dv));
2792 START(DATE, $<ctxt>$)
2797 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2801 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2802 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2804 GEDCOM_MAKE_STRING(val1, $4));
2805 START(TEMP, $<ctxt>$)
2810 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2814 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2815 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2817 GEDCOM_MAKE_STRING(val1, $4));
2818 START(PLAC, $<ctxt>$)
2823 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2828 /* MULTIMEDIA LINK */
2829 multim_link_sub : multim_obje_link_sect
2830 | multim_obje_emb_sect
2833 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2834 { struct xref_value *xr = gedcom_parse_xref($5,
2837 if (xr == NULL) HANDLE_ERROR;
2839 = start_element(ELT_SUB_MULTIM_OBJE,
2841 GEDCOM_MAKE_XREF_PTR(val1, xr));
2842 START(OBJE, $<ctxt>$)
2847 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2852 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2853 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2854 PARENT, $1, $3, NULL,
2855 GEDCOM_MAKE_NULL(val1));
2856 START(OBJE, $<ctxt>$)
2858 multim_obje_emb_subs
2859 { CHECK2(FORM,FILE) }
2861 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2866 multim_obje_emb_subs : /* empty */
2867 | multim_obje_emb_subs multim_obje_emb_sub
2870 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2871 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2872 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2877 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2879 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2881 GEDCOM_MAKE_STRING(val1, $4));
2882 START(FORM, $<ctxt>$)
2887 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2888 PARENT, $<ctxt>5, NULL);
2891 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2893 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2895 GEDCOM_MAKE_STRING(val1, $4));
2896 START(TITL, $<ctxt>$)
2901 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2902 PARENT, $<ctxt>5, NULL);
2905 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2907 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2909 GEDCOM_MAKE_STRING(val1, $4));
2910 START(FILE, $<ctxt>$)
2915 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2916 PARENT, $<ctxt>5, NULL);
2920 /* NOTE STRUCTURE */
2921 note_struc_sub : note_struc_link_sect /* 0:M */
2922 | note_struc_emb_sect /* 0:M */
2925 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2926 { struct xref_value *xr = gedcom_parse_xref($5,
2929 if (xr == NULL) HANDLE_ERROR;
2931 = start_element(ELT_SUB_NOTE,
2933 GEDCOM_MAKE_XREF_PTR(val1, xr));
2934 START(NOTE, $<ctxt>$)
2936 note_struc_link_subs
2939 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
2943 note_struc_link_subs : /* empty */
2944 | note_struc_link_subs note_struc_link_sub
2947 note_struc_link_sub : source_cit_sub
2951 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
2953 = start_element(ELT_SUB_NOTE,
2955 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2956 START(NOTE, $<ctxt>$)
2961 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
2965 note_struc_emb_subs : /* empty */
2966 | note_struc_emb_subs note_struc_emb_sub
2969 note_struc_emb_sub : continuation_sub
2974 /* PERSONAL NAME STRUCTURE */
2975 pers_name_struc_sub : pers_name_sect /* 0:M */
2978 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
2979 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
2981 GEDCOM_MAKE_STRING(val1, $4));
2982 START(NAME, $<ctxt>$)
2987 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
2991 pers_name_subs : /* empty */
2992 | pers_name_subs pers_name_sub
2995 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
2996 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
2997 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
2998 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
2999 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3000 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3006 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3007 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3009 GEDCOM_MAKE_STRING(val1, $4));
3010 START(NPFX, $<ctxt>$)
3015 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3019 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3020 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3022 GEDCOM_MAKE_STRING(val1, $4));
3023 START(GIVN, $<ctxt>$)
3028 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3032 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3033 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3035 GEDCOM_MAKE_STRING(val1, $4));
3036 START(NICK, $<ctxt>$)
3041 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3045 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3046 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3048 GEDCOM_MAKE_STRING(val1, $4));
3049 START(SPFX, $<ctxt>$)
3054 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3058 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3059 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3061 GEDCOM_MAKE_STRING(val1, $4));
3062 START(SURN, $<ctxt>$)
3067 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3071 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3072 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3074 GEDCOM_MAKE_STRING(val1, $4));
3075 START(NSFX, $<ctxt>$)
3080 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3085 /* PLACE STRUCTURE */
3086 place_struc_sub : place_struc_plac_sect /* 0:M */
3089 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3091 = start_element(ELT_SUB_PLAC,
3093 GEDCOM_MAKE_STRING(val1, $4));
3094 START(PLAC, $<ctxt>$)
3096 place_struc_plac_subs
3099 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3103 place_struc_plac_subs : /* empty */
3104 | place_struc_plac_subs place_struc_plac_sub
3107 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3113 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3115 = start_element(ELT_SUB_PLAC_FORM,
3117 GEDCOM_MAKE_STRING(val1, $4));
3118 START(FORM, $<ctxt>$)
3123 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3128 /* SOURCE_CITATION */
3129 source_cit_sub : source_cit_link_sect /* 0:M */
3130 | source_cit_emb_sect /* 0:M */
3133 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3134 { struct xref_value *xr = gedcom_parse_xref($5,
3137 if (xr == NULL) HANDLE_ERROR;
3139 = start_element(ELT_SUB_SOUR,
3141 GEDCOM_MAKE_XREF_PTR(val1, xr));
3142 START(SOUR, $<ctxt>$)
3144 source_cit_link_subs
3147 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3151 source_cit_link_subs : /* empty */
3152 | source_cit_link_subs source_cit_link_sub
3155 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3156 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3157 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3158 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3164 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3166 = start_element(ELT_SUB_SOUR_PAGE,
3168 GEDCOM_MAKE_STRING(val1, $4));
3169 START(PAGE, $<ctxt>$)
3174 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3179 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3181 = start_element(ELT_SUB_SOUR_EVEN,
3183 GEDCOM_MAKE_STRING(val1, $4));
3184 START(EVEN, $<ctxt>$)
3186 source_cit_even_subs
3189 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3194 source_cit_even_subs : /* empty */
3195 | source_cit_even_subs source_cit_even_sub
3198 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3202 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3204 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3206 GEDCOM_MAKE_STRING(val1, $4));
3207 START(ROLE, $<ctxt>$)
3212 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3213 PARENT, $<ctxt>5, NULL);
3217 source_cit_data_sect : OPEN DELIM TAG_DATA
3218 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3219 PARENT, $1, $3, NULL,
3220 GEDCOM_MAKE_NULL(val1));
3221 START(DATA, $<ctxt>$)
3223 source_cit_data_subs
3226 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3231 source_cit_data_subs : /* empty */
3232 | source_cit_data_subs source_cit_data_sub
3235 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3236 | source_cit_text_sect /* 0:M */
3240 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3241 { struct date_value dv = gedcom_parse_date($4);
3243 = start_element(ELT_SUB_SOUR_DATA_DATE,
3245 GEDCOM_MAKE_DATE(val1, dv));
3246 START(DATE, $<ctxt>$)
3251 { end_element(ELT_SUB_SOUR_DATA_DATE,
3252 PARENT, $<ctxt>5, NULL);
3256 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3258 = start_element(ELT_SUB_SOUR_TEXT,
3260 GEDCOM_MAKE_STRING(val1, $4));
3261 START(TEXT, $<ctxt>$)
3263 source_cit_text_subs
3266 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3271 source_cit_text_subs : /* empty */
3272 | source_cit_text_subs source_cit_text_sub
3275 source_cit_text_sub : continuation_sub
3279 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3281 = start_element(ELT_SUB_SOUR_QUAY,
3283 GEDCOM_MAKE_STRING(val1, $4));
3284 START(QUAY, $<ctxt>$)
3289 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3294 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3295 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3297 GEDCOM_MAKE_STRING(val1, $4));
3298 START(SOUR, $<ctxt>$)
3303 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3307 source_cit_emb_subs : /* empty */
3308 | source_cit_emb_subs source_cit_emb_sub
3311 source_cit_emb_sub : continuation_sub
3312 | source_cit_text_sect /* 0:M */
3317 /* SOURCE REPOSITORY CITATION */
3318 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3321 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3322 { struct xref_value *xr
3323 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3324 if (xr == NULL) HANDLE_ERROR;
3326 = start_element(ELT_SUB_REPO,
3328 GEDCOM_MAKE_XREF_PTR(val1, xr));
3329 START(REPO, $<ctxt>$)
3331 source_repos_repo_subs
3334 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3338 source_repos_repo_subs : /* empty */
3339 | source_repos_repo_subs source_repos_repo_sub
3342 source_repos_repo_sub : note_struc_sub
3343 | caln_sect /* 0:M */
3347 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3348 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3350 GEDCOM_MAKE_STRING(val1, $4));
3351 START(CALN, $<ctxt>$)
3356 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3360 caln_subs : /* empty */
3361 | caln_subs caln_sub
3364 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3368 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3369 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3371 GEDCOM_MAKE_STRING(val1, $4));
3372 START(MEDI, $<ctxt>$)
3377 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3381 /* SPOUSE TO FAMILY LINK */
3382 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3385 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3386 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3388 if (xr == NULL) HANDLE_ERROR;
3390 = start_element(ELT_SUB_FAMS,
3392 GEDCOM_MAKE_XREF_PTR(val1, xr));
3393 START(FAMS, $<ctxt>$)
3398 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3402 spou_fam_fams_subs : /* empty */
3403 | spou_fam_fams_subs spou_fam_fams_sub
3406 spou_fam_fams_sub : note_struc_sub
3410 /*********************************************************************/
3412 /*********************************************************************/
3414 no_std_subs : /* empty */
3415 | no_std_subs no_std_sub
3418 no_std_sub : user_sect /* 0:M */
3420 | error error_subs CLOSE { HANDLE_ERROR }
3423 no_std_rec : user_rec /* 0:M */
3425 | error error_subs CLOSE { HANDLE_ERROR }
3428 user_rec : OPEN DELIM opt_xref USERTAG
3429 { if ($4.string[0] != '_') {
3430 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3436 { struct xref_value *xr = NULL;
3438 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3439 if (xr == NULL) HANDLE_ERROR;
3441 $<ctxt>$ = start_record(REC_USER,
3443 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3450 { end_record(REC_USER, $<ctxt>7); }
3452 user_sect : OPEN DELIM opt_xref USERTAG
3453 { if ($4.string[0] != '_') {
3454 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3460 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3461 START($4, $<ctxt>$);
3466 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3470 user_sects : /* empty */ { }
3471 | user_sects user_sect { }
3474 opt_xref : /* empty */ { $$ = NULL; }
3475 | POINTER DELIM { $$ = $1; }
3478 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3480 | DELIM POINTER { struct xref_value *xr
3481 = gedcom_parse_xref($2, XREF_USED,
3483 GEDCOM_MAKE_XREF_PTR(val2, xr);
3485 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3489 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3490 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3494 mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
3495 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3499 opt_line_item : /* empty */ { }
3500 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3504 line_item : anychar { size_t i;
3505 CLEAR_BUFFER(line_item_buf);
3506 line_item_buf_ptr = line_item_buf;
3507 /* The following also takes care of '@@' */
3508 if (!strncmp($1, "@@", 3))
3509 *line_item_buf_ptr++ = '@';
3511 for (i=0; i < strlen($1); i++)
3512 *line_item_buf_ptr++ = $1[i];
3515 | ESCAPE { size_t i;
3516 CLEAR_BUFFER(line_item_buf);
3517 line_item_buf_ptr = line_item_buf;
3518 for (i=0; i < strlen($1); i++)
3519 *line_item_buf_ptr++ = $1[i];
3524 /* The following also takes care of '@@' */
3525 if (!strncmp($2, "@@", 3))
3526 *line_item_buf_ptr++ = '@';
3528 for (i=0; i < strlen($2); i++)
3529 *line_item_buf_ptr++ = $2[i];
3534 for (i=0; i < strlen($2); i++)
3535 *line_item_buf_ptr++ = $2[i];
3540 anychar : ANYCHAR { }
3544 error_subs : /* empty */
3545 | error_subs error_sect
3548 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3550 gen_sect : OPEN DELIM opt_xref anystdtag
3551 { INVALID_TAG($4); }
3552 opt_value opt_sects CLOSE
3556 gen_rec : gen_rec_top
3560 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3561 { INVALID_TOP_TAG($4) }
3562 opt_value opt_sects CLOSE
3566 gen_rec_top : OPEN DELIM anytoptag
3567 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3568 opt_value opt_sects CLOSE
3572 opt_sects : /* empty */ { }
3573 | opt_sects gen_sect { }
3576 anytag : USERTAG { }
3590 anystdtag : TAG_ABBR
3720 /* Functions that handle the counting of subtags */
3722 int* count_arrays[MAXGEDCLEVEL+1];
3723 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3724 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3726 void push_countarray()
3729 if (count_level > MAXGEDCLEVEL) {
3730 gedcom_error(_("Internal error: count array overflow"));
3734 count = (int *)calloc(YYNTOKENS, sizeof(int));
3735 if (count == NULL) {
3736 gedcom_error(_("Internal error: count array calloc error"));
3740 count_arrays[count_level] = count;
3745 void set_parenttag(char* tag)
3747 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3750 void set_parentctxt(Gedcom_ctxt ctxt)
3752 ctxt_stack[count_level+1] = ctxt;
3755 char* get_parenttag()
3757 return tag_stack[count_level];
3760 Gedcom_ctxt get_parentctxt()
3762 return ctxt_stack[count_level];
3765 int count_tag(int tag)
3767 int *count = count_arrays[count_level];
3768 return ++count[tag - GEDCOMTAGOFFSET];
3771 int check_occurrence(int tag)
3773 int *count = count_arrays[count_level];
3774 return (count[tag - GEDCOMTAGOFFSET] > 0);
3777 void pop_countarray()
3780 if (count_level < 0) {
3781 gedcom_error(_("Internal error: count array underflow"));
3785 count = count_arrays[count_level];
3787 count_arrays[count_level] = NULL;
3791 /* Enabling debug mode */
3792 /* level 0: no debugging */
3793 /* level 1: only internal */
3794 /* level 2: also bison */
3797 void gedcom_set_debug_level(int level, FILE* f)
3802 trace_output = stderr;
3804 gedcom_high_level_debug = 1;
3813 int gedcom_debug_print(char* s, ...)
3816 if (gedcom_high_level_debug) {
3819 res = vfprintf(trace_output, s, ap);
3821 fprintf(trace_output, "\n");
3826 /* Setting the error mechanism */
3827 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3829 error_mechanism = mechanism;
3832 /* Compatibility handling */
3834 void gedcom_set_compat_handling(int enable_compat)
3836 compat_enabled = enable_compat;
3839 void set_compatibility(char* program)
3841 if (compat_enabled) {
3842 if (! strncmp(program, "ftree", 6)) {
3843 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3844 compatibility = C_FTREE;
3852 int compat_mode(int compat_flags)
3854 return (compat_flags & compatibility);