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(int level);
165 void set_parenttag(const 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);
174 #define CLEAR_BUFFER(BUF) \
175 memset(BUF, 0, sizeof(BUF));
177 #define HANDLE_ERROR \
178 { if (error_mechanism == IMMED_FAIL) { \
179 clean_up(); YYABORT; \
181 else if (error_mechanism == DEFER_FAIL) { \
184 else if (error_mechanism == IGNORE_ERRORS) { \
188 #define START1(PARENTTAG) \
189 { set_parenttag(#PARENTTAG); \
191 #define START2(LEVEL,PARENTCTXT) \
192 { set_parentctxt(PARENTCTXT); \
194 push_countarray(LEVEL); \
196 #define START(PARENTTAG,LEVEL,PARENTCTXT) \
197 { START1(PARENTTAG); \
198 START2(LEVEL,PARENTCTXT); \
202 #define GRANDPARENT(OFF) \
205 { if (!check_occurrence(TAG_##TAG)) { \
206 char* parenttag = get_parenttag(0); \
207 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
213 { pop_countarray(); \
217 #define CHECK1(TAG1) { CHK(TAG1); POP; }
218 #define CHECK2(TAG1,TAG2) \
219 { CHK(TAG1); CHK(TAG2); POP; }
220 #define CHECK3(TAG1,TAG2,TAG3) \
221 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
222 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
223 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
224 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
225 #define OCCUR2(CHILDTAG, MIN, MAX) \
226 { int num = count_tag(TAG_##CHILDTAG); \
228 char* parenttag = get_parenttag(0); \
229 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
230 #CHILDTAG, MAX, parenttag); \
234 #define INVALID_TAG(CHILDTAG) \
235 { char* parenttag = get_parenttag(0); \
236 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
237 CHILDTAG, parenttag); \
240 #define INVALID_TOP_TAG(CHILDTAG) \
241 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
251 struct tag_struct tag;
258 %token <string> BADTOKEN
260 %token <string> CLOSE
261 %token <string> ESCAPE
262 %token <string> DELIM
263 %token <string> ANYCHAR
264 %token <string> POINTER
266 %token <tag> TAG_ABBR
267 %token <tag> TAG_ADDR
268 %token <tag> TAG_ADR1
269 %token <tag> TAG_ADR2
270 %token <tag> TAG_ADOP
273 %token <tag> TAG_AGNC
274 %token <tag> TAG_ALIA
275 %token <tag> TAG_ANCE
276 %token <tag> TAG_ANCI
277 %token <tag> TAG_ANUL
278 %token <tag> TAG_ASSO
279 %token <tag> TAG_AUTH
280 %token <tag> TAG_BAPL
281 %token <tag> TAG_BAPM
282 %token <tag> TAG_BARM
283 %token <tag> TAG_BASM
284 %token <tag> TAG_BIRT
285 %token <tag> TAG_BLES
286 %token <tag> TAG_BLOB
287 %token <tag> TAG_BURI
288 %token <tag> TAG_CALN
289 %token <tag> TAG_CAST
290 %token <tag> TAG_CAUS
291 %token <tag> TAG_CENS
292 %token <tag> TAG_CHAN
293 %token <tag> TAG_CHAR
294 %token <tag> TAG_CHIL
296 %token <tag> TAG_CHRA
297 %token <tag> TAG_CITY
298 %token <tag> TAG_CONC
299 %token <tag> TAG_CONF
300 %token <tag> TAG_CONL
301 %token <tag> TAG_CONT
302 %token <tag> TAG_COPR
303 %token <tag> TAG_CORP
304 %token <tag> TAG_CREM
305 %token <tag> TAG_CTRY
306 %token <tag> TAG_DATA
307 %token <tag> TAG_DATE
308 %token <tag> TAG_DEAT
309 %token <tag> TAG_DESC
310 %token <tag> TAG_DESI
311 %token <tag> TAG_DEST
313 %token <tag> TAG_DIVF
314 %token <tag> TAG_DSCR
315 %token <tag> TAG_EDUC
316 %token <tag> TAG_EMIG
317 %token <tag> TAG_ENDL
318 %token <tag> TAG_ENGA
319 %token <tag> TAG_EVEN
321 %token <tag> TAG_FAMC
322 %token <tag> TAG_FAMF
323 %token <tag> TAG_FAMS
324 %token <tag> TAG_FCOM
325 %token <tag> TAG_FILE
326 %token <tag> TAG_FORM
327 %token <tag> TAG_GEDC
328 %token <tag> TAG_GIVN
329 %token <tag> TAG_GRAD
330 %token <tag> TAG_HEAD
331 %token <tag> TAG_HUSB
332 %token <tag> TAG_IDNO
333 %token <tag> TAG_IMMI
334 %token <tag> TAG_INDI
335 %token <tag> TAG_LANG
336 %token <tag> TAG_LEGA
337 %token <tag> TAG_MARB
338 %token <tag> TAG_MARC
339 %token <tag> TAG_MARL
340 %token <tag> TAG_MARR
341 %token <tag> TAG_MARS
342 %token <tag> TAG_MEDI
343 %token <tag> TAG_NAME
344 %token <tag> TAG_NATI
345 %token <tag> TAG_NATU
346 %token <tag> TAG_NCHI
347 %token <tag> TAG_NICK
349 %token <tag> TAG_NOTE
350 %token <tag> TAG_NPFX
351 %token <tag> TAG_NSFX
352 %token <tag> TAG_OBJE
353 %token <tag> TAG_OCCU
354 %token <tag> TAG_ORDI
355 %token <tag> TAG_ORDN
356 %token <tag> TAG_PAGE
357 %token <tag> TAG_PEDI
358 %token <tag> TAG_PHON
359 %token <tag> TAG_PLAC
360 %token <tag> TAG_POST
361 %token <tag> TAG_PROB
362 %token <tag> TAG_PROP
363 %token <tag> TAG_PUBL
364 %token <tag> TAG_QUAY
365 %token <tag> TAG_REFN
366 %token <tag> TAG_RELA
367 %token <tag> TAG_RELI
368 %token <tag> TAG_REPO
369 %token <tag> TAG_RESI
370 %token <tag> TAG_RESN
371 %token <tag> TAG_RETI
374 %token <tag> TAG_ROLE
376 %token <tag> TAG_SLGC
377 %token <tag> TAG_SLGS
378 %token <tag> TAG_SOUR
379 %token <tag> TAG_SPFX
381 %token <tag> TAG_STAE
382 %token <tag> TAG_STAT
383 %token <tag> TAG_SUBM
384 %token <tag> TAG_SUBN
385 %token <tag> TAG_SURN
386 %token <tag> TAG_TEMP
387 %token <tag> TAG_TEXT
388 %token <tag> TAG_TIME
389 %token <tag> TAG_TITL
390 %token <tag> TAG_TRLR
391 %token <tag> TAG_TYPE
392 %token <tag> TAG_VERS
393 %token <tag> TAG_WIFE
394 %token <tag> TAG_WILL
396 %type <tag> anystdtag
397 %type <tag> anytoptag
398 %type <tag> fam_event_tag
399 %type <tag> indiv_attr_tag
400 %type <tag> indiv_birt_tag
401 %type <tag> indiv_gen_tag
402 %type <tag> lio_bapl_tag
403 %type <string> line_item
404 %type <string> mand_line_item
405 %type <string> mand_pointer
406 %type <string> note_line_item
407 %type <string> anychar
408 %type <string> opt_xref
409 %type <string> opt_value
410 %type <string> opt_line_item
411 %type <ctxt> head_sect
415 file : head_sect records trlr_sect
416 { if (fail == 1) YYABORT; }
421 records : /* empty */
436 /*********************************************************************/
438 /*********************************************************************/
439 head_sect : OPEN DELIM TAG_HEAD
440 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
442 NULL, GEDCOM_MAKE_NULL(val2));
443 START(HEAD, $1, $<ctxt>$) }
445 { if (compat_mode(C_FTREE)) {
446 CHECK3(SOUR, GEDC, CHAR);
447 compat_generate_submitter_link($<ctxt>4);
449 else if (compat_mode(C_LIFELINES)) {
451 compat_generate_submitter_link($<ctxt>4);
452 compat_generate_gedcom($<ctxt>4);
453 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
456 CHECK4(SOUR, SUBM, GEDC, CHAR)
459 { end_record(REC_HEAD, $<ctxt>4);
460 if (compat_mode(C_FTREE | C_LIFELINES))
461 compat_generate_submitter();
465 head_subs : /* empty */
469 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
470 | head_dest_sect { OCCUR2(DEST, 0, 1) }
471 | head_date_sect { OCCUR2(DATE, 0, 1) }
472 | head_time_sect { if (!compat_mode(C_LIFELINES))
475 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
476 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
477 | head_file_sect { OCCUR2(FILE, 0, 1) }
478 | head_copr_sect { OCCUR2(COPR, 0, 1) }
479 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
480 | head_char_sect { OCCUR2(CHAR, 1, 1) }
481 | head_lang_sect { OCCUR2(LANG, 0, 1) }
482 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
483 | head_note_sect { OCCUR2(NOTE, 0, 1) }
488 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
489 { set_compatibility($4);
490 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
492 GEDCOM_MAKE_STRING(val1, $4));
493 START(SOUR, $1, $<ctxt>$)
498 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
501 head_sour_subs : /* empty */
502 | head_sour_subs head_sour_sub
505 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
506 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
507 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
508 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
512 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
513 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
515 GEDCOM_MAKE_STRING(val1, $4));
516 START(VERS, $1, $<ctxt>$)
521 { end_element(ELT_HEAD_SOUR_VERS,
522 PARENT, $<ctxt>5, NULL);
525 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
526 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
528 GEDCOM_MAKE_STRING(val1, $4));
529 START(NAME, $1, $<ctxt>$)
534 { end_element(ELT_HEAD_SOUR_NAME,
535 PARENT, $<ctxt>5, NULL);
538 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
539 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
541 GEDCOM_MAKE_STRING(val1, $4));
542 START(CORP, $1, $<ctxt>$)
547 { end_element(ELT_HEAD_SOUR_CORP,
548 PARENT, $<ctxt>5, NULL);
552 head_sour_corp_subs : /* empty */
553 | head_sour_corp_subs head_sour_corp_sub
556 head_sour_corp_sub : addr_struc_sub /* 0:1 */
560 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
561 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
563 GEDCOM_MAKE_STRING(val1, $4));
564 START(DATA, $1, $<ctxt>$)
569 { end_element(ELT_HEAD_SOUR_DATA,
570 PARENT, $<ctxt>5, NULL);
574 head_sour_data_subs : /* empty */
575 | head_sour_data_subs head_sour_data_sub
578 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
579 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
583 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
584 { struct date_value dv = gedcom_parse_date($4);
586 = start_element(ELT_HEAD_SOUR_DATA_DATE,
588 GEDCOM_MAKE_DATE(val1, dv));
589 START(DATE, $1, $<ctxt>$)
594 { end_element(ELT_HEAD_SOUR_DATA_DATE,
595 PARENT, $<ctxt>5, NULL);
598 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
600 = start_element(ELT_HEAD_SOUR_DATA_COPR,
602 GEDCOM_MAKE_STRING(val1, $4));
603 START(COPR, $1, $<ctxt>$)
608 { end_element(ELT_HEAD_SOUR_DATA_COPR,
609 PARENT, $<ctxt>5, NULL);
614 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
615 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
617 GEDCOM_MAKE_STRING(val1, $4));
618 START(DEST, $1, $<ctxt>$)
623 { end_element(ELT_HEAD_DEST,
624 PARENT, $<ctxt>5, NULL);
629 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
630 { struct date_value dv = gedcom_parse_date($4);
631 $<ctxt>$ = start_element(ELT_HEAD_DATE,
633 GEDCOM_MAKE_DATE(val1, dv));
634 START(DATE, $1, $<ctxt>$)
639 { end_element(ELT_HEAD_DATE,
640 PARENT, $<ctxt>5, NULL);
644 head_date_subs : /* empty */
645 | head_date_subs head_date_sub
648 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
652 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
653 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
655 GEDCOM_MAKE_STRING(val1, $4));
656 START(TIME, $1, $<ctxt>$)
661 { end_element(ELT_HEAD_DATE_TIME,
662 PARENT, $<ctxt>5, NULL);
666 /* HEAD.TIME (Only for 'Lifelines' compatibility) */
667 /* Just ignore the time... */
668 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
669 { gedcom_warning(_("Header change time lost in the compatibility"));
674 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
675 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
677 if (xr == NULL) HANDLE_ERROR;
678 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
680 GEDCOM_MAKE_XREF_PTR(val1, xr));
681 START(SUBM, $1, $<ctxt>$)
686 { end_element(ELT_HEAD_SUBM,
687 PARENT, $<ctxt>5, NULL);
691 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
692 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
694 if (xr == NULL) HANDLE_ERROR;
695 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
697 GEDCOM_MAKE_XREF_PTR(val1, xr));
698 START(SUBN, $1, $<ctxt>$)
703 { end_element(ELT_HEAD_SUBN,
704 PARENT, $<ctxt>5, NULL);
708 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
709 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
711 GEDCOM_MAKE_STRING(val1, $4));
712 START(FILE, $1, $<ctxt>$)
717 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
721 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
722 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
724 GEDCOM_MAKE_STRING(val1, $4));
725 START(COPR, $1, $<ctxt>$)
730 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
734 head_gedc_sect : OPEN DELIM TAG_GEDC
735 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
736 PARENT, $1, $3, NULL,
737 GEDCOM_MAKE_NULL(val1));
738 START(GEDC, $1, $<ctxt>$)
741 { CHECK2(VERS, FORM) }
743 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
747 head_gedc_subs : /* empty */
748 | head_gedc_subs head_gedc_sub
751 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
752 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
755 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
756 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
758 GEDCOM_MAKE_STRING(val1, $4));
759 START(VERS, $1, $<ctxt>$)
764 { end_element(ELT_HEAD_GEDC_VERS,
765 PARENT, $<ctxt>5, NULL);
768 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
769 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
771 GEDCOM_MAKE_STRING(val1, $4));
772 START(FORM, $1, $<ctxt>$)
777 { end_element(ELT_HEAD_GEDC_FORM,
778 PARENT, $<ctxt>5, NULL);
783 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
784 { /* Don't allow to continue if conversion context couldn't
786 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
787 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
789 GEDCOM_MAKE_STRING(val1, $4));
790 START(CHAR, $1, $<ctxt>$)
795 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
799 head_char_subs : /* empty */
800 | head_char_subs head_char_sub
803 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
806 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
807 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
809 GEDCOM_MAKE_STRING(val1, $4));
810 START(VERS, $1, $<ctxt>$)
815 { end_element(ELT_HEAD_CHAR_VERS,
816 PARENT, $<ctxt>5, NULL);
821 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
822 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
824 GEDCOM_MAKE_STRING(val1, $4));
825 START(LANG, $1, $<ctxt>$)
830 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
834 head_plac_sect : OPEN DELIM TAG_PLAC
835 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
836 PARENT, $1, $3, NULL,
837 GEDCOM_MAKE_NULL(val1));
838 START(PLAC, $1, $<ctxt>$)
843 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
847 head_plac_subs : /* empty */
848 | head_plac_subs head_plac_sub
851 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
854 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
855 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
857 GEDCOM_MAKE_STRING(val1, $4));
858 START(FORM, $1, $<ctxt>$)
863 { end_element(ELT_HEAD_PLAC_FORM,
864 PARENT, $<ctxt>5, NULL);
869 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
870 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
872 GEDCOM_MAKE_STRING(val1, $4));
873 START(NOTE, $1, $<ctxt>$)
878 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
882 head_note_subs : /* empty */
883 | head_note_subs head_note_sub
886 head_note_sub : continuation_sub /* 0:M */
890 /*********************************************************************/
892 /*********************************************************************/
893 /* Don't need callbacks here, there is no information... */
894 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
897 /*********************************************************************/
898 /**** Family record ****/
899 /*********************************************************************/
900 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
901 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
903 if (xr == NULL) HANDLE_ERROR;
904 $<ctxt>$ = start_record(REC_FAM,
905 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
907 NULL, GEDCOM_MAKE_NULL(val2));
908 START(FAM, $1, $<ctxt>$) }
912 { end_record(REC_FAM, $<ctxt>6); }
915 fam_subs : /* empty */
919 fam_sub : fam_event_struc_sub /* 0:M */
920 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
921 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
922 | fam_chil_sect /* 0:M */
923 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
924 | fam_subm_sect /* 0:M */
925 | lds_spouse_seal_sub /* 0:M */
926 | source_cit_sub /* 0:M */
927 | multim_link_sub /* 0:M */
928 | note_struc_sub /* 0:M */
929 | ident_struc_sub /* 0:1 */
930 | change_date_sub /* 0:1 */
935 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
936 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
938 if (xr == NULL) HANDLE_ERROR;
939 $<ctxt>$ = start_element(ELT_FAM_HUSB,
941 GEDCOM_MAKE_XREF_PTR(val1, xr));
942 START(HUSB, $1, $<ctxt>$)
947 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
952 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
953 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
955 if (xr == NULL) HANDLE_ERROR;
956 $<ctxt>$ = start_element(ELT_FAM_WIFE,
958 GEDCOM_MAKE_XREF_PTR(val1, xr));
959 START(WIFE, $1, $<ctxt>$)
964 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
969 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
970 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
972 if (xr == NULL) HANDLE_ERROR;
973 $<ctxt>$ = start_element(ELT_FAM_CHIL,
975 GEDCOM_MAKE_XREF_PTR(val1, xr));
976 START(CHIL, $1, $<ctxt>$)
981 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
986 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
987 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
989 GEDCOM_MAKE_STRING(val1, $4));
990 START(NCHI, $1, $<ctxt>$)
995 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
1000 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1001 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1003 if (xr == NULL) HANDLE_ERROR;
1004 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1006 GEDCOM_MAKE_XREF_PTR(val1, xr));
1007 START(SUBM, $1, $<ctxt>$)
1012 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1016 /*********************************************************************/
1017 /**** Individual record ****/
1018 /*********************************************************************/
1019 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1020 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1022 if (xr == NULL) HANDLE_ERROR;
1023 $<ctxt>$ = start_record(REC_INDI,
1024 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1025 NULL, GEDCOM_MAKE_NULL(val2));
1026 START(INDI, $1, $<ctxt>$) }
1030 { end_record(REC_INDI, $<ctxt>6); }
1033 indi_subs : /* empty */
1034 | indi_subs indi_sub
1037 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1038 | pers_name_struc_sub /* 0:M */
1039 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1040 | indiv_even_struc_sub /* 0:M */
1041 | indiv_attr_struc_sub /* 0:M */
1042 | lds_indiv_ord_sub /* 0:M */
1043 | chi_fam_link_sub /* 0:M */
1044 | spou_fam_link_sub /* 0:M */
1045 | indi_subm_sect /* 0:M */
1046 | assoc_struc_sub /* 0:M */
1047 | indi_alia_sect /* 0:M */
1048 | indi_anci_sect /* 0:M */
1049 | indi_desi_sect /* 0:M */
1050 | source_cit_sub /* 0:M */
1051 | multim_link_sub /* 0:M */
1052 | note_struc_sub /* 0:M */
1053 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1054 | indi_afn_sect /* 0:M */
1055 | ident_struc_sub /* 0:1 */
1056 | change_date_sub /* 0:1 */
1057 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1058 INVALID_TAG("ADDR");
1064 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1065 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1067 GEDCOM_MAKE_STRING(val1, $4));
1068 START(RESN, $1, $<ctxt>$)
1073 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1078 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1079 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1081 GEDCOM_MAKE_STRING(val1, $4));
1082 START(SEX, $1, $<ctxt>$)
1087 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1092 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1093 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1095 if (xr == NULL) HANDLE_ERROR;
1096 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1098 GEDCOM_MAKE_XREF_PTR(val1, xr));
1099 START(SUBM, $1, $<ctxt>$)
1104 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1109 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1110 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1112 if (xr == NULL) HANDLE_ERROR;
1113 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1115 GEDCOM_MAKE_XREF_PTR(val1, xr));
1116 START(ALIA, $1, $<ctxt>$)
1121 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1126 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1127 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1129 if (xr == NULL) HANDLE_ERROR;
1130 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1132 GEDCOM_MAKE_XREF_PTR(val1, xr));
1133 START(ANCI, $1, $<ctxt>$)
1138 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1143 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1144 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1146 if (xr == NULL) HANDLE_ERROR;
1147 $<ctxt>$ = start_element(ELT_INDI_DESI,
1149 GEDCOM_MAKE_XREF_PTR(val1, xr));
1150 START(DESI, $1, $<ctxt>$)
1155 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1160 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1161 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1163 GEDCOM_MAKE_STRING(val1, $4));
1164 START(RFN, $1, $<ctxt>$)
1169 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1174 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1175 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1177 GEDCOM_MAKE_STRING(val1, $4));
1178 START(AFN, $1, $<ctxt>$)
1183 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1187 /* INDI.ADDR (Only for 'ftree' compatibility) */
1188 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1189 { if (compat_mode(C_FTREE)) {
1190 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1191 START(RESI, $1, par);
1193 = start_element(ELT_SUB_ADDR,
1194 par, $1 + 1, $3, $4,
1195 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1196 START(ADDR, $1, $<ctxt>$);
1198 else { START(ADDR, $1, NULL) }
1203 { if (compat_mode(C_FTREE)) {
1204 Gedcom_ctxt par = PARENT;
1205 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1207 compat_generate_resi_end(PARENT, par);
1211 ftree_addr_subs : /* empty */
1212 | ftree_addr_subs ftree_addr_sub
1215 ftree_addr_sub : continuation_sub
1216 | ftree_addr_phon_sect
1220 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1222 = start_element(ELT_SUB_PHON,
1223 GRANDPARENT(1), $1, $3, $4,
1224 GEDCOM_MAKE_STRING(val1, $4));
1225 START(PHON, $1, $<ctxt>$)
1230 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1235 /*********************************************************************/
1236 /**** Multimedia record ****/
1237 /*********************************************************************/
1238 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1239 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1241 if (xr == NULL) HANDLE_ERROR;
1242 $<ctxt>$ = start_record(REC_OBJE,
1243 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1244 NULL, GEDCOM_MAKE_NULL(val2));
1245 START(OBJE, $1, $<ctxt>$) }
1247 { CHECK2(FORM, BLOB) }
1249 { end_record(REC_OBJE, $<ctxt>6); }
1252 obje_subs : /* empty */
1253 | obje_subs obje_sub
1256 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1257 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1258 | note_struc_sub /* 0:M */
1259 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1260 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1261 | ident_struc_sub /* 0:1 */
1262 | change_date_sub /* 0:1 */
1267 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1268 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1270 GEDCOM_MAKE_STRING(val1, $4));
1271 START(FORM, $1, $<ctxt>$)
1276 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1281 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1282 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1284 GEDCOM_MAKE_STRING(val1, $4));
1285 START(TITL, $1, $<ctxt>$)
1290 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1295 obje_blob_sect : OPEN DELIM TAG_BLOB
1296 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1297 PARENT, $1, $3, NULL,
1298 GEDCOM_MAKE_NULL(val1));
1299 START(BLOB, $1, $<ctxt>$)
1304 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1308 obje_blob_subs : /* empty */
1309 | obje_blob_subs obje_blob_sub
1312 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1316 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1317 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1319 GEDCOM_MAKE_STRING(val1, $4));
1320 START(CONT, $1, $<ctxt>$)
1325 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1331 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1332 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1334 if (xr == NULL) HANDLE_ERROR;
1335 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1337 GEDCOM_MAKE_XREF_PTR(val1, xr));
1338 START(OBJE, $1, $<ctxt>$)
1343 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1347 /*********************************************************************/
1348 /**** Note record ****/
1349 /*********************************************************************/
1350 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1351 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1353 if (xr == NULL) HANDLE_ERROR;
1354 $<ctxt>$ = start_record(REC_NOTE,
1355 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1356 $6, GEDCOM_MAKE_STRING(val2, $6));
1357 START(NOTE, $1, $<ctxt>$) }
1361 { end_record(REC_NOTE, $<ctxt>7); }
1364 note_line_item : /* empty */
1365 { if (!compat_mode(C_FTREE)) {
1366 gedcom_error(_("Missing value")); YYERROR;
1373 { gedcom_debug_print("==Val: %s==", $2);
1377 note_subs : /* empty */
1378 | note_subs note_sub
1381 note_sub : continuation_sub /* 0:M */
1382 | source_cit_sub /* 0:M */
1383 | ident_struc_sub /* 0:1 */
1384 | change_date_sub /* 0:1 */
1388 /*********************************************************************/
1389 /**** Repository record ****/
1390 /*********************************************************************/
1391 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1392 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1394 if (xr == NULL) HANDLE_ERROR;
1395 $<ctxt>$ = start_record(REC_REPO,
1396 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1397 NULL, GEDCOM_MAKE_NULL(val2));
1398 START(REPO, $1, $<ctxt>$) }
1402 { end_record(REC_REPO, $<ctxt>6); }
1405 repo_subs : /* empty */
1406 | repo_subs repo_sub
1409 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1410 | addr_struc_sub /* 0:1 */
1411 | note_struc_sub /* 0:M */
1412 | ident_struc_sub /* 0:1 */
1413 | change_date_sub /* 0:1 */
1418 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1419 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1421 GEDCOM_MAKE_STRING(val1, $4));
1422 START(NAME, $1, $<ctxt>$)
1427 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1431 /*********************************************************************/
1432 /**** Source record ****/
1433 /*********************************************************************/
1434 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1435 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1437 if (xr == NULL) HANDLE_ERROR;
1438 $<ctxt>$ = start_record(REC_SOUR,
1439 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1440 NULL, GEDCOM_MAKE_NULL(val2));
1441 START(SOUR, $1, $<ctxt>$) }
1445 { end_record(REC_SOUR, $<ctxt>6); }
1448 sour_subs : /* empty */
1449 | sour_subs sour_sub
1452 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1453 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1454 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1455 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1456 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1457 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1458 | source_repos_cit_sub /* 0:1 */
1459 | multim_link_sub /* 0:M */
1460 | note_struc_sub /* 0:M */
1461 | ident_struc_sub /* 0:1 */
1462 | change_date_sub /* 0:1 */
1467 sour_data_sect : OPEN DELIM TAG_DATA
1468 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1469 PARENT, $1, $3, NULL,
1470 GEDCOM_MAKE_NULL(val1));
1471 START(DATA, $1, $<ctxt>$)
1476 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1480 sour_data_subs : /* empty */
1481 | sour_data_subs sour_data_sub
1484 sour_data_sub : sour_data_even_sect /* 0:M */
1485 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1486 | note_struc_sub /* 0:M */
1490 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1491 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1493 GEDCOM_MAKE_STRING(val1, $4));
1494 START(EVEN, $1, $<ctxt>$)
1499 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1504 sour_data_even_subs : /* empty */
1505 | sour_data_even_subs sour_data_even_sub
1508 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1509 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1513 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1514 { struct date_value dv = gedcom_parse_date($4);
1516 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1518 GEDCOM_MAKE_DATE(val1, dv));
1519 START(DATE, $1, $<ctxt>$)
1524 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1529 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1531 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1533 GEDCOM_MAKE_STRING(val1, $4));
1534 START(PLAC, $1, $<ctxt>$)
1539 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1544 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1545 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1547 GEDCOM_MAKE_STRING(val1, $4));
1548 START(AGNC, $1, $<ctxt>$)
1553 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1559 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1560 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1562 GEDCOM_MAKE_STRING(val1, $4));
1563 START(AUTH, $1, $<ctxt>$)
1568 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1572 sour_auth_subs : /* empty */
1573 | sour_auth_subs sour_auth_sub
1576 sour_auth_sub : continuation_sub /* 0:M */
1581 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1582 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1584 GEDCOM_MAKE_STRING(val1, $4));
1585 START(TITL, $1, $<ctxt>$)
1590 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1594 sour_titl_subs : /* empty */
1595 | sour_titl_subs sour_titl_sub
1598 sour_titl_sub : continuation_sub /* 0:M */
1603 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1604 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1606 GEDCOM_MAKE_STRING(val1, $4));
1607 START(ABBR, $1, $<ctxt>$)
1612 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1617 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1618 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1620 GEDCOM_MAKE_STRING(val1, $4));
1621 START(PUBL, $1, $<ctxt>$)
1626 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1630 sour_publ_subs : /* empty */
1631 | sour_publ_subs sour_publ_sub
1634 sour_publ_sub : continuation_sub /* 0:M */
1639 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1640 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1642 GEDCOM_MAKE_STRING(val1, $4));
1643 START(TEXT, $1, $<ctxt>$)
1648 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1652 sour_text_subs : /* empty */
1653 | sour_text_subs sour_text_sub
1656 sour_text_sub : continuation_sub /* 0:M */
1660 /*********************************************************************/
1661 /**** Submission record ****/
1662 /*********************************************************************/
1663 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1664 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1666 if (xr == NULL) HANDLE_ERROR;
1667 $<ctxt>$ = start_record(REC_SUBN,
1668 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1669 NULL, GEDCOM_MAKE_NULL(val2));
1670 START(SUBN, $1, $<ctxt>$) }
1674 { end_record(REC_SUBN, $<ctxt>6); }
1677 subn_subs : /* empty */
1678 | subn_subs subn_sub
1681 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1682 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1683 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1684 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1685 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1686 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1687 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1692 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1693 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1695 if (xr == NULL) HANDLE_ERROR;
1696 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1698 GEDCOM_MAKE_XREF_PTR(val1, xr));
1699 START(SUBM, $1, $<ctxt>$)
1704 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1709 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1710 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1712 GEDCOM_MAKE_STRING(val1, $4));
1713 START(FAMF, $1, $<ctxt>$)
1718 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1723 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1724 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1726 GEDCOM_MAKE_STRING(val1, $4));
1727 START(TEMP, $1, $<ctxt>$)
1732 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1737 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1738 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1740 GEDCOM_MAKE_STRING(val1, $4));
1741 START(ANCE, $1, $<ctxt>$)
1746 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1751 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1752 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1754 GEDCOM_MAKE_STRING(val1, $4));
1755 START(DESC, $1, $<ctxt>$)
1760 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1765 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1766 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1768 GEDCOM_MAKE_STRING(val1, $4));
1769 START(ORDI, $1, $<ctxt>$)
1774 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1779 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1780 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1782 GEDCOM_MAKE_STRING(val1, $4));
1783 START(RIN, $1, $<ctxt>$)
1788 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1792 /*********************************************************************/
1793 /**** Submitter record ****/
1794 /*********************************************************************/
1795 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1796 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1798 if (xr == NULL) HANDLE_ERROR;
1799 $<ctxt>$ = start_record(REC_SUBM,
1800 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1801 NULL, GEDCOM_MAKE_NULL(val2));
1802 START(SUBM, $1, $<ctxt>$) }
1806 { end_record(REC_SUBM, $<ctxt>6); }
1809 subm_subs : /* empty */
1810 | subm_subs subm_sub
1813 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1814 | addr_struc_sub /* 0:1 */
1815 | multim_link_sub /* 0:M */
1816 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1817 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1818 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1819 | change_date_sub /* 0:1 */
1824 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1825 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1827 GEDCOM_MAKE_STRING(val1, $4));
1828 START(NAME, $1, $<ctxt>$)
1833 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1838 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1839 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1841 GEDCOM_MAKE_STRING(val1, $4));
1842 START(LANG, $1, $<ctxt>$)
1847 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1852 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1853 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1855 GEDCOM_MAKE_STRING(val1, $4));
1856 START(RFN, $1, $<ctxt>$)
1861 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1866 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1867 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1869 GEDCOM_MAKE_STRING(val1, $4));
1870 START(RIN, $1, $<ctxt>$)
1875 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1879 /*********************************************************************/
1880 /**** Substructures ****/
1881 /*********************************************************************/
1883 /* ADDRESS STRUCTURE */
1884 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1885 | phon_sect { OCCUR2(PHON, 0, 3) }
1888 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1889 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1891 GEDCOM_MAKE_STRING(val1, $4));
1892 START(ADDR, $1, $<ctxt>$)
1897 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1901 addr_subs : /* empty */
1902 | addr_subs addr_sub
1905 addr_sub : addr_cont_sect /* 0:M */
1906 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1907 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1908 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1909 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1910 | addr_post_sect { OCCUR2(POST, 0, 1) }
1911 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1915 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1916 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1918 GEDCOM_MAKE_STRING(val1, $4));
1919 START(CONT, $1, $<ctxt>$)
1924 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1927 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1928 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1930 GEDCOM_MAKE_STRING(val1, $4));
1931 START(ADR1, $1, $<ctxt>$)
1936 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1939 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1940 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1942 GEDCOM_MAKE_STRING(val1, $4));
1943 START(ADR2, $1, $<ctxt>$)
1948 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1951 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1952 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1954 GEDCOM_MAKE_STRING(val1, $4));
1955 START(CITY, $1, $<ctxt>$)
1960 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1963 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1964 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1966 GEDCOM_MAKE_STRING(val1, $4));
1967 START(STAE, $1, $<ctxt>$)
1972 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1975 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1976 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1978 GEDCOM_MAKE_STRING(val1, $4));
1979 START(POST, $1, $<ctxt>$)
1984 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1987 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1988 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1990 GEDCOM_MAKE_STRING(val1, $4));
1991 START(CTRY, $1, $<ctxt>$)
1996 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
2000 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2001 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2003 GEDCOM_MAKE_STRING(val1, $4));
2004 START(PHON, $1, $<ctxt>$)
2009 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
2013 /* ASSOCIATION STRUCTURE */
2014 assoc_struc_sub : asso_sect /* 0:M */
2017 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2018 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2020 if (xr == NULL) HANDLE_ERROR;
2021 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2023 GEDCOM_MAKE_XREF_PTR(val1, xr));
2024 START(ASSO, $1, $<ctxt>$)
2027 { CHECK2(TYPE,RELA) }
2029 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2033 asso_subs : /* empty */
2034 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2035 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2041 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2042 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2044 GEDCOM_MAKE_STRING(val1, $4));
2045 START(TYPE, $1, $<ctxt>$)
2050 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2054 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2055 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2057 GEDCOM_MAKE_STRING(val1, $4));
2058 START(RELA, $1, $<ctxt>$)
2063 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2068 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2071 change_date_chan_sect : OPEN DELIM TAG_CHAN
2072 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2073 PARENT, $1, $3, NULL,
2074 GEDCOM_MAKE_NULL(val1));
2075 START(CHAN, $1, $<ctxt>$)
2077 change_date_chan_subs
2080 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2084 change_date_chan_subs : /* empty */
2085 | change_date_chan_subs change_date_chan_sub
2088 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2093 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2094 { struct date_value dv = gedcom_parse_date($4);
2095 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2097 GEDCOM_MAKE_DATE(val1, dv));
2098 START(DATE, $1, $<ctxt>$) }
2099 change_date_date_subs
2102 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2107 change_date_date_subs : /* empty */
2108 | change_date_date_subs change_date_date_sub
2111 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2115 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2117 = start_element(ELT_SUB_CHAN_TIME,
2119 GEDCOM_MAKE_STRING(val1, $4));
2120 START(TIME, $1, $<ctxt>$)
2125 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2130 /* CHILD TO FAMILY LINK */
2131 chi_fam_link_sub : famc_sect /* 0:M */
2134 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2135 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2137 if (xr == NULL) HANDLE_ERROR;
2138 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2140 GEDCOM_MAKE_XREF_PTR(val1, xr));
2141 START(FAMC, $1, $<ctxt>$)
2146 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2150 famc_subs : /* empty */
2151 | famc_subs famc_sub
2154 famc_sub : famc_pedi_sect /* 0:M */
2159 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2160 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2162 GEDCOM_MAKE_STRING(val1, $4));
2163 START(PEDI, $1, $<ctxt>$)
2168 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2172 /* CONTINUATION SUBSECTIONS */
2173 continuation_sub : cont_sect /* 0:M */
2174 | conc_sect /* 0:M */
2177 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2178 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2180 GEDCOM_MAKE_STRING(val1, $4));
2181 START(CONT, $1, $<ctxt>$)
2186 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2190 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2191 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2193 GEDCOM_MAKE_STRING(val1, $4));
2194 START(CONC, $1, $<ctxt>$)
2199 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2204 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2205 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2208 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2209 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2210 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2216 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2218 = start_element(ELT_SUB_EVT_TYPE,
2220 GEDCOM_MAKE_STRING(val1, $4));
2221 START(TYPE, $1, $<ctxt>$)
2226 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2230 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2231 { struct date_value dv = gedcom_parse_date($4);
2233 = start_element(ELT_SUB_EVT_DATE,
2235 GEDCOM_MAKE_DATE(val1, dv));
2236 START(DATE, $1, $<ctxt>$)
2241 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2245 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2246 { struct age_value age = gedcom_parse_age($4);
2248 = start_element(ELT_SUB_EVT_AGE,
2250 GEDCOM_MAKE_AGE(val1, age));
2251 START(AGE, $1, $<ctxt>$)
2256 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2260 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2262 = start_element(ELT_SUB_EVT_AGNC,
2264 GEDCOM_MAKE_STRING(val1, $4));
2265 START(AGNC, $1, $<ctxt>$)
2270 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2274 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2276 = start_element(ELT_SUB_EVT_CAUS,
2278 GEDCOM_MAKE_STRING(val1, $4));
2279 START(CAUS, $1, $<ctxt>$)
2284 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2289 /* FAMILY EVENT STRUCTURE */
2290 fam_event_struc_sub : fam_event_sect
2291 | fam_gen_even_sect /* 0:M */
2294 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2296 = start_element(ELT_SUB_FAM_EVT,
2298 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2299 START2($1, $<ctxt>$);
2304 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2308 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2309 | TAG_CENS { $$ = $1; START1(CENS) }
2310 | TAG_DIV { $$ = $1; START1(DIV) }
2311 | TAG_DIVF { $$ = $1; START1(DIVF) }
2312 | TAG_ENGA { $$ = $1; START1(ENGA) }
2313 | TAG_MARR { $$ = $1; START1(MARR) }
2314 | TAG_MARB { $$ = $1; START1(MARB) }
2315 | TAG_MARC { $$ = $1; START1(MARC) }
2316 | TAG_MARL { $$ = $1; START1(MARL) }
2317 | TAG_MARS { $$ = $1; START1(MARS) }
2320 fam_event_subs : /* empty */
2321 | fam_event_subs fam_event_sub
2324 fam_event_sub : event_detail_sub
2325 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2326 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2330 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2331 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2332 PARENT, $1, $3, NULL,
2333 GEDCOM_MAKE_NULL(val1));
2334 START(HUSB, $1, $<ctxt>$)
2339 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2344 fam_even_husb_subs : /* empty */
2345 | fam_even_husb_subs fam_even_husb_sub
2348 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2352 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2353 { struct age_value age = gedcom_parse_age($4);
2354 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2356 GEDCOM_MAKE_AGE(val1, age));
2357 START(AGE, $1, $<ctxt>$)
2362 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2367 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2368 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2369 PARENT, $1, $3, NULL,
2370 GEDCOM_MAKE_NULL(val1));
2371 START(WIFE, $1, $<ctxt>$)
2376 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2381 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2382 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2383 PARENT, $1, $3, NULL,
2384 GEDCOM_MAKE_NULL(val1));
2385 START(EVEN, $1, $<ctxt>$)
2390 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2395 fam_gen_even_subs : /* empty */
2396 | fam_gen_even_subs fam_gen_even_sub
2399 fam_gen_even_sub : event_detail_sub
2400 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2401 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2405 /* IDENTIFICATION STRUCTURE */
2406 ident_struc_sub : ident_refn_sect /* 0:M */
2407 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2410 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2411 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2413 GEDCOM_MAKE_STRING(val1, $4));
2414 START(REFN, $1, $<ctxt>$)
2419 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2424 ident_refn_subs : /* empty */
2425 | ident_refn_subs ident_refn_sub
2428 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2432 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2434 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2436 GEDCOM_MAKE_STRING(val1, $4));
2437 START(TYPE, $1, $<ctxt>$)
2442 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2447 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2448 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2450 GEDCOM_MAKE_STRING(val1, $4));
2451 START(RIN, $1, $<ctxt>$)
2456 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2461 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2462 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2463 | indiv_resi_sect /* 0:M */
2466 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2467 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2469 GEDCOM_MAKE_STRING(val1, $4));
2470 START2($1, $<ctxt>$);
2472 indiv_attr_event_subs
2475 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2478 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2479 | TAG_DSCR { $$ = $1; START1(DSCR) }
2480 | TAG_EDUC { $$ = $1; START1(EDUC) }
2481 | TAG_IDNO { $$ = $1; START1(IDNO) }
2482 | TAG_NATI { $$ = $1; START1(NATI) }
2483 | TAG_NCHI { $$ = $1; START1(NCHI) }
2484 | TAG_NMR { $$ = $1; START1(NMR) }
2485 | TAG_OCCU { $$ = $1; START1(OCCU) }
2486 | TAG_PROP { $$ = $1; START1(PROP) }
2487 | TAG_RELI { $$ = $1; START1(RELI) }
2488 | TAG_SSN { $$ = $1; START1(SSN) }
2489 | TAG_TITL { $$ = $1; START1(TITL) }
2491 indiv_resi_sect : OPEN DELIM TAG_RESI
2492 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2493 PARENT, $1, $3, NULL,
2494 GEDCOM_MAKE_NULL(val1));
2495 START(RESI, $1, $<ctxt>$)
2497 indiv_attr_event_subs
2500 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2504 indiv_attr_event_subs : /* empty */
2505 | indiv_attr_event_subs indiv_attr_event_sub
2508 indiv_attr_event_sub : event_detail_sub
2512 /* INDIVIDUAL EVENT STRUCTURE */
2513 indiv_even_struc_sub : indiv_birt_sect
2515 | indiv_adop_sect /* 0:M */
2516 | indiv_even_sect /* 0:M */
2519 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2521 = start_element(ELT_SUB_INDIV_BIRT,
2523 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2524 START2($1, $<ctxt>$);
2529 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2533 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2534 | TAG_CHR { $$ = $1; START1(CHR) }
2537 indiv_birt_subs : /* empty */
2538 | indiv_birt_subs indiv_birt_sub
2541 indiv_birt_sub : event_detail_sub
2542 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2546 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2547 { struct xref_value *xr = gedcom_parse_xref($4,
2550 if (xr == NULL) HANDLE_ERROR;
2552 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2554 GEDCOM_MAKE_XREF_PTR(val1, xr));
2555 START(FAMC, $1, $<ctxt>$)
2560 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2565 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2567 = start_element(ELT_SUB_INDIV_GEN,
2569 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2570 START2($1, $<ctxt>$);
2575 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2579 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2580 | TAG_BURI { $$ = $1; START1(BURI) }
2581 | TAG_CREM { $$ = $1; START1(CREM) }
2582 | TAG_BAPM { $$ = $1; START1(BAPM) }
2583 | TAG_BARM { $$ = $1; START1(BARM) }
2584 | TAG_BASM { $$ = $1; START1(BASM) }
2585 | TAG_BLES { $$ = $1; START1(BLES) }
2586 | TAG_CHRA { $$ = $1; START1(CHRA) }
2587 | TAG_CONF { $$ = $1; START1(CONF) }
2588 | TAG_FCOM { $$ = $1; START1(FCOM) }
2589 | TAG_ORDN { $$ = $1; START1(ORDN) }
2590 | TAG_NATU { $$ = $1; START1(NATU) }
2591 | TAG_EMIG { $$ = $1; START1(EMIG) }
2592 | TAG_IMMI { $$ = $1; START1(IMMI) }
2593 | TAG_CENS { $$ = $1; START1(CENS) }
2594 | TAG_PROB { $$ = $1; START1(PROB) }
2595 | TAG_WILL { $$ = $1; START1(WILL) }
2596 | TAG_GRAD { $$ = $1; START1(GRAD) }
2597 | TAG_RETI { $$ = $1; START1(RETI) }
2600 indiv_gen_subs : /* empty */
2601 | indiv_gen_subs indiv_gen_sub
2604 indiv_gen_sub : event_detail_sub
2608 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2610 = start_element(ELT_SUB_INDIV_ADOP,
2612 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2613 START(ADOP, $1, $<ctxt>$) }
2617 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2621 indiv_adop_subs : /* empty */
2622 | indiv_adop_subs indiv_adop_sub
2625 indiv_adop_sub : event_detail_sub
2626 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2630 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2631 { struct xref_value *xr = gedcom_parse_xref($4,
2634 if (xr == NULL) HANDLE_ERROR;
2636 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2638 GEDCOM_MAKE_XREF_PTR(val1, xr));
2639 START(FAMC, $1, $<ctxt>$) }
2640 indiv_adop_famc_subs
2643 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2648 indiv_adop_famc_subs : /* empty */
2649 | indiv_adop_famc_subs indiv_adop_famc_sub
2652 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2656 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2658 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2660 GEDCOM_MAKE_STRING(val1, $4));
2661 START(ADOP, $1, $<ctxt>$) }
2665 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2666 PARENT, $<ctxt>5, NULL);
2670 indiv_even_sect : OPEN DELIM TAG_EVEN
2671 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2672 PARENT, $1, $3, NULL,
2673 GEDCOM_MAKE_NULL(val1));
2674 START(EVEN, $1, $<ctxt>$) }
2678 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2682 /* LDS INDIVIDUAL ORDINANCE */
2683 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2684 | lio_slgc_sect /* 0:M */
2687 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2688 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2689 PARENT, $1, $3, NULL,
2690 GEDCOM_MAKE_NULL(val1));
2691 START2($1, $<ctxt>$);
2696 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2700 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2701 | TAG_CONL { $$ = $1; START1(CONL) }
2702 | TAG_ENDL { $$ = $1; START1(ENDL) }
2705 lio_bapl_subs : /* empty */
2706 | lio_bapl_subs lio_bapl_sub
2709 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2710 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2711 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2712 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2718 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2719 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2721 GEDCOM_MAKE_STRING(val1, $4));
2722 START(STAT, $1, $<ctxt>$)
2727 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2731 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2732 { struct date_value dv = gedcom_parse_date($4);
2733 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2735 GEDCOM_MAKE_DATE(val1, dv));
2736 START(DATE, $1, $<ctxt>$)
2741 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2745 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2746 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2748 GEDCOM_MAKE_STRING(val1, $4));
2749 START(TEMP, $1, $<ctxt>$)
2754 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2758 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2759 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2761 GEDCOM_MAKE_STRING(val1, $4));
2762 START(PLAC, $1, $<ctxt>$)
2767 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2772 lio_slgc_sect : OPEN DELIM TAG_SLGC
2773 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2774 PARENT, $1, $3, NULL,
2775 GEDCOM_MAKE_NULL(val1));
2776 START(SLGC, $1, $<ctxt>$)
2781 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2785 lio_slgc_subs : /* empty */
2786 | lio_slgc_subs lio_slgc_sub
2789 lio_slgc_sub : lio_bapl_sub
2790 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2793 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2794 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2796 if (xr == NULL) HANDLE_ERROR;
2798 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2800 GEDCOM_MAKE_XREF_PTR(val1, xr));
2801 START(FAMC, $1, $<ctxt>$)
2806 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2811 /* LDS SPOUSE SEALING */
2812 lds_spouse_seal_sub : lss_slgs_sect
2815 lss_slgs_sect : OPEN DELIM TAG_SLGS
2816 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2817 PARENT, $1, $3, NULL,
2818 GEDCOM_MAKE_NULL(val1));
2819 START(SLGS, $1, $<ctxt>$) }
2823 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2827 lss_slgs_subs : /* empty */
2828 | lss_slgs_subs lss_slgs_sub
2831 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2832 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2833 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2834 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2840 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2841 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2843 GEDCOM_MAKE_STRING(val1, $4));
2844 START(STAT, $1, $<ctxt>$)
2849 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2853 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2854 { struct date_value dv = gedcom_parse_date($4);
2855 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2857 GEDCOM_MAKE_DATE(val1, dv));
2858 START(DATE, $1, $<ctxt>$)
2863 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2867 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2868 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2870 GEDCOM_MAKE_STRING(val1, $4));
2871 START(TEMP, $1, $<ctxt>$)
2876 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2880 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2881 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2883 GEDCOM_MAKE_STRING(val1, $4));
2884 START(PLAC, $1, $<ctxt>$)
2889 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2894 /* MULTIMEDIA LINK */
2895 multim_link_sub : multim_obje_link_sect
2896 | multim_obje_emb_sect
2899 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2900 { struct xref_value *xr = gedcom_parse_xref($5,
2903 if (xr == NULL) HANDLE_ERROR;
2905 = start_element(ELT_SUB_MULTIM_OBJE,
2907 GEDCOM_MAKE_XREF_PTR(val1, xr));
2908 START(OBJE, $1, $<ctxt>$)
2913 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2918 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2919 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2920 PARENT, $1, $3, NULL,
2921 GEDCOM_MAKE_NULL(val1));
2922 START(OBJE, $1, $<ctxt>$)
2924 multim_obje_emb_subs
2925 { CHECK2(FORM,FILE) }
2927 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2932 multim_obje_emb_subs : /* empty */
2933 | multim_obje_emb_subs multim_obje_emb_sub
2936 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2937 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2938 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2943 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2945 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2947 GEDCOM_MAKE_STRING(val1, $4));
2948 START(FORM, $1, $<ctxt>$)
2953 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2954 PARENT, $<ctxt>5, NULL);
2957 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2959 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2961 GEDCOM_MAKE_STRING(val1, $4));
2962 START(TITL, $1, $<ctxt>$)
2967 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2968 PARENT, $<ctxt>5, NULL);
2971 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2973 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2975 GEDCOM_MAKE_STRING(val1, $4));
2976 START(FILE, $1, $<ctxt>$)
2981 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2982 PARENT, $<ctxt>5, NULL);
2986 /* NOTE STRUCTURE */
2987 note_struc_sub : note_struc_link_sect /* 0:M */
2988 | note_struc_emb_sect /* 0:M */
2991 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2992 { struct xref_value *xr = gedcom_parse_xref($5,
2995 if (xr == NULL) HANDLE_ERROR;
2997 = start_element(ELT_SUB_NOTE,
2999 GEDCOM_MAKE_XREF_PTR(val1, xr));
3000 START(NOTE, $1, $<ctxt>$)
3002 note_struc_link_subs
3005 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
3009 note_struc_link_subs : /* empty */
3010 | note_struc_link_subs note_struc_link_sub
3013 note_struc_link_sub : source_cit_sub
3017 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3019 = start_element(ELT_SUB_NOTE,
3021 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3022 START(NOTE, $1, $<ctxt>$)
3027 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3031 note_struc_emb_subs : /* empty */
3032 | note_struc_emb_subs note_struc_emb_sub
3035 note_struc_emb_sub : continuation_sub
3040 /* PERSONAL NAME STRUCTURE */
3041 pers_name_struc_sub : pers_name_sect /* 0:M */
3044 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3045 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3047 GEDCOM_MAKE_STRING(val1, $4));
3048 START(NAME, $1, $<ctxt>$)
3053 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3057 pers_name_subs : /* empty */
3058 | pers_name_subs pers_name_sub
3061 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3062 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3063 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3064 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3065 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3066 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3072 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3073 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3075 GEDCOM_MAKE_STRING(val1, $4));
3076 START(NPFX, $1, $<ctxt>$)
3081 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3085 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3086 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3088 GEDCOM_MAKE_STRING(val1, $4));
3089 START(GIVN, $1, $<ctxt>$)
3094 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3098 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3099 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3101 GEDCOM_MAKE_STRING(val1, $4));
3102 START(NICK, $1, $<ctxt>$)
3107 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3111 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3112 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3114 GEDCOM_MAKE_STRING(val1, $4));
3115 START(SPFX, $1, $<ctxt>$)
3120 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3124 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3125 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3127 GEDCOM_MAKE_STRING(val1, $4));
3128 START(SURN, $1, $<ctxt>$)
3133 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3137 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3138 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3140 GEDCOM_MAKE_STRING(val1, $4));
3141 START(NSFX, $1, $<ctxt>$)
3146 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3151 /* PLACE STRUCTURE */
3152 place_struc_sub : place_struc_plac_sect /* 0:M */
3155 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3157 = start_element(ELT_SUB_PLAC,
3159 GEDCOM_MAKE_STRING(val1, $4));
3160 START(PLAC, $1, $<ctxt>$)
3162 place_struc_plac_subs
3165 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3169 place_struc_plac_subs : /* empty */
3170 | place_struc_plac_subs place_struc_plac_sub
3173 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3179 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3181 = start_element(ELT_SUB_PLAC_FORM,
3183 GEDCOM_MAKE_STRING(val1, $4));
3184 START(FORM, $1, $<ctxt>$)
3189 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3194 /* SOURCE_CITATION */
3195 source_cit_sub : source_cit_link_sect /* 0:M */
3196 | source_cit_emb_sect /* 0:M */
3199 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3200 { struct xref_value *xr = gedcom_parse_xref($5,
3203 if (xr == NULL) HANDLE_ERROR;
3205 = start_element(ELT_SUB_SOUR,
3207 GEDCOM_MAKE_XREF_PTR(val1, xr));
3208 START(SOUR, $1, $<ctxt>$)
3210 source_cit_link_subs
3213 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3217 source_cit_link_subs : /* empty */
3218 | source_cit_link_subs source_cit_link_sub
3221 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3222 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3223 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3224 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3230 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3232 = start_element(ELT_SUB_SOUR_PAGE,
3234 GEDCOM_MAKE_STRING(val1, $4));
3235 START(PAGE, $1, $<ctxt>$)
3240 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3245 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3247 = start_element(ELT_SUB_SOUR_EVEN,
3249 GEDCOM_MAKE_STRING(val1, $4));
3250 START(EVEN, $1, $<ctxt>$)
3252 source_cit_even_subs
3255 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3260 source_cit_even_subs : /* empty */
3261 | source_cit_even_subs source_cit_even_sub
3264 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3268 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3270 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3272 GEDCOM_MAKE_STRING(val1, $4));
3273 START(ROLE, $1, $<ctxt>$)
3278 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3279 PARENT, $<ctxt>5, NULL);
3283 source_cit_data_sect : OPEN DELIM TAG_DATA
3284 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3285 PARENT, $1, $3, NULL,
3286 GEDCOM_MAKE_NULL(val1));
3287 START(DATA, $1, $<ctxt>$)
3289 source_cit_data_subs
3292 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3297 source_cit_data_subs : /* empty */
3298 | source_cit_data_subs source_cit_data_sub
3301 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3302 | source_cit_text_sect /* 0:M */
3306 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3307 { struct date_value dv = gedcom_parse_date($4);
3309 = start_element(ELT_SUB_SOUR_DATA_DATE,
3311 GEDCOM_MAKE_DATE(val1, dv));
3312 START(DATE, $1, $<ctxt>$)
3317 { end_element(ELT_SUB_SOUR_DATA_DATE,
3318 PARENT, $<ctxt>5, NULL);
3322 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3324 = start_element(ELT_SUB_SOUR_TEXT,
3326 GEDCOM_MAKE_STRING(val1, $4));
3327 START(TEXT, $1, $<ctxt>$)
3329 source_cit_text_subs
3332 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3337 source_cit_text_subs : /* empty */
3338 | source_cit_text_subs source_cit_text_sub
3341 source_cit_text_sub : continuation_sub
3345 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3347 = start_element(ELT_SUB_SOUR_QUAY,
3349 GEDCOM_MAKE_STRING(val1, $4));
3350 START(QUAY, $1, $<ctxt>$)
3355 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3360 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3361 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3363 GEDCOM_MAKE_STRING(val1, $4));
3364 START(SOUR, $1, $<ctxt>$)
3369 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3373 source_cit_emb_subs : /* empty */
3374 | source_cit_emb_subs source_cit_emb_sub
3377 source_cit_emb_sub : continuation_sub
3378 | source_cit_text_sect /* 0:M */
3383 /* SOURCE REPOSITORY CITATION */
3384 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3387 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3388 { struct xref_value *xr
3389 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3390 if (xr == NULL) HANDLE_ERROR;
3392 = start_element(ELT_SUB_REPO,
3394 GEDCOM_MAKE_XREF_PTR(val1, xr));
3395 START(REPO, $1, $<ctxt>$)
3397 source_repos_repo_subs
3400 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3404 source_repos_repo_subs : /* empty */
3405 | source_repos_repo_subs source_repos_repo_sub
3408 source_repos_repo_sub : note_struc_sub
3409 | caln_sect /* 0:M */
3413 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3414 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3416 GEDCOM_MAKE_STRING(val1, $4));
3417 START(CALN, $1, $<ctxt>$)
3422 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3426 caln_subs : /* empty */
3427 | caln_subs caln_sub
3430 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3434 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3435 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3437 GEDCOM_MAKE_STRING(val1, $4));
3438 START(MEDI, $1, $<ctxt>$)
3443 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3447 /* SPOUSE TO FAMILY LINK */
3448 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3451 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3452 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3454 if (xr == NULL) HANDLE_ERROR;
3456 = start_element(ELT_SUB_FAMS,
3458 GEDCOM_MAKE_XREF_PTR(val1, xr));
3459 START(FAMS, $1, $<ctxt>$)
3464 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3468 spou_fam_fams_subs : /* empty */
3469 | spou_fam_fams_subs spou_fam_fams_sub
3472 spou_fam_fams_sub : note_struc_sub
3476 /*********************************************************************/
3478 /*********************************************************************/
3480 no_std_subs : /* empty */
3481 | no_std_subs no_std_sub
3484 no_std_sub : user_sect /* 0:M */
3487 CLOSE { HANDLE_ERROR }
3490 no_std_rec : user_rec /* 0:M */
3493 CLOSE { HANDLE_ERROR }
3496 user_rec : OPEN DELIM opt_xref USERTAG
3497 { if ($4.string[0] != '_') {
3498 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3504 { struct xref_value *xr = NULL;
3506 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3507 if (xr == NULL) HANDLE_ERROR;
3509 $<ctxt>$ = start_record(REC_USER,
3511 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3513 START($4, $1, $<ctxt>$)
3518 { end_record(REC_USER, $<ctxt>7); }
3520 user_sect : OPEN DELIM opt_xref USERTAG
3521 { if ($4.string[0] != '_') {
3522 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3528 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3529 START($4, $1, $<ctxt>$);
3534 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3538 user_sects : /* empty */ { }
3539 | user_sects user_sect { }
3542 opt_xref : /* empty */ { $$ = NULL; }
3543 | POINTER DELIM { $$ = $1; }
3546 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3548 | DELIM POINTER { struct xref_value *xr
3549 = gedcom_parse_xref($2, XREF_USED,
3551 GEDCOM_MAKE_XREF_PTR(val2, xr);
3553 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3557 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3558 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3562 mand_line_item : /* empty */
3563 { if (compat_mode(C_LIFELINES)) {
3564 /* Lifelines tends to not care about mandatory values */
3565 gedcom_debug_print("==Val: ==");
3569 gedcom_error(_("Missing value")); YYERROR;
3572 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3576 opt_line_item : /* empty */ { $$ = NULL; }
3577 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3581 line_item : anychar { size_t i;
3582 CLEAR_BUFFER(line_item_buf);
3583 line_item_buf_ptr = line_item_buf;
3584 /* The following also takes care of '@@' */
3585 if (!strncmp($1, "@@", 3))
3586 *line_item_buf_ptr++ = '@';
3588 for (i=0; i < strlen($1); i++)
3589 *line_item_buf_ptr++ = $1[i];
3592 | ESCAPE { size_t i;
3593 CLEAR_BUFFER(line_item_buf);
3594 line_item_buf_ptr = line_item_buf;
3595 for (i=0; i < strlen($1); i++)
3596 *line_item_buf_ptr++ = $1[i];
3601 /* The following also takes care of '@@' */
3602 if (!strncmp($2, "@@", 3))
3603 *line_item_buf_ptr++ = '@';
3605 for (i=0; i < strlen($2); i++)
3606 *line_item_buf_ptr++ = $2[i];
3611 for (i=0; i < strlen($2); i++)
3612 *line_item_buf_ptr++ = $2[i];
3615 | line_item error anychar { HANDLE_ERROR; }
3616 | line_item error ESCAPE { HANDLE_ERROR; }
3619 anychar : ANYCHAR { }
3623 error_subs : /* empty */
3624 | error_subs error_sect
3627 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3629 gen_sect : OPEN DELIM opt_xref anystdtag
3630 { INVALID_TAG($4.string); }
3631 opt_value opt_sects CLOSE
3635 gen_rec : gen_rec_top
3639 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3640 { INVALID_TOP_TAG($4.string) }
3641 opt_value opt_sects CLOSE
3645 gen_rec_top : OPEN DELIM anytoptag
3646 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3647 opt_value opt_sects CLOSE
3651 opt_sects : /* empty */ { }
3652 | opt_sects gen_sect { }
3655 anytag : USERTAG { }
3669 anystdtag : TAG_ABBR
3799 /* Functions that handle the counting of subtags */
3801 int* count_arrays[MAXGEDCLEVEL+1];
3802 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3803 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3805 void push_countarray(int level)
3808 gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
3809 if (count_level != level + 1) {
3810 gedcom_error(_("Internal error: count level mismatch"));
3813 if (count_level > MAXGEDCLEVEL) {
3814 gedcom_error(_("Internal error: count array overflow"));
3818 gedcom_debug_print("calloc countarray %d\n", count_level);
3819 count = (int *)calloc(YYNTOKENS, sizeof(int));
3820 if (count == NULL) {
3821 gedcom_error(_("Internal error: count array calloc error"));
3825 count_arrays[count_level] = count;
3830 void set_parenttag(const char* tag)
3832 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3835 void set_parentctxt(Gedcom_ctxt ctxt)
3837 ctxt_stack[count_level+1] = ctxt;
3840 char* get_parenttag(int offset)
3842 return tag_stack[count_level - offset];
3845 Gedcom_ctxt get_parentctxt(int offset)
3847 return ctxt_stack[count_level - offset];
3850 int count_tag(int tag)
3852 int *count = count_arrays[count_level];
3853 return ++count[tag - GEDCOMTAGOFFSET];
3856 int check_occurrence(int tag)
3858 int *count = count_arrays[count_level];
3859 return (count[tag - GEDCOMTAGOFFSET] > 0);
3862 void pop_countarray()
3865 gedcom_debug_print("Pop Count level: %d\n", count_level);
3866 if (count_level < 0) {
3867 gedcom_error(_("Internal error: count array underflow"));
3871 count = count_arrays[count_level];
3872 gedcom_debug_print("free countarray %d\n", count_level);
3874 count_arrays[count_level] = NULL;
3880 gedcom_debug_print("Cleanup countarrays\n");
3881 while (count_level > 0) {
3887 /* Enabling debug mode */
3888 /* level 0: no debugging */
3889 /* level 1: only internal */
3890 /* level 2: also bison */
3893 void gedcom_set_debug_level(int level, FILE* f)
3898 trace_output = stderr;
3900 gedcom_high_level_debug = 1;
3909 int gedcom_debug_print(const char* s, ...)
3912 if (gedcom_high_level_debug) {
3915 res = vfprintf(trace_output, s, ap);
3917 fprintf(trace_output, "\n");
3922 /* Setting the error mechanism */
3923 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3925 error_mechanism = mechanism;