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"
155 int gedcom_high_level_debug = 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;
163 /* These are defined at the bottom of the file */
164 void push_countarray();
165 void set_parenttag(char* tag);
166 char* get_parenttag(int offset);
167 void set_parentctxt(Gedcom_ctxt ctxt);
168 Gedcom_ctxt get_parentctxt(int offset);
169 void pop_countarray();
170 int count_tag(int tag);
171 int check_occurrence(int tag);
173 #define CLEAR_BUFFER(BUF) \
174 memset(BUF, 0, sizeof(BUF));
176 #define HANDLE_ERROR \
177 { if (error_mechanism == IMMED_FAIL) { \
180 else if (error_mechanism == DEFER_FAIL) { \
183 else if (error_mechanism == IGNORE_ERRORS) { \
187 #define START1(PARENTTAG) \
188 { set_parenttag(#PARENTTAG); \
190 #define START2(PARENTCTXT) \
191 { set_parentctxt(PARENTCTXT); \
195 #define START(PARENTTAG,PARENTCTXT) \
196 { START1(PARENTTAG); \
197 START2(PARENTCTXT); \
201 #define GRANDPARENT(OFF) \
204 { if (!check_occurrence(TAG_##TAG)) { \
205 char* parenttag = get_parenttag(0); \
206 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
212 { pop_countarray(); \
216 #define CHECK1(TAG1) { CHK(TAG1); POP; }
217 #define CHECK2(TAG1,TAG2) \
218 { CHK(TAG1); CHK(TAG2); POP; }
219 #define CHECK3(TAG1,TAG2,TAG3) \
220 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
221 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
222 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
223 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
224 #define OCCUR2(CHILDTAG, MIN, MAX) \
225 { int num = count_tag(TAG_##CHILDTAG); \
227 char* parenttag = get_parenttag(0); \
228 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
229 #CHILDTAG, MAX, parenttag); \
233 #define INVALID_TAG(CHILDTAG) \
234 { char* parenttag = get_parenttag(0); \
235 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
236 CHILDTAG, parenttag); \
239 #define INVALID_TOP_TAG(CHILDTAG) \
240 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
250 struct tag_struct tag;
257 %token <string> BADTOKEN
259 %token <string> CLOSE
260 %token <string> ESCAPE
261 %token <string> DELIM
262 %token <string> ANYCHAR
263 %token <string> POINTER
265 %token <tag> TAG_ABBR
266 %token <tag> TAG_ADDR
267 %token <tag> TAG_ADR1
268 %token <tag> TAG_ADR2
269 %token <tag> TAG_ADOP
272 %token <tag> TAG_AGNC
273 %token <tag> TAG_ALIA
274 %token <tag> TAG_ANCE
275 %token <tag> TAG_ANCI
276 %token <tag> TAG_ANUL
277 %token <tag> TAG_ASSO
278 %token <tag> TAG_AUTH
279 %token <tag> TAG_BAPL
280 %token <tag> TAG_BAPM
281 %token <tag> TAG_BARM
282 %token <tag> TAG_BASM
283 %token <tag> TAG_BIRT
284 %token <tag> TAG_BLES
285 %token <tag> TAG_BLOB
286 %token <tag> TAG_BURI
287 %token <tag> TAG_CALN
288 %token <tag> TAG_CAST
289 %token <tag> TAG_CAUS
290 %token <tag> TAG_CENS
291 %token <tag> TAG_CHAN
292 %token <tag> TAG_CHAR
293 %token <tag> TAG_CHIL
295 %token <tag> TAG_CHRA
296 %token <tag> TAG_CITY
297 %token <tag> TAG_CONC
298 %token <tag> TAG_CONF
299 %token <tag> TAG_CONL
300 %token <tag> TAG_CONT
301 %token <tag> TAG_COPR
302 %token <tag> TAG_CORP
303 %token <tag> TAG_CREM
304 %token <tag> TAG_CTRY
305 %token <tag> TAG_DATA
306 %token <tag> TAG_DATE
307 %token <tag> TAG_DEAT
308 %token <tag> TAG_DESC
309 %token <tag> TAG_DESI
310 %token <tag> TAG_DEST
312 %token <tag> TAG_DIVF
313 %token <tag> TAG_DSCR
314 %token <tag> TAG_EDUC
315 %token <tag> TAG_EMIG
316 %token <tag> TAG_ENDL
317 %token <tag> TAG_ENGA
318 %token <tag> TAG_EVEN
320 %token <tag> TAG_FAMC
321 %token <tag> TAG_FAMF
322 %token <tag> TAG_FAMS
323 %token <tag> TAG_FCOM
324 %token <tag> TAG_FILE
325 %token <tag> TAG_FORM
326 %token <tag> TAG_GEDC
327 %token <tag> TAG_GIVN
328 %token <tag> TAG_GRAD
329 %token <tag> TAG_HEAD
330 %token <tag> TAG_HUSB
331 %token <tag> TAG_IDNO
332 %token <tag> TAG_IMMI
333 %token <tag> TAG_INDI
334 %token <tag> TAG_LANG
335 %token <tag> TAG_LEGA
336 %token <tag> TAG_MARB
337 %token <tag> TAG_MARC
338 %token <tag> TAG_MARL
339 %token <tag> TAG_MARR
340 %token <tag> TAG_MARS
341 %token <tag> TAG_MEDI
342 %token <tag> TAG_NAME
343 %token <tag> TAG_NATI
344 %token <tag> TAG_NATU
345 %token <tag> TAG_NCHI
346 %token <tag> TAG_NICK
348 %token <tag> TAG_NOTE
349 %token <tag> TAG_NPFX
350 %token <tag> TAG_NSFX
351 %token <tag> TAG_OBJE
352 %token <tag> TAG_OCCU
353 %token <tag> TAG_ORDI
354 %token <tag> TAG_ORDN
355 %token <tag> TAG_PAGE
356 %token <tag> TAG_PEDI
357 %token <tag> TAG_PHON
358 %token <tag> TAG_PLAC
359 %token <tag> TAG_POST
360 %token <tag> TAG_PROB
361 %token <tag> TAG_PROP
362 %token <tag> TAG_PUBL
363 %token <tag> TAG_QUAY
364 %token <tag> TAG_REFN
365 %token <tag> TAG_RELA
366 %token <tag> TAG_RELI
367 %token <tag> TAG_REPO
368 %token <tag> TAG_RESI
369 %token <tag> TAG_RESN
370 %token <tag> TAG_RETI
373 %token <tag> TAG_ROLE
375 %token <tag> TAG_SLGC
376 %token <tag> TAG_SLGS
377 %token <tag> TAG_SOUR
378 %token <tag> TAG_SPFX
380 %token <tag> TAG_STAE
381 %token <tag> TAG_STAT
382 %token <tag> TAG_SUBM
383 %token <tag> TAG_SUBN
384 %token <tag> TAG_SURN
385 %token <tag> TAG_TEMP
386 %token <tag> TAG_TEXT
387 %token <tag> TAG_TIME
388 %token <tag> TAG_TITL
389 %token <tag> TAG_TRLR
390 %token <tag> TAG_TYPE
391 %token <tag> TAG_VERS
392 %token <tag> TAG_WIFE
393 %token <tag> TAG_WILL
395 %type <tag> anystdtag
396 %type <tag> anytoptag
397 %type <tag> fam_event_tag
398 %type <tag> indiv_attr_tag
399 %type <tag> indiv_birt_tag
400 %type <tag> indiv_gen_tag
401 %type <tag> lio_bapl_tag
402 %type <string> line_item
403 %type <string> mand_line_item
404 %type <string> mand_pointer
405 %type <string> note_line_item
406 %type <string> anychar
407 %type <string> opt_xref
408 %type <string> opt_value
409 %type <string> opt_line_item
410 %type <ctxt> head_sect
414 file : head_sect records trlr_sect
415 { if (fail == 1) YYABORT; }
420 records : /* empty */
435 /*********************************************************************/
437 /*********************************************************************/
438 head_sect : OPEN DELIM TAG_HEAD
439 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
441 NULL, GEDCOM_MAKE_NULL(val2));
442 START(HEAD, $<ctxt>$) }
444 { if (compat_mode(C_FTREE)) {
445 CHECK3(SOUR, GEDC, CHAR);
446 compat_generate_submitter_link($<ctxt>4);
448 else if (compat_mode(C_LIFELINES)) {
450 compat_generate_submitter_link($<ctxt>4);
451 compat_generate_gedcom($<ctxt>4);
452 if (compat_generate_char($<ctxt>4)) YYABORT;
455 CHECK4(SOUR, SUBM, GEDC, CHAR)
458 { end_record(REC_HEAD, $<ctxt>4);
459 if (compat_mode(C_FTREE | C_LIFELINES))
460 compat_generate_submitter();
464 head_subs : /* empty */
468 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
469 | head_dest_sect { OCCUR2(DEST, 0, 1) }
470 | head_date_sect { OCCUR2(DATE, 0, 1) }
471 | head_time_sect { if (!compat_mode(C_LIFELINES))
474 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
475 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
476 | head_file_sect { OCCUR2(FILE, 0, 1) }
477 | head_copr_sect { OCCUR2(COPR, 0, 1) }
478 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
479 | head_char_sect { OCCUR2(CHAR, 1, 1) }
480 | head_lang_sect { OCCUR2(LANG, 0, 1) }
481 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
482 | head_note_sect { OCCUR2(NOTE, 0, 1) }
487 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
488 { set_compatibility($4);
489 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
491 GEDCOM_MAKE_STRING(val1, $4));
492 START(SOUR, $<ctxt>$)
497 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
500 head_sour_subs : /* empty */
501 | head_sour_subs head_sour_sub
504 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
505 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
506 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
507 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
511 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
512 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
514 GEDCOM_MAKE_STRING(val1, $4));
515 START(VERS, $<ctxt>$)
520 { end_element(ELT_HEAD_SOUR_VERS,
521 PARENT, $<ctxt>5, NULL);
524 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
525 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
527 GEDCOM_MAKE_STRING(val1, $4));
528 START(NAME, $<ctxt>$)
533 { end_element(ELT_HEAD_SOUR_NAME,
534 PARENT, $<ctxt>5, NULL);
537 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
538 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
540 GEDCOM_MAKE_STRING(val1, $4));
541 START(CORP, $<ctxt>$)
546 { end_element(ELT_HEAD_SOUR_CORP,
547 PARENT, $<ctxt>5, NULL);
551 head_sour_corp_subs : /* empty */
552 | head_sour_corp_subs head_sour_corp_sub
555 head_sour_corp_sub : addr_struc_sub /* 0:1 */
559 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
560 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
562 GEDCOM_MAKE_STRING(val1, $4));
563 START(DATA, $<ctxt>$)
568 { end_element(ELT_HEAD_SOUR_DATA,
569 PARENT, $<ctxt>5, NULL);
573 head_sour_data_subs : /* empty */
574 | head_sour_data_subs head_sour_data_sub
577 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
578 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
582 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
583 { struct date_value dv = gedcom_parse_date($4);
585 = start_element(ELT_HEAD_SOUR_DATA_DATE,
587 GEDCOM_MAKE_DATE(val1, dv));
588 START(DATE, $<ctxt>$)
593 { end_element(ELT_HEAD_SOUR_DATA_DATE,
594 PARENT, $<ctxt>5, NULL);
597 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
599 = start_element(ELT_HEAD_SOUR_DATA_COPR,
601 GEDCOM_MAKE_STRING(val1, $4));
602 START(COPR, $<ctxt>$)
607 { end_element(ELT_HEAD_SOUR_DATA_COPR,
608 PARENT, $<ctxt>5, NULL);
613 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
614 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
616 GEDCOM_MAKE_STRING(val1, $4));
617 START(DEST, $<ctxt>$)
622 { end_element(ELT_HEAD_DEST,
623 PARENT, $<ctxt>5, NULL);
628 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
629 { struct date_value dv = gedcom_parse_date($4);
630 $<ctxt>$ = start_element(ELT_HEAD_DATE,
632 GEDCOM_MAKE_DATE(val1, dv));
633 START(DATE, $<ctxt>$)
638 { end_element(ELT_HEAD_DATE,
639 PARENT, $<ctxt>5, NULL);
643 head_date_subs : /* empty */
644 | head_date_subs head_date_sub
647 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
651 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
652 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
654 GEDCOM_MAKE_STRING(val1, $4));
655 START(TIME, $<ctxt>$)
660 { end_element(ELT_HEAD_DATE_TIME,
661 PARENT, $<ctxt>5, NULL);
665 /* HEAD.TIME (Only for 'Lifelines' compatibility) */
666 /* Just ignore the time... */
667 head_time_sect : OPEN DELIM TAG_TIME opt_line_item
673 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
674 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
676 if (xr == NULL) HANDLE_ERROR;
677 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
679 GEDCOM_MAKE_XREF_PTR(val1, xr));
680 START(SUBM, $<ctxt>$)
685 { end_element(ELT_HEAD_SUBM,
686 PARENT, $<ctxt>5, NULL);
690 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
691 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
693 if (xr == NULL) HANDLE_ERROR;
694 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
696 GEDCOM_MAKE_XREF_PTR(val1, xr));
697 START(SUBN, $<ctxt>$)
702 { end_element(ELT_HEAD_SUBN,
703 PARENT, $<ctxt>5, NULL);
707 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
708 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
710 GEDCOM_MAKE_STRING(val1, $4));
711 START(FILE, $<ctxt>$)
716 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
720 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
721 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
723 GEDCOM_MAKE_STRING(val1, $4));
724 START(COPR, $<ctxt>$)
729 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
733 head_gedc_sect : OPEN DELIM TAG_GEDC
734 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
735 PARENT, $1, $3, NULL,
736 GEDCOM_MAKE_NULL(val1));
737 START(GEDC, $<ctxt>$)
740 { CHECK2(VERS, FORM) }
742 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
746 head_gedc_subs : /* empty */
747 | head_gedc_subs head_gedc_sub
750 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
751 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
754 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
755 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
757 GEDCOM_MAKE_STRING(val1, $4));
758 START(VERS, $<ctxt>$)
763 { end_element(ELT_HEAD_GEDC_VERS,
764 PARENT, $<ctxt>5, NULL);
767 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
768 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
770 GEDCOM_MAKE_STRING(val1, $4));
771 START(FORM, $<ctxt>$)
776 { end_element(ELT_HEAD_GEDC_FORM,
777 PARENT, $<ctxt>5, NULL);
782 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
783 { /* Don't allow to continue if conversion context couldn't
785 if (open_conv_to_internal($4) == 0) YYABORT;
786 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
788 GEDCOM_MAKE_STRING(val1, $4));
789 START(CHAR, $<ctxt>$)
794 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
798 head_char_subs : /* empty */
799 | head_char_subs head_char_sub
802 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
805 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
806 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
808 GEDCOM_MAKE_STRING(val1, $4));
809 START(VERS, $<ctxt>$)
814 { end_element(ELT_HEAD_CHAR_VERS,
815 PARENT, $<ctxt>5, NULL);
820 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
821 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
823 GEDCOM_MAKE_STRING(val1, $4));
824 START(LANG, $<ctxt>$)
829 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
833 head_plac_sect : OPEN DELIM TAG_PLAC
834 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
835 PARENT, $1, $3, NULL,
836 GEDCOM_MAKE_NULL(val1));
837 START(PLAC, $<ctxt>$)
842 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
846 head_plac_subs : /* empty */
847 | head_plac_subs head_plac_sub
850 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
853 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
854 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
856 GEDCOM_MAKE_STRING(val1, $4));
857 START(FORM, $<ctxt>$)
862 { end_element(ELT_HEAD_PLAC_FORM,
863 PARENT, $<ctxt>5, NULL);
868 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
869 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
871 GEDCOM_MAKE_STRING(val1, $4));
872 START(NOTE, $<ctxt>$)
877 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
881 head_note_subs : /* empty */
882 | head_note_subs head_note_sub
885 head_note_sub : continuation_sub /* 0:M */
889 /*********************************************************************/
891 /*********************************************************************/
892 /* Don't need callbacks here, there is no information... */
893 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
896 /*********************************************************************/
897 /**** Family record ****/
898 /*********************************************************************/
899 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
900 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
902 if (xr == NULL) HANDLE_ERROR;
903 $<ctxt>$ = start_record(REC_FAM,
904 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
906 NULL, GEDCOM_MAKE_NULL(val2));
907 START(FAM, $<ctxt>$) }
911 { end_record(REC_FAM, $<ctxt>6); }
914 fam_subs : /* empty */
918 fam_sub : fam_event_struc_sub /* 0:M */
919 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
920 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
921 | fam_chil_sect /* 0:M */
922 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
923 | fam_subm_sect /* 0:M */
924 | lds_spouse_seal_sub /* 0:M */
925 | source_cit_sub /* 0:M */
926 | multim_link_sub /* 0:M */
927 | note_struc_sub /* 0:M */
928 | ident_struc_sub /* 0:1 */
929 | change_date_sub /* 0:1 */
934 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
935 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
937 if (xr == NULL) HANDLE_ERROR;
938 $<ctxt>$ = start_element(ELT_FAM_HUSB,
940 GEDCOM_MAKE_XREF_PTR(val1, xr));
941 START(HUSB, $<ctxt>$)
946 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
951 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
952 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
954 if (xr == NULL) HANDLE_ERROR;
955 $<ctxt>$ = start_element(ELT_FAM_WIFE,
957 GEDCOM_MAKE_XREF_PTR(val1, xr));
958 START(WIFE, $<ctxt>$)
963 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
968 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
969 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
971 if (xr == NULL) HANDLE_ERROR;
972 $<ctxt>$ = start_element(ELT_FAM_CHIL,
974 GEDCOM_MAKE_XREF_PTR(val1, xr));
975 START(CHIL, $<ctxt>$)
980 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
985 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
986 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
988 GEDCOM_MAKE_STRING(val1, $4));
989 START(NCHI, $<ctxt>$)
994 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
999 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1000 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1002 if (xr == NULL) HANDLE_ERROR;
1003 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1005 GEDCOM_MAKE_XREF_PTR(val1, xr));
1006 START(SUBM, $<ctxt>$)
1011 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1015 /*********************************************************************/
1016 /**** Individual record ****/
1017 /*********************************************************************/
1018 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1019 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1021 if (xr == NULL) HANDLE_ERROR;
1022 $<ctxt>$ = start_record(REC_INDI,
1023 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1024 NULL, GEDCOM_MAKE_NULL(val2));
1025 START(INDI, $<ctxt>$) }
1029 { end_record(REC_INDI, $<ctxt>6); }
1032 indi_subs : /* empty */
1033 | indi_subs indi_sub
1036 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1037 | pers_name_struc_sub /* 0:M */
1038 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1039 | indiv_even_struc_sub /* 0:M */
1040 | indiv_attr_struc_sub /* 0:M */
1041 | lds_indiv_ord_sub /* 0:M */
1042 | chi_fam_link_sub /* 0:M */
1043 | spou_fam_link_sub /* 0:M */
1044 | indi_subm_sect /* 0:M */
1045 | assoc_struc_sub /* 0:M */
1046 | indi_alia_sect /* 0:M */
1047 | indi_anci_sect /* 0:M */
1048 | indi_desi_sect /* 0:M */
1049 | source_cit_sub /* 0:M */
1050 | multim_link_sub /* 0:M */
1051 | note_struc_sub /* 0:M */
1052 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1053 | indi_afn_sect /* 0:M */
1054 | ident_struc_sub /* 0:1 */
1055 | change_date_sub /* 0:1 */
1056 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1057 INVALID_TAG("ADDR");
1063 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1064 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1066 GEDCOM_MAKE_STRING(val1, $4));
1067 START(RESN, $<ctxt>$)
1072 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1077 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1078 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1080 GEDCOM_MAKE_STRING(val1, $4));
1081 START(SEX, $<ctxt>$)
1086 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1091 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1092 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1094 if (xr == NULL) HANDLE_ERROR;
1095 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1097 GEDCOM_MAKE_XREF_PTR(val1, xr));
1098 START(SUBM, $<ctxt>$)
1103 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1108 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1109 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1111 if (xr == NULL) HANDLE_ERROR;
1112 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1114 GEDCOM_MAKE_XREF_PTR(val1, xr));
1115 START(ALIA, $<ctxt>$)
1120 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1125 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1126 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1128 if (xr == NULL) HANDLE_ERROR;
1129 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1131 GEDCOM_MAKE_XREF_PTR(val1, xr));
1132 START(ANCI, $<ctxt>$)
1137 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1142 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1143 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1145 if (xr == NULL) HANDLE_ERROR;
1146 $<ctxt>$ = start_element(ELT_INDI_DESI,
1148 GEDCOM_MAKE_XREF_PTR(val1, xr));
1149 START(DESI, $<ctxt>$)
1154 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1159 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1160 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1162 GEDCOM_MAKE_STRING(val1, $4));
1163 START(RFN, $<ctxt>$)
1168 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1173 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1174 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1176 GEDCOM_MAKE_STRING(val1, $4));
1177 START(AFN, $<ctxt>$)
1182 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1186 /* INDI.ADDR (Only for 'ftree' compatibility) */
1187 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1188 { if (compat_mode(C_FTREE)) {
1189 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1192 = start_element(ELT_SUB_ADDR,
1193 par, $1 + 1, $3, $4,
1194 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1195 START(ADDR, $<ctxt>$);
1197 else { START(ADDR, NULL) }
1202 { if (compat_mode(C_FTREE)) {
1203 Gedcom_ctxt par = PARENT;
1204 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1206 compat_generate_resi_end(PARENT, par);
1210 ftree_addr_subs : /* empty */
1211 | ftree_addr_subs ftree_addr_sub
1214 ftree_addr_sub : continuation_sub
1215 | ftree_addr_phon_sect
1219 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1221 = start_element(ELT_SUB_PHON,
1222 GRANDPARENT(1), $1, $3, $4,
1223 GEDCOM_MAKE_STRING(val1, $4));
1224 START(PHON, $<ctxt>$)
1229 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1234 /*********************************************************************/
1235 /**** Multimedia record ****/
1236 /*********************************************************************/
1237 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1238 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1240 if (xr == NULL) HANDLE_ERROR;
1241 $<ctxt>$ = start_record(REC_OBJE,
1242 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1243 NULL, GEDCOM_MAKE_NULL(val2));
1244 START(OBJE, $<ctxt>$) }
1246 { CHECK2(FORM, BLOB) }
1248 { end_record(REC_OBJE, $<ctxt>6); }
1251 obje_subs : /* empty */
1252 | obje_subs obje_sub
1255 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1256 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1257 | note_struc_sub /* 0:M */
1258 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1259 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1260 | ident_struc_sub /* 0:1 */
1261 | change_date_sub /* 0:1 */
1266 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1267 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1269 GEDCOM_MAKE_STRING(val1, $4));
1270 START(FORM, $<ctxt>$)
1275 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1280 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1281 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1283 GEDCOM_MAKE_STRING(val1, $4));
1284 START(TITL, $<ctxt>$)
1289 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1294 obje_blob_sect : OPEN DELIM TAG_BLOB
1295 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1296 PARENT, $1, $3, NULL,
1297 GEDCOM_MAKE_NULL(val1));
1298 START(BLOB, $<ctxt>$)
1303 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1307 obje_blob_subs : /* empty */
1308 | obje_blob_subs obje_blob_sub
1311 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1315 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1316 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1318 GEDCOM_MAKE_STRING(val1, $4));
1319 START(CONT, $<ctxt>$)
1324 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1330 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1331 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1333 if (xr == NULL) HANDLE_ERROR;
1334 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1336 GEDCOM_MAKE_XREF_PTR(val1, xr));
1337 START(OBJE, $<ctxt>$)
1342 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1346 /*********************************************************************/
1347 /**** Note record ****/
1348 /*********************************************************************/
1349 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1350 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1352 if (xr == NULL) HANDLE_ERROR;
1353 $<ctxt>$ = start_record(REC_NOTE,
1354 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1355 $6, GEDCOM_MAKE_STRING(val2, $6));
1356 START(NOTE, $<ctxt>$) }
1360 { end_record(REC_NOTE, $<ctxt>7); }
1363 note_line_item : /* empty */
1364 { if (!compat_mode(C_FTREE)) {
1365 gedcom_error(_("Missing value")); YYERROR;
1372 { gedcom_debug_print("==Val: %s==", $2);
1376 note_subs : /* empty */
1377 | note_subs note_sub
1380 note_sub : continuation_sub /* 0:M */
1381 | source_cit_sub /* 0:M */
1382 | ident_struc_sub /* 0:1 */
1383 | change_date_sub /* 0:1 */
1387 /*********************************************************************/
1388 /**** Repository record ****/
1389 /*********************************************************************/
1390 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1391 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1393 if (xr == NULL) HANDLE_ERROR;
1394 $<ctxt>$ = start_record(REC_REPO,
1395 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1396 NULL, GEDCOM_MAKE_NULL(val2));
1397 START(REPO, $<ctxt>$) }
1401 { end_record(REC_REPO, $<ctxt>6); }
1404 repo_subs : /* empty */
1405 | repo_subs repo_sub
1408 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1409 | addr_struc_sub /* 0:1 */
1410 | note_struc_sub /* 0:M */
1411 | ident_struc_sub /* 0:1 */
1412 | change_date_sub /* 0:1 */
1417 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1418 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1420 GEDCOM_MAKE_STRING(val1, $4));
1421 START(NAME, $<ctxt>$)
1426 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1430 /*********************************************************************/
1431 /**** Source record ****/
1432 /*********************************************************************/
1433 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1434 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1436 if (xr == NULL) HANDLE_ERROR;
1437 $<ctxt>$ = start_record(REC_SOUR,
1438 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1439 NULL, GEDCOM_MAKE_NULL(val2));
1440 START(SOUR, $<ctxt>$) }
1444 { end_record(REC_SOUR, $<ctxt>6); }
1447 sour_subs : /* empty */
1448 | sour_subs sour_sub
1451 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1452 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1453 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1454 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1455 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1456 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1457 | source_repos_cit_sub /* 0:1 */
1458 | multim_link_sub /* 0:M */
1459 | note_struc_sub /* 0:M */
1460 | ident_struc_sub /* 0:1 */
1461 | change_date_sub /* 0:1 */
1466 sour_data_sect : OPEN DELIM TAG_DATA
1467 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1468 PARENT, $1, $3, NULL,
1469 GEDCOM_MAKE_NULL(val1));
1470 START(DATA, $<ctxt>$)
1475 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1479 sour_data_subs : /* empty */
1480 | sour_data_subs sour_data_sub
1483 sour_data_sub : sour_data_even_sect /* 0:M */
1484 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1485 | note_struc_sub /* 0:M */
1489 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1490 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1492 GEDCOM_MAKE_STRING(val1, $4));
1493 START(EVEN, $<ctxt>$)
1498 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1503 sour_data_even_subs : /* empty */
1504 | sour_data_even_subs sour_data_even_sub
1507 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1508 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1512 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1513 { struct date_value dv = gedcom_parse_date($4);
1515 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1517 GEDCOM_MAKE_DATE(val1, dv));
1518 START(DATE, $<ctxt>$)
1523 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1528 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1530 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1532 GEDCOM_MAKE_STRING(val1, $4));
1533 START(PLAC, $<ctxt>$)
1538 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1543 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1544 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1546 GEDCOM_MAKE_STRING(val1, $4));
1547 START(AGNC, $<ctxt>$)
1552 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1558 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1559 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1561 GEDCOM_MAKE_STRING(val1, $4));
1562 START(AUTH, $<ctxt>$)
1567 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1571 sour_auth_subs : /* empty */
1572 | sour_auth_subs sour_auth_sub
1575 sour_auth_sub : continuation_sub /* 0:M */
1580 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1581 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1583 GEDCOM_MAKE_STRING(val1, $4));
1584 START(TITL, $<ctxt>$)
1589 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1593 sour_titl_subs : /* empty */
1594 | sour_titl_subs sour_titl_sub
1597 sour_titl_sub : continuation_sub /* 0:M */
1602 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1603 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1605 GEDCOM_MAKE_STRING(val1, $4));
1606 START(ABBR, $<ctxt>$)
1611 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1616 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1617 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1619 GEDCOM_MAKE_STRING(val1, $4));
1620 START(PUBL, $<ctxt>$)
1625 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1629 sour_publ_subs : /* empty */
1630 | sour_publ_subs sour_publ_sub
1633 sour_publ_sub : continuation_sub /* 0:M */
1638 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1639 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1641 GEDCOM_MAKE_STRING(val1, $4));
1642 START(TEXT, $<ctxt>$)
1647 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1651 sour_text_subs : /* empty */
1652 | sour_text_subs sour_text_sub
1655 sour_text_sub : continuation_sub /* 0:M */
1659 /*********************************************************************/
1660 /**** Submission record ****/
1661 /*********************************************************************/
1662 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1663 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1665 if (xr == NULL) HANDLE_ERROR;
1666 $<ctxt>$ = start_record(REC_SUBN,
1667 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1668 NULL, GEDCOM_MAKE_NULL(val2));
1669 START(SUBN, $<ctxt>$) }
1673 { end_record(REC_SUBN, $<ctxt>6); }
1676 subn_subs : /* empty */
1677 | subn_subs subn_sub
1680 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1681 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1682 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1683 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1684 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1685 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1686 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1691 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1692 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1694 if (xr == NULL) HANDLE_ERROR;
1695 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1697 GEDCOM_MAKE_XREF_PTR(val1, xr));
1698 START(SUBM, $<ctxt>$)
1703 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1708 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1709 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1711 GEDCOM_MAKE_STRING(val1, $4));
1712 START(FAMF, $<ctxt>$)
1717 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1722 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1723 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1725 GEDCOM_MAKE_STRING(val1, $4));
1726 START(TEMP, $<ctxt>$)
1731 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1736 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1737 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1739 GEDCOM_MAKE_STRING(val1, $4));
1740 START(ANCE, $<ctxt>$)
1745 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1750 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1751 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1753 GEDCOM_MAKE_STRING(val1, $4));
1754 START(DESC, $<ctxt>$)
1759 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1764 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1765 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1767 GEDCOM_MAKE_STRING(val1, $4));
1768 START(ORDI, $<ctxt>$)
1773 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1778 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1779 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1781 GEDCOM_MAKE_STRING(val1, $4));
1782 START(RIN, $<ctxt>$)
1787 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1791 /*********************************************************************/
1792 /**** Submitter record ****/
1793 /*********************************************************************/
1794 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1795 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1797 if (xr == NULL) HANDLE_ERROR;
1798 $<ctxt>$ = start_record(REC_SUBM,
1799 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1800 NULL, GEDCOM_MAKE_NULL(val2));
1801 START(SUBM, $<ctxt>$) }
1805 { end_record(REC_SUBM, $<ctxt>6); }
1808 subm_subs : /* empty */
1809 | subm_subs subm_sub
1812 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1813 | addr_struc_sub /* 0:1 */
1814 | multim_link_sub /* 0:M */
1815 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1816 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1817 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1818 | change_date_sub /* 0:1 */
1823 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1824 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1826 GEDCOM_MAKE_STRING(val1, $4));
1827 START(NAME, $<ctxt>$)
1832 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1837 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1838 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1840 GEDCOM_MAKE_STRING(val1, $4));
1841 START(LANG, $<ctxt>$)
1846 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1851 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1852 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1854 GEDCOM_MAKE_STRING(val1, $4));
1855 START(RFN, $<ctxt>$)
1860 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1865 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1866 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1868 GEDCOM_MAKE_STRING(val1, $4));
1869 START(RIN, $<ctxt>$)
1874 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1878 /*********************************************************************/
1879 /**** Substructures ****/
1880 /*********************************************************************/
1882 /* ADDRESS STRUCTURE */
1883 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1884 | phon_sect { OCCUR2(PHON, 0, 3) }
1887 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1888 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1890 GEDCOM_MAKE_STRING(val1, $4));
1891 START(ADDR, $<ctxt>$)
1896 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1900 addr_subs : /* empty */
1901 | addr_subs addr_sub
1904 addr_sub : addr_cont_sect /* 0:M */
1905 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1906 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1907 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1908 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1909 | addr_post_sect { OCCUR2(POST, 0, 1) }
1910 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1914 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1915 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1917 GEDCOM_MAKE_STRING(val1, $4));
1918 START(CONT, $<ctxt>$)
1923 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1926 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1927 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1929 GEDCOM_MAKE_STRING(val1, $4));
1930 START(ADR1, $<ctxt>$)
1935 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1938 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1939 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1941 GEDCOM_MAKE_STRING(val1, $4));
1942 START(ADR2, $<ctxt>$)
1947 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1950 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1951 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1953 GEDCOM_MAKE_STRING(val1, $4));
1954 START(CITY, $<ctxt>$)
1959 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1962 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1963 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1965 GEDCOM_MAKE_STRING(val1, $4));
1966 START(STAE, $<ctxt>$)
1971 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1974 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1975 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1977 GEDCOM_MAKE_STRING(val1, $4));
1978 START(POST, $<ctxt>$)
1983 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1986 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1987 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1989 GEDCOM_MAKE_STRING(val1, $4));
1990 START(CTRY, $<ctxt>$)
1995 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1999 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2000 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2002 GEDCOM_MAKE_STRING(val1, $4));
2003 START(PHON, $<ctxt>$)
2008 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
2012 /* ASSOCIATION STRUCTURE */
2013 assoc_struc_sub : asso_sect /* 0:M */
2016 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2017 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2019 if (xr == NULL) HANDLE_ERROR;
2020 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2022 GEDCOM_MAKE_XREF_PTR(val1, xr));
2023 START(ASSO, $<ctxt>$)
2026 { CHECK2(TYPE,RELA) }
2028 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2032 asso_subs : /* empty */
2033 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2034 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2040 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2041 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2043 GEDCOM_MAKE_STRING(val1, $4));
2044 START(TYPE, $<ctxt>$)
2049 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2053 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2054 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2056 GEDCOM_MAKE_STRING(val1, $4));
2057 START(RELA, $<ctxt>$)
2062 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2067 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2070 change_date_chan_sect : OPEN DELIM TAG_CHAN
2071 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2072 PARENT, $1, $3, NULL,
2073 GEDCOM_MAKE_NULL(val1));
2074 START(CHAN, $<ctxt>$)
2076 change_date_chan_subs
2079 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2083 change_date_chan_subs : /* empty */
2084 | change_date_chan_subs change_date_chan_sub
2087 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2092 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2093 { struct date_value dv = gedcom_parse_date($4);
2094 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2096 GEDCOM_MAKE_DATE(val1, dv));
2097 START(DATE, $<ctxt>$) }
2098 change_date_date_subs
2101 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2106 change_date_date_subs : /* empty */
2107 | change_date_date_subs change_date_date_sub
2110 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2114 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2116 = start_element(ELT_SUB_CHAN_TIME,
2118 GEDCOM_MAKE_STRING(val1, $4));
2119 START(TIME, $<ctxt>$)
2124 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2129 /* CHILD TO FAMILY LINK */
2130 chi_fam_link_sub : famc_sect /* 0:M */
2133 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2134 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2136 if (xr == NULL) HANDLE_ERROR;
2137 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2139 GEDCOM_MAKE_XREF_PTR(val1, xr));
2140 START(FAMC, $<ctxt>$)
2145 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2149 famc_subs : /* empty */
2150 | famc_subs famc_sub
2153 famc_sub : famc_pedi_sect /* 0:M */
2158 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2159 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2161 GEDCOM_MAKE_STRING(val1, $4));
2162 START(PEDI, $<ctxt>$)
2167 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2171 /* CONTINUATION SUBSECTIONS */
2172 continuation_sub : cont_sect /* 0:M */
2173 | conc_sect /* 0:M */
2176 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2177 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2179 GEDCOM_MAKE_STRING(val1, $4));
2180 START(CONT, $<ctxt>$)
2185 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2189 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2190 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2192 GEDCOM_MAKE_STRING(val1, $4));
2193 START(CONC, $<ctxt>$)
2198 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2203 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2204 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2207 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2208 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2209 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2215 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2217 = start_element(ELT_SUB_EVT_TYPE,
2219 GEDCOM_MAKE_STRING(val1, $4));
2220 START(TYPE, $<ctxt>$)
2225 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2229 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2230 { struct date_value dv = gedcom_parse_date($4);
2232 = start_element(ELT_SUB_EVT_DATE,
2234 GEDCOM_MAKE_DATE(val1, dv));
2235 START(DATE, $<ctxt>$)
2240 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2244 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2245 { struct age_value age = gedcom_parse_age($4);
2247 = start_element(ELT_SUB_EVT_AGE,
2249 GEDCOM_MAKE_AGE(val1, age));
2250 START(AGE, $<ctxt>$)
2255 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2259 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2261 = start_element(ELT_SUB_EVT_AGNC,
2263 GEDCOM_MAKE_STRING(val1, $4));
2264 START(AGNC, $<ctxt>$)
2269 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2273 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2275 = start_element(ELT_SUB_EVT_CAUS,
2277 GEDCOM_MAKE_STRING(val1, $4));
2278 START(CAUS, $<ctxt>$)
2283 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2288 /* FAMILY EVENT STRUCTURE */
2289 fam_event_struc_sub : fam_event_sect
2290 | fam_gen_even_sect /* 0:M */
2293 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2295 = start_element(ELT_SUB_FAM_EVT,
2297 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2303 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2307 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2308 | TAG_CENS { $$ = $1; START1(CENS) }
2309 | TAG_DIV { $$ = $1; START1(DIV) }
2310 | TAG_DIVF { $$ = $1; START1(DIVF) }
2311 | TAG_ENGA { $$ = $1; START1(ENGA) }
2312 | TAG_MARR { $$ = $1; START1(MARR) }
2313 | TAG_MARB { $$ = $1; START1(MARB) }
2314 | TAG_MARC { $$ = $1; START1(MARC) }
2315 | TAG_MARL { $$ = $1; START1(MARL) }
2316 | TAG_MARS { $$ = $1; START1(MARS) }
2319 fam_event_subs : /* empty */
2320 | fam_event_subs fam_event_sub
2323 fam_event_sub : event_detail_sub
2324 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2325 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2329 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2330 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2331 PARENT, $1, $3, NULL,
2332 GEDCOM_MAKE_NULL(val1));
2333 START(HUSB, $<ctxt>$)
2338 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2343 fam_even_husb_subs : /* empty */
2344 | fam_even_husb_subs fam_even_husb_sub
2347 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2351 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2352 { struct age_value age = gedcom_parse_age($4);
2353 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2355 GEDCOM_MAKE_AGE(val1, age));
2356 START(AGE, $<ctxt>$)
2361 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2366 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2367 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2368 PARENT, $1, $3, NULL,
2369 GEDCOM_MAKE_NULL(val1));
2370 START(WIFE, $<ctxt>$)
2375 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2380 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2381 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2382 PARENT, $1, $3, NULL,
2383 GEDCOM_MAKE_NULL(val1));
2384 START(EVEN, $<ctxt>$)
2389 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2394 fam_gen_even_subs : /* empty */
2395 | fam_gen_even_subs fam_gen_even_sub
2398 fam_gen_even_sub : event_detail_sub
2399 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2400 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2404 /* IDENTIFICATION STRUCTURE */
2405 ident_struc_sub : ident_refn_sect /* 0:M */
2406 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2409 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2410 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2412 GEDCOM_MAKE_STRING(val1, $4));
2413 START(REFN, $<ctxt>$)
2418 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2423 ident_refn_subs : /* empty */
2424 | ident_refn_subs ident_refn_sub
2427 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2431 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2433 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2435 GEDCOM_MAKE_STRING(val1, $4));
2436 START(TYPE, $<ctxt>$)
2441 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2446 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2447 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2449 GEDCOM_MAKE_STRING(val1, $4));
2450 START(RIN, $<ctxt>$)
2455 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2460 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2461 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2462 | indiv_resi_sect /* 0:M */
2465 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2466 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2468 GEDCOM_MAKE_STRING(val1, $4));
2471 indiv_attr_event_subs
2474 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2477 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2478 | TAG_DSCR { $$ = $1; START1(DSCR) }
2479 | TAG_EDUC { $$ = $1; START1(EDUC) }
2480 | TAG_IDNO { $$ = $1; START1(IDNO) }
2481 | TAG_NATI { $$ = $1; START1(NATI) }
2482 | TAG_NCHI { $$ = $1; START1(NCHI) }
2483 | TAG_NMR { $$ = $1; START1(NMR) }
2484 | TAG_OCCU { $$ = $1; START1(OCCU) }
2485 | TAG_PROP { $$ = $1; START1(PROP) }
2486 | TAG_RELI { $$ = $1; START1(RELI) }
2487 | TAG_SSN { $$ = $1; START1(SSN) }
2488 | TAG_TITL { $$ = $1; START1(TITL) }
2490 indiv_resi_sect : OPEN DELIM TAG_RESI
2491 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2492 PARENT, $1, $3, NULL,
2493 GEDCOM_MAKE_NULL(val1));
2494 START(RESI, $<ctxt>$)
2496 indiv_attr_event_subs
2499 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2503 indiv_attr_event_subs : /* empty */
2504 | indiv_attr_event_subs indiv_attr_event_sub
2507 indiv_attr_event_sub : event_detail_sub
2511 /* INDIVIDUAL EVENT STRUCTURE */
2512 indiv_even_struc_sub : indiv_birt_sect
2514 | indiv_adop_sect /* 0:M */
2515 | indiv_even_sect /* 0:M */
2518 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2520 = start_element(ELT_SUB_INDIV_BIRT,
2522 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2528 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2532 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2533 | TAG_CHR { $$ = $1; START1(CHR) }
2536 indiv_birt_subs : /* empty */
2537 | indiv_birt_subs indiv_birt_sub
2540 indiv_birt_sub : event_detail_sub
2541 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2545 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2546 { struct xref_value *xr = gedcom_parse_xref($4,
2549 if (xr == NULL) HANDLE_ERROR;
2551 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2553 GEDCOM_MAKE_XREF_PTR(val1, xr));
2554 START(FAMC, $<ctxt>$)
2559 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2564 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2566 = start_element(ELT_SUB_INDIV_GEN,
2568 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2574 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2578 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2579 | TAG_BURI { $$ = $1; START1(BURI) }
2580 | TAG_CREM { $$ = $1; START1(CREM) }
2581 | TAG_BAPM { $$ = $1; START1(BAPM) }
2582 | TAG_BARM { $$ = $1; START1(BARM) }
2583 | TAG_BASM { $$ = $1; START1(BASM) }
2584 | TAG_BLES { $$ = $1; START1(BLES) }
2585 | TAG_CHRA { $$ = $1; START1(CHRA) }
2586 | TAG_CONF { $$ = $1; START1(CONF) }
2587 | TAG_FCOM { $$ = $1; START1(FCOM) }
2588 | TAG_ORDN { $$ = $1; START1(ORDN) }
2589 | TAG_NATU { $$ = $1; START1(NATU) }
2590 | TAG_EMIG { $$ = $1; START1(EMIG) }
2591 | TAG_IMMI { $$ = $1; START1(IMMI) }
2592 | TAG_CENS { $$ = $1; START1(CENS) }
2593 | TAG_PROB { $$ = $1; START1(PROB) }
2594 | TAG_WILL { $$ = $1; START1(WILL) }
2595 | TAG_GRAD { $$ = $1; START1(GRAD) }
2596 | TAG_RETI { $$ = $1; START1(RETI) }
2599 indiv_gen_subs : /* empty */
2600 | indiv_gen_subs indiv_gen_sub
2603 indiv_gen_sub : event_detail_sub
2607 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2609 = start_element(ELT_SUB_INDIV_ADOP,
2611 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2612 START(ADOP, $<ctxt>$) }
2616 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2620 indiv_adop_subs : /* empty */
2621 | indiv_adop_subs indiv_adop_sub
2624 indiv_adop_sub : event_detail_sub
2625 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2629 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2630 { struct xref_value *xr = gedcom_parse_xref($4,
2633 if (xr == NULL) HANDLE_ERROR;
2635 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2637 GEDCOM_MAKE_XREF_PTR(val1, xr));
2638 START(FAMC, $<ctxt>$) }
2639 indiv_adop_famc_subs
2642 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2647 indiv_adop_famc_subs : /* empty */
2648 | indiv_adop_famc_subs indiv_adop_famc_sub
2651 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2655 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2657 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2659 GEDCOM_MAKE_STRING(val1, $4));
2660 START(ADOP, $<ctxt>$) }
2664 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2665 PARENT, $<ctxt>5, NULL);
2669 indiv_even_sect : OPEN DELIM TAG_EVEN
2670 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2671 PARENT, $1, $3, NULL,
2672 GEDCOM_MAKE_NULL(val1));
2673 START(EVEN, $<ctxt>$) }
2677 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2681 /* LDS INDIVIDUAL ORDINANCE */
2682 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2683 | lio_slgc_sect /* 0:M */
2686 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2687 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2688 PARENT, $1, $3, NULL,
2689 GEDCOM_MAKE_NULL(val1));
2695 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2699 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2700 | TAG_CONL { $$ = $1; START1(CONL) }
2701 | TAG_ENDL { $$ = $1; START1(ENDL) }
2704 lio_bapl_subs : /* empty */
2705 | lio_bapl_subs lio_bapl_sub
2708 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2709 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2710 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2711 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2717 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2718 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2720 GEDCOM_MAKE_STRING(val1, $4));
2721 START(STAT, $<ctxt>$)
2726 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2730 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2731 { struct date_value dv = gedcom_parse_date($4);
2732 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2734 GEDCOM_MAKE_DATE(val1, dv));
2735 START(DATE, $<ctxt>$)
2740 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2744 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2745 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2747 GEDCOM_MAKE_STRING(val1, $4));
2748 START(TEMP, $<ctxt>$)
2753 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2757 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2758 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2760 GEDCOM_MAKE_STRING(val1, $4));
2761 START(PLAC, $<ctxt>$)
2766 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2771 lio_slgc_sect : OPEN DELIM TAG_SLGC
2772 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2773 PARENT, $1, $3, NULL,
2774 GEDCOM_MAKE_NULL(val1));
2775 START(SLGC, $<ctxt>$)
2780 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2784 lio_slgc_subs : /* empty */
2785 | lio_slgc_subs lio_slgc_sub
2788 lio_slgc_sub : lio_bapl_sub
2789 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2792 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2793 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2795 if (xr == NULL) HANDLE_ERROR;
2797 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2799 GEDCOM_MAKE_XREF_PTR(val1, xr));
2800 START(FAMC, $<ctxt>$)
2805 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2810 /* LDS SPOUSE SEALING */
2811 lds_spouse_seal_sub : lss_slgs_sect
2814 lss_slgs_sect : OPEN DELIM TAG_SLGS
2815 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2816 PARENT, $1, $3, NULL,
2817 GEDCOM_MAKE_NULL(val1));
2818 START(SLGS, $<ctxt>$) }
2822 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2826 lss_slgs_subs : /* empty */
2827 | lss_slgs_subs lss_slgs_sub
2830 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2831 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2832 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2833 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2839 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2840 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2842 GEDCOM_MAKE_STRING(val1, $4));
2843 START(STAT, $<ctxt>$)
2848 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2852 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2853 { struct date_value dv = gedcom_parse_date($4);
2854 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2856 GEDCOM_MAKE_DATE(val1, dv));
2857 START(DATE, $<ctxt>$)
2862 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2866 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2867 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2869 GEDCOM_MAKE_STRING(val1, $4));
2870 START(TEMP, $<ctxt>$)
2875 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2879 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2880 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2882 GEDCOM_MAKE_STRING(val1, $4));
2883 START(PLAC, $<ctxt>$)
2888 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2893 /* MULTIMEDIA LINK */
2894 multim_link_sub : multim_obje_link_sect
2895 | multim_obje_emb_sect
2898 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2899 { struct xref_value *xr = gedcom_parse_xref($5,
2902 if (xr == NULL) HANDLE_ERROR;
2904 = start_element(ELT_SUB_MULTIM_OBJE,
2906 GEDCOM_MAKE_XREF_PTR(val1, xr));
2907 START(OBJE, $<ctxt>$)
2912 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2917 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2918 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2919 PARENT, $1, $3, NULL,
2920 GEDCOM_MAKE_NULL(val1));
2921 START(OBJE, $<ctxt>$)
2923 multim_obje_emb_subs
2924 { CHECK2(FORM,FILE) }
2926 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2931 multim_obje_emb_subs : /* empty */
2932 | multim_obje_emb_subs multim_obje_emb_sub
2935 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2936 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2937 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2942 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2944 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2946 GEDCOM_MAKE_STRING(val1, $4));
2947 START(FORM, $<ctxt>$)
2952 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2953 PARENT, $<ctxt>5, NULL);
2956 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2958 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2960 GEDCOM_MAKE_STRING(val1, $4));
2961 START(TITL, $<ctxt>$)
2966 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2967 PARENT, $<ctxt>5, NULL);
2970 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2972 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2974 GEDCOM_MAKE_STRING(val1, $4));
2975 START(FILE, $<ctxt>$)
2980 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2981 PARENT, $<ctxt>5, NULL);
2985 /* NOTE STRUCTURE */
2986 note_struc_sub : note_struc_link_sect /* 0:M */
2987 | note_struc_emb_sect /* 0:M */
2990 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2991 { struct xref_value *xr = gedcom_parse_xref($5,
2994 if (xr == NULL) HANDLE_ERROR;
2996 = start_element(ELT_SUB_NOTE,
2998 GEDCOM_MAKE_XREF_PTR(val1, xr));
2999 START(NOTE, $<ctxt>$)
3001 note_struc_link_subs
3004 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
3008 note_struc_link_subs : /* empty */
3009 | note_struc_link_subs note_struc_link_sub
3012 note_struc_link_sub : source_cit_sub
3016 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3018 = start_element(ELT_SUB_NOTE,
3020 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3021 START(NOTE, $<ctxt>$)
3026 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3030 note_struc_emb_subs : /* empty */
3031 | note_struc_emb_subs note_struc_emb_sub
3034 note_struc_emb_sub : continuation_sub
3039 /* PERSONAL NAME STRUCTURE */
3040 pers_name_struc_sub : pers_name_sect /* 0:M */
3043 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3044 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3046 GEDCOM_MAKE_STRING(val1, $4));
3047 START(NAME, $<ctxt>$)
3052 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3056 pers_name_subs : /* empty */
3057 | pers_name_subs pers_name_sub
3060 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3061 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3062 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3063 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3064 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3065 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3071 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3072 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3074 GEDCOM_MAKE_STRING(val1, $4));
3075 START(NPFX, $<ctxt>$)
3080 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3084 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3085 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3087 GEDCOM_MAKE_STRING(val1, $4));
3088 START(GIVN, $<ctxt>$)
3093 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3097 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3098 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3100 GEDCOM_MAKE_STRING(val1, $4));
3101 START(NICK, $<ctxt>$)
3106 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3110 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3111 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3113 GEDCOM_MAKE_STRING(val1, $4));
3114 START(SPFX, $<ctxt>$)
3119 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3123 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3124 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3126 GEDCOM_MAKE_STRING(val1, $4));
3127 START(SURN, $<ctxt>$)
3132 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3136 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3137 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3139 GEDCOM_MAKE_STRING(val1, $4));
3140 START(NSFX, $<ctxt>$)
3145 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3150 /* PLACE STRUCTURE */
3151 place_struc_sub : place_struc_plac_sect /* 0:M */
3154 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3156 = start_element(ELT_SUB_PLAC,
3158 GEDCOM_MAKE_STRING(val1, $4));
3159 START(PLAC, $<ctxt>$)
3161 place_struc_plac_subs
3164 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3168 place_struc_plac_subs : /* empty */
3169 | place_struc_plac_subs place_struc_plac_sub
3172 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3178 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3180 = start_element(ELT_SUB_PLAC_FORM,
3182 GEDCOM_MAKE_STRING(val1, $4));
3183 START(FORM, $<ctxt>$)
3188 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3193 /* SOURCE_CITATION */
3194 source_cit_sub : source_cit_link_sect /* 0:M */
3195 | source_cit_emb_sect /* 0:M */
3198 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3199 { struct xref_value *xr = gedcom_parse_xref($5,
3202 if (xr == NULL) HANDLE_ERROR;
3204 = start_element(ELT_SUB_SOUR,
3206 GEDCOM_MAKE_XREF_PTR(val1, xr));
3207 START(SOUR, $<ctxt>$)
3209 source_cit_link_subs
3212 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3216 source_cit_link_subs : /* empty */
3217 | source_cit_link_subs source_cit_link_sub
3220 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3221 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3222 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3223 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3229 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3231 = start_element(ELT_SUB_SOUR_PAGE,
3233 GEDCOM_MAKE_STRING(val1, $4));
3234 START(PAGE, $<ctxt>$)
3239 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3244 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3246 = start_element(ELT_SUB_SOUR_EVEN,
3248 GEDCOM_MAKE_STRING(val1, $4));
3249 START(EVEN, $<ctxt>$)
3251 source_cit_even_subs
3254 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3259 source_cit_even_subs : /* empty */
3260 | source_cit_even_subs source_cit_even_sub
3263 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3267 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3269 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3271 GEDCOM_MAKE_STRING(val1, $4));
3272 START(ROLE, $<ctxt>$)
3277 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3278 PARENT, $<ctxt>5, NULL);
3282 source_cit_data_sect : OPEN DELIM TAG_DATA
3283 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3284 PARENT, $1, $3, NULL,
3285 GEDCOM_MAKE_NULL(val1));
3286 START(DATA, $<ctxt>$)
3288 source_cit_data_subs
3291 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3296 source_cit_data_subs : /* empty */
3297 | source_cit_data_subs source_cit_data_sub
3300 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3301 | source_cit_text_sect /* 0:M */
3305 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3306 { struct date_value dv = gedcom_parse_date($4);
3308 = start_element(ELT_SUB_SOUR_DATA_DATE,
3310 GEDCOM_MAKE_DATE(val1, dv));
3311 START(DATE, $<ctxt>$)
3316 { end_element(ELT_SUB_SOUR_DATA_DATE,
3317 PARENT, $<ctxt>5, NULL);
3321 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3323 = start_element(ELT_SUB_SOUR_TEXT,
3325 GEDCOM_MAKE_STRING(val1, $4));
3326 START(TEXT, $<ctxt>$)
3328 source_cit_text_subs
3331 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3336 source_cit_text_subs : /* empty */
3337 | source_cit_text_subs source_cit_text_sub
3340 source_cit_text_sub : continuation_sub
3344 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3346 = start_element(ELT_SUB_SOUR_QUAY,
3348 GEDCOM_MAKE_STRING(val1, $4));
3349 START(QUAY, $<ctxt>$)
3354 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3359 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3360 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3362 GEDCOM_MAKE_STRING(val1, $4));
3363 START(SOUR, $<ctxt>$)
3368 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3372 source_cit_emb_subs : /* empty */
3373 | source_cit_emb_subs source_cit_emb_sub
3376 source_cit_emb_sub : continuation_sub
3377 | source_cit_text_sect /* 0:M */
3382 /* SOURCE REPOSITORY CITATION */
3383 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3386 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3387 { struct xref_value *xr
3388 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3389 if (xr == NULL) HANDLE_ERROR;
3391 = start_element(ELT_SUB_REPO,
3393 GEDCOM_MAKE_XREF_PTR(val1, xr));
3394 START(REPO, $<ctxt>$)
3396 source_repos_repo_subs
3399 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3403 source_repos_repo_subs : /* empty */
3404 | source_repos_repo_subs source_repos_repo_sub
3407 source_repos_repo_sub : note_struc_sub
3408 | caln_sect /* 0:M */
3412 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3413 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3415 GEDCOM_MAKE_STRING(val1, $4));
3416 START(CALN, $<ctxt>$)
3421 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3425 caln_subs : /* empty */
3426 | caln_subs caln_sub
3429 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3433 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3434 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3436 GEDCOM_MAKE_STRING(val1, $4));
3437 START(MEDI, $<ctxt>$)
3442 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3446 /* SPOUSE TO FAMILY LINK */
3447 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3450 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3451 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3453 if (xr == NULL) HANDLE_ERROR;
3455 = start_element(ELT_SUB_FAMS,
3457 GEDCOM_MAKE_XREF_PTR(val1, xr));
3458 START(FAMS, $<ctxt>$)
3463 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3467 spou_fam_fams_subs : /* empty */
3468 | spou_fam_fams_subs spou_fam_fams_sub
3471 spou_fam_fams_sub : note_struc_sub
3475 /*********************************************************************/
3477 /*********************************************************************/
3479 no_std_subs : /* empty */
3480 | no_std_subs no_std_sub
3483 no_std_sub : user_sect /* 0:M */
3485 | error error_subs CLOSE { HANDLE_ERROR }
3488 no_std_rec : user_rec /* 0:M */
3490 | error error_subs CLOSE { HANDLE_ERROR }
3493 user_rec : OPEN DELIM opt_xref USERTAG
3494 { if ($4.string[0] != '_') {
3495 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3501 { struct xref_value *xr = NULL;
3503 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3504 if (xr == NULL) HANDLE_ERROR;
3506 $<ctxt>$ = start_record(REC_USER,
3508 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3515 { end_record(REC_USER, $<ctxt>7); }
3517 user_sect : OPEN DELIM opt_xref USERTAG
3518 { if ($4.string[0] != '_') {
3519 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3525 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3526 START($4, $<ctxt>$);
3531 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3535 user_sects : /* empty */ { }
3536 | user_sects user_sect { }
3539 opt_xref : /* empty */ { $$ = NULL; }
3540 | POINTER DELIM { $$ = $1; }
3543 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3545 | DELIM POINTER { struct xref_value *xr
3546 = gedcom_parse_xref($2, XREF_USED,
3548 GEDCOM_MAKE_XREF_PTR(val2, xr);
3550 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3554 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3555 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3559 mand_line_item : /* empty */
3560 { if (compat_mode(C_LIFELINES)) {
3561 /* Lifelines tends to not care about mandatory values */
3562 gedcom_debug_print("==Val: ==");
3566 gedcom_error(_("Missing value")); YYERROR;
3569 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3573 opt_line_item : /* empty */ { $$ = NULL; }
3574 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3578 line_item : anychar { size_t i;
3579 CLEAR_BUFFER(line_item_buf);
3580 line_item_buf_ptr = line_item_buf;
3581 /* The following also takes care of '@@' */
3582 if (!strncmp($1, "@@", 3))
3583 *line_item_buf_ptr++ = '@';
3585 for (i=0; i < strlen($1); i++)
3586 *line_item_buf_ptr++ = $1[i];
3589 | ESCAPE { size_t i;
3590 CLEAR_BUFFER(line_item_buf);
3591 line_item_buf_ptr = line_item_buf;
3592 for (i=0; i < strlen($1); i++)
3593 *line_item_buf_ptr++ = $1[i];
3598 /* The following also takes care of '@@' */
3599 if (!strncmp($2, "@@", 3))
3600 *line_item_buf_ptr++ = '@';
3602 for (i=0; i < strlen($2); i++)
3603 *line_item_buf_ptr++ = $2[i];
3608 for (i=0; i < strlen($2); i++)
3609 *line_item_buf_ptr++ = $2[i];
3614 anychar : ANYCHAR { }
3618 error_subs : /* empty */
3619 | error_subs error_sect
3622 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3624 gen_sect : OPEN DELIM opt_xref anystdtag
3625 { INVALID_TAG($4.string); }
3626 opt_value opt_sects CLOSE
3630 gen_rec : gen_rec_top
3634 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3635 { INVALID_TOP_TAG($4.string) }
3636 opt_value opt_sects CLOSE
3640 gen_rec_top : OPEN DELIM anytoptag
3641 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3642 opt_value opt_sects CLOSE
3646 opt_sects : /* empty */ { }
3647 | opt_sects gen_sect { }
3650 anytag : USERTAG { }
3664 anystdtag : TAG_ABBR
3794 /* Functions that handle the counting of subtags */
3796 int* count_arrays[MAXGEDCLEVEL+1];
3797 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3798 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3800 void push_countarray()
3803 if (count_level > MAXGEDCLEVEL) {
3804 gedcom_error(_("Internal error: count array overflow"));
3808 count = (int *)calloc(YYNTOKENS, sizeof(int));
3809 if (count == NULL) {
3810 gedcom_error(_("Internal error: count array calloc error"));
3814 count_arrays[count_level] = count;
3819 void set_parenttag(char* tag)
3821 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3824 void set_parentctxt(Gedcom_ctxt ctxt)
3826 ctxt_stack[count_level+1] = ctxt;
3829 char* get_parenttag(int offset)
3831 return tag_stack[count_level - offset];
3834 Gedcom_ctxt get_parentctxt(int offset)
3836 return ctxt_stack[count_level - offset];
3839 int count_tag(int tag)
3841 int *count = count_arrays[count_level];
3842 return ++count[tag - GEDCOMTAGOFFSET];
3845 int check_occurrence(int tag)
3847 int *count = count_arrays[count_level];
3848 return (count[tag - GEDCOMTAGOFFSET] > 0);
3851 void pop_countarray()
3854 if (count_level < 0) {
3855 gedcom_error(_("Internal error: count array underflow"));
3859 count = count_arrays[count_level];
3861 count_arrays[count_level] = NULL;
3865 /* Enabling debug mode */
3866 /* level 0: no debugging */
3867 /* level 1: only internal */
3868 /* level 2: also bison */
3871 void gedcom_set_debug_level(int level, FILE* f)
3876 trace_output = stderr;
3878 gedcom_high_level_debug = 1;
3887 int gedcom_debug_print(char* s, ...)
3890 if (gedcom_high_level_debug) {
3893 res = vfprintf(trace_output, s, ap);
3895 fprintf(trace_output, "\n");
3900 /* Setting the error mechanism */
3901 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3903 error_mechanism = mechanism;