4 /* WARNING: THIS PARSER RELIES HEAVILY ON SOME FEATURES OF BISON.
5 DON'T TRY TO USE IT WITH YACC, IT WON'T WORK...
8 /* Design of the parser:
10 In general, a GEDCOM file contains records, each consisting of a line
11 (which we'll call a section), hierarchically containing other lines
12 (subsections of the section).
14 This means that in general we have:
16 A 'record' is a 'section' (sect) containing 'subsections' (subs)
17 Each 'subsection' (sub) is again a specific 'section' (sect)
19 In parser notation, this means:
23 sect : <some prefix> subs <some suffix>
25 subs : <empty> | subs sub
27 sub : sect_a | sect_b | ...
29 This pattern is repeated throughout the parser for the different types of
33 Cardinality of the subsections:
34 -------------------------------
35 Note that in the above, the order of the subsections is of no importance.
36 Indeed, this is the case in the GEDCOM grammar. However, this also makes
37 it difficult to check whether there are not too many subsections of a
38 specific type, or whether a mandatory subsection is indeed there.
40 Suppose there is a section A that can contain 0 or 1 B section and
43 This can be expressed in parser notation as follows:
45 A : CC | BCC | CBC | CCB
47 So, cardinality is indeed expressable. However, as the number of subsection
48 types and the limits grow bigger (and even theoretically limitless), listing
49 all possible permutations becomes quickly unfeasible.
51 Much simpler is to say:
54 subs : <empty> | subs sub
57 and then check the cardinality in the semantic actions, which is the
58 solution chosen in the parser below, using the following macros:
61 Make a new context for the <parent> tag to count child tags in
63 - OCCUR2(<child>, <min>, <max>)
64 Express that the <child> tag should occur at least <min> times and
65 at most <max> tags within its parent
67 What this actually does is the following. It increments the counter
68 for that tag and then checks whether the maximum is exceeded. If so,
69 then a parser error is produced. The minimum is not actually checked
70 by this macro, but it makes the statements more declarative.
72 - OCCUR1(<child>, <min>)
73 Express that the <child> tag should occur at least <min> times within
74 its parent (no upper limit)
76 Actually, this only increments the counter for the tag, but it looks
77 very like the previous macro.
79 If the minimum is 0, it is not necessary to express this constraint.
81 - CHECKn(<child1>, ..., <childn>)
82 This closes the context for the parent tag and checks whether the
83 given <child> tags did effectively occur within the parent (i.e.
84 these are the tags that were mandatory).
86 Since the <min> values above are always 0 or 1 in GEDCOM, this is
87 sufficient. All sub-tags that declare a minimum of 1 in the OCCUR
88 macros should be listed in this macro here.
90 The macros CHECK0 to CHECK4 are defined like this (the first one
91 has no arguments and is only used to close the parent context; note
92 that this is necessary for correct functioning).
96 Only sections that have subsections need to use these macros. This can
97 be done like this (the OPEN and CHECK macros are used as mid-rule
98 actions around the subsections):
100 head_sect : OPEN DELIM TAG_HEAD
104 CLOSE { <semantic actions> }
110 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
111 | head_dest_sect { OCCUR2(DEST, 0, 1) }
112 | head_date_sect { OCCUR2(DATE, 0, 1) }
118 - The syntax analysis doesn't handle the contents of the line values
119 or their encoding; this is done in the semantic analysis.
128 int compat_enabled = 1;
129 int gedcom_high_level_debug = 0;
130 int compatibility = 0;
131 MECHANISM error_mechanism=IMMED_FAIL;
132 char string_buf[MAXGEDCLINELEN+1];
133 char *string_buf_ptr;
139 /* These are defined at the bottom of the file */
140 void push_countarray();
141 void set_parenttag(char* tag);
142 char* get_parenttag();
143 void pop_countarray();
144 int count_tag(int tag);
145 int check_occurrence(int tag);
146 void set_compatibility(char* program);
147 int compat_mode(int flags);
149 #define CLEAR_BUFFER(BUF) { memset(BUF, 0, sizeof(BUF)); }
151 #define HANDLE_ERROR \
153 if (error_mechanism == IMMED_FAIL) { \
156 else if (error_mechanism == DEFER_FAIL) { \
159 else if (error_mechanism == IGNORE_ERRORS) { \
163 #define START(PARENTTAG) \
165 set_parenttag(#PARENTTAG); \
169 { if (!check_occurrence(TAG_##TAG)) { \
170 char* parenttag = get_parenttag(); \
171 gedcom_error("The tag '%s' is mandatory within '%s', but missing", \
177 { pop_countarray(); \
181 #define CHECK1(TAG1) { CHK(TAG1); POP; }
182 #define CHECK2(TAG1,TAG2) \
183 { CHK(TAG1); CHK(TAG2); POP; }
184 #define CHECK3(TAG1,TAG2,TAG3) \
185 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
186 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
187 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
188 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
189 #define OCCUR2(CHILDTAG, MIN, MAX) \
190 { int num = count_tag(TAG_##CHILDTAG); \
192 char* parenttag = get_parenttag(); \
193 gedcom_error("The tag '%s' can maximally occur %d " \
194 "time(s) within '%s'", \
195 #CHILDTAG, MAX, parenttag); \
199 #define INVALID_TAG(CHILDTAG) \
200 { char* parenttag = get_parenttag(); \
201 gedcom_error("The tag '%s' is not a valid tag within '%s'", \
202 CHILDTAG, parenttag); \
205 #define INVALID_TOP_TAG(CHILDTAG) \
206 { gedcom_error("The tag '%s' is not a valid top-level tag", \
220 %token <string> BADTOKEN
222 %token <string> CLOSE
223 %token <string> ESCAPE
224 %token <string> DELIM
225 %token <string> ANYCHAR
226 %token <string> POINTER
227 %token <string> USERTAG
228 %token <string> TAG_ABBR
229 %token <string> TAG_ADDR
230 %token <string> TAG_ADR1
231 %token <string> TAG_ADR2
232 %token <string> TAG_ADOP
233 %token <string> TAG_AFN
234 %token <string> TAG_AGE
235 %token <string> TAG_AGNC
236 %token <string> TAG_ALIA
237 %token <string> TAG_ANCE
238 %token <string> TAG_ANCI
239 %token <string> TAG_ANUL
240 %token <string> TAG_ASSO
241 %token <string> TAG_AUTH
242 %token <string> TAG_BAPL
243 %token <string> TAG_BAPM
244 %token <string> TAG_BARM
245 %token <string> TAG_BASM
246 %token <string> TAG_BIRT
247 %token <string> TAG_BLES
248 %token <string> TAG_BLOB
249 %token <string> TAG_BURI
250 %token <string> TAG_CALN
251 %token <string> TAG_CAST
252 %token <string> TAG_CAUS
253 %token <string> TAG_CENS
254 %token <string> TAG_CHAN
255 %token <string> TAG_CHAR
256 %token <string> TAG_CHIL
257 %token <string> TAG_CHR
258 %token <string> TAG_CHRA
259 %token <string> TAG_CITY
260 %token <string> TAG_CONC
261 %token <string> TAG_CONF
262 %token <string> TAG_CONL
263 %token <string> TAG_CONT
264 %token <string> TAG_COPR
265 %token <string> TAG_CORP
266 %token <string> TAG_CREM
267 %token <string> TAG_CTRY
268 %token <string> TAG_DATA
269 %token <string> TAG_DATE
270 %token <string> TAG_DEAT
271 %token <string> TAG_DESC
272 %token <string> TAG_DESI
273 %token <string> TAG_DEST
274 %token <string> TAG_DIV
275 %token <string> TAG_DIVF
276 %token <string> TAG_DSCR
277 %token <string> TAG_EDUC
278 %token <string> TAG_EMIG
279 %token <string> TAG_ENDL
280 %token <string> TAG_ENGA
281 %token <string> TAG_EVEN
282 %token <string> TAG_FAM
283 %token <string> TAG_FAMC
284 %token <string> TAG_FAMF
285 %token <string> TAG_FAMS
286 %token <string> TAG_FCOM
287 %token <string> TAG_FILE
288 %token <string> TAG_FORM
289 %token <string> TAG_GEDC
290 %token <string> TAG_GIVN
291 %token <string> TAG_GRAD
292 %token <string> TAG_HEAD
293 %token <string> TAG_HUSB
294 %token <string> TAG_IDNO
295 %token <string> TAG_IMMI
296 %token <string> TAG_INDI
297 %token <string> TAG_LANG
298 %token <string> TAG_LEGA
299 %token <string> TAG_MARB
300 %token <string> TAG_MARC
301 %token <string> TAG_MARL
302 %token <string> TAG_MARR
303 %token <string> TAG_MARS
304 %token <string> TAG_MEDI
305 %token <string> TAG_NAME
306 %token <string> TAG_NATI
307 %token <string> TAG_NATU
308 %token <string> TAG_NCHI
309 %token <string> TAG_NICK
310 %token <string> TAG_NMR
311 %token <string> TAG_NOTE
312 %token <string> TAG_NPFX
313 %token <string> TAG_NSFX
314 %token <string> TAG_OBJE
315 %token <string> TAG_OCCU
316 %token <string> TAG_ORDI
317 %token <string> TAG_ORDN
318 %token <string> TAG_PAGE
319 %token <string> TAG_PEDI
320 %token <string> TAG_PHON
321 %token <string> TAG_PLAC
322 %token <string> TAG_POST
323 %token <string> TAG_PROB
324 %token <string> TAG_PROP
325 %token <string> TAG_PUBL
326 %token <string> TAG_QUAY
327 %token <string> TAG_REFN
328 %token <string> TAG_RELA
329 %token <string> TAG_RELI
330 %token <string> TAG_REPO
331 %token <string> TAG_RESI
332 %token <string> TAG_RESN
333 %token <string> TAG_RETI
334 %token <string> TAG_RFN
335 %token <string> TAG_RIN
336 %token <string> TAG_ROLE
337 %token <string> TAG_SEX
338 %token <string> TAG_SLGC
339 %token <string> TAG_SLGS
340 %token <string> TAG_SOUR
341 %token <string> TAG_SPFX
342 %token <string> TAG_SSN
343 %token <string> TAG_STAE
344 %token <string> TAG_STAT
345 %token <string> TAG_SUBM
346 %token <string> TAG_SUBN
347 %token <string> TAG_SURN
348 %token <string> TAG_TEMP
349 %token <string> TAG_TEXT
350 %token <string> TAG_TIME
351 %token <string> TAG_TITL
352 %token <string> TAG_TRLR
353 %token <string> TAG_TYPE
354 %token <string> TAG_VERS
355 %token <string> TAG_WIFE
356 %token <string> TAG_WILL
358 %type <string> anystdtag
359 %type <string> anytoptag
360 %type <string> line_item
361 %type <string> mand_line_item
362 %type <string> note_line_item
363 %type <string> anychar
367 file : head_sect records trlr_sect
368 { if (fail == 1) YYABORT; }
371 records : /* empty */
386 /*********************************************************************/
388 /*********************************************************************/
389 head_sect : OPEN DELIM TAG_HEAD
392 { if (compat_mode(C_FTREE))
393 CHECK3(SOUR, GEDC, CHAR)
395 CHECK4(SOUR, SUBM, GEDC, CHAR)
400 head_subs : /* empty */
404 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
405 | head_dest_sect { OCCUR2(DEST, 0, 1) }
406 | head_date_sect { OCCUR2(DATE, 0, 1) }
407 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
408 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
409 | head_file_sect { OCCUR2(FILE, 0, 1) }
410 | head_copr_sect { OCCUR2(COPR, 0, 1) }
411 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
412 | head_char_sect { OCCUR2(CHAR, 1, 1) }
413 | head_lang_sect { OCCUR2(LANG, 0, 1) }
414 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
415 | head_note_sect { OCCUR2(NOTE, 0, 1) }
420 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
421 { set_compatibility($4);
422 gedcom_debug_print("===Source: '%s'\n", $4);
430 head_sour_subs : /* empty */
431 | head_sour_subs head_sour_sub
434 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
435 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
436 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
437 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
441 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
442 { START(VERS)} no_std_subs { CHECK0 } CLOSE
443 { gedcom_debug_print("===Source version: '%s'\n", $4);
446 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
447 { START(NAME) } no_std_subs { CHECK0 } CLOSE
448 { gedcom_debug_print("===Source name: '%s'\n", $4);
451 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
452 { gedcom_debug_print("===Source corp name: '%s'\n", $4);
460 head_sour_corp_subs : /* empty */
461 | head_sour_corp_subs head_sour_corp_sub
464 head_sour_corp_sub : addr_struc_sub /* 0:1 */
468 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
476 head_sour_data_subs : /* empty */
477 | head_sour_data_subs head_sour_data_sub
480 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
481 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
485 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
486 { START(DATE) } no_std_subs { CHECK0 } CLOSE
489 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
490 { START(COPR) } no_std_subs { CHECK0 } CLOSE
495 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
496 { START(DEST) } no_std_subs { CHECK0 } CLOSE
501 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
509 head_date_subs : /* empty */
510 | head_date_subs head_date_sub
513 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
517 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
518 { START(TIME) } no_std_subs { CHECK0 } CLOSE
523 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
524 { START(SUBM) } no_std_subs { CHECK0 } CLOSE
528 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
529 { START(SUBN) } no_std_subs { CHECK0 } CLOSE
533 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
534 { START(FILE) } no_std_subs { CHECK0 } CLOSE
538 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
539 { START(COPR) } no_std_subs { CHECK0 } CLOSE
543 head_gedc_sect : OPEN DELIM TAG_GEDC
546 { CHECK2(VERS, FORM) }
551 head_gedc_subs : /* empty */
552 | head_gedc_subs head_gedc_sub
555 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
556 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
559 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
560 { START(VERS) } no_std_subs { CHECK0 } CLOSE
563 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
564 { START(FORM) } no_std_subs { CHECK0 } CLOSE
569 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
577 head_char_subs : /* empty */
578 | head_char_subs head_char_sub
581 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
584 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
585 { START(VERS) } no_std_subs { CHECK0 } CLOSE
590 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
591 { START(LANG) } no_std_subs { CHECK0 } CLOSE
595 head_plac_sect : OPEN DELIM TAG_PLAC
603 head_plac_subs : /* empty */
604 | head_plac_subs head_plac_sub
607 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
610 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
611 { START(FORM) } no_std_subs { CHECK0 } CLOSE
616 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
624 head_note_subs : /* empty */
625 | head_note_subs head_note_sub
628 head_note_sub : continuation_sub /* 0:M */
632 /*********************************************************************/
634 /*********************************************************************/
635 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
638 /*********************************************************************/
639 /**** Family record ****/
640 /*********************************************************************/
641 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
648 fam_subs : /* empty */
652 fam_sub : fam_event_struc_sub /* 0:M */
653 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
654 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
655 | fam_chil_sect /* 0:M */
656 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
657 | fam_subm_sect /* 0:M */
658 | lds_spouse_seal_sub /* 0:M */
659 | source_cit_sub /* 0:M */
660 | multim_link_sub /* 0:M */
661 | note_struc_sub /* 0:M */
662 | ident_struc_sub /* 0:1 */
663 | change_date_sub /* 0:1 */
668 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
669 { START(HUSB) } no_std_subs { CHECK0 } CLOSE
674 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
675 { START(WIFE) } no_std_subs { CHECK0 } CLOSE
680 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
681 { START(CHIL) } no_std_subs { CHECK0 } CLOSE
686 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
687 { START(NCHI) } no_std_subs { CHECK0 } CLOSE
692 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
693 { START(SUBM) } no_std_subs { CHECK0 } CLOSE
697 /*********************************************************************/
698 /**** Individual record ****/
699 /*********************************************************************/
700 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
707 indi_subs : /* empty */
711 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
712 | pers_name_struc_sub /* 0:M */
713 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
714 | indiv_even_struc_sub /* 0:M */
715 | indiv_attr_struc_sub /* 0:M */
716 | lds_indiv_ord_sub /* 0:M */
717 | chi_fam_link_sub /* 0:M */
718 | spou_fam_link_sub /* 0:M */
719 | indi_subm_sect /* 0:M */
720 | assoc_struc_sub /* 0:M */
721 | indi_alia_sect /* 0:M */
722 | indi_anci_sect /* 0:M */
723 | indi_desi_sect /* 0:M */
724 | source_cit_sub /* 0:M */
725 | multim_link_sub /* 0:M */
726 | note_struc_sub /* 0:M */
727 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
728 | indi_afn_sect /* 0:M */
729 | ident_struc_sub /* 0:1 */
730 | change_date_sub /* 0:1 */
731 | ftree_addr_sect { if (!compat_mode(C_FTREE))
738 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
739 { START(RESN) } no_std_subs { CHECK0 } CLOSE { }
743 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
744 { START(SEX) } no_std_subs { CHECK0 } CLOSE { }
748 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
749 { START(SUBM) } no_std_subs { CHECK0 } CLOSE { }
753 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
754 { START(ALIA) } no_std_subs { CHECK0 } CLOSE { }
758 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
759 { START(ANCI) } no_std_subs { CHECK0 } CLOSE { }
763 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
764 { START(DESI) } no_std_subs { CHECK0 } CLOSE { }
768 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
769 { START(RFN) } no_std_subs { CHECK0 } CLOSE { }
773 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
774 { START(AFN) } no_std_subs { CHECK0 } CLOSE { }
777 /* INDI.ADDR (Only for 'ftree' compatibility) */
778 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
779 { START(ADDR) } no_std_subs { CHECK0 } CLOSE { }
781 /*********************************************************************/
782 /**** Multimedia record ****/
783 /*********************************************************************/
784 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
787 { CHECK2(FORM, BLOB) }
791 obje_subs : /* empty */
795 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
796 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
797 | note_struc_sub /* 0:M */
798 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
799 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
800 | ident_struc_sub /* 0:1 */
801 | change_date_sub /* 0:1 */
806 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
807 { START(FORM) } no_std_subs { CHECK0 } CLOSE { }
811 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
812 { START(TITL) } no_std_subs { CHECK0 } CLOSE { }
816 obje_blob_sect : OPEN DELIM TAG_BLOB
823 obje_blob_subs : /* empty */
824 | obje_blob_subs obje_blob_sub
827 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
831 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
832 { START(CONT) } no_std_subs { CHECK0 } CLOSE { }
836 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
837 { START(OBJE) } no_std_subs { CHECK0 } CLOSE { }
840 /*********************************************************************/
841 /**** Note record ****/
842 /*********************************************************************/
843 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
850 note_line_item : /* empty */
851 { if (!compat_mode(C_FTREE)) {
852 gedcom_error("Missing value"); YYERROR;
856 { gedcom_debug_print("==Val: %s==\n", $2);
860 note_subs : /* empty */
864 note_sub : continuation_sub /* 0:M */
865 | source_cit_sub /* 0:M */
866 | ident_struc_sub /* 0:1 */
867 | change_date_sub /* 0:1 */
871 /*********************************************************************/
872 /**** Repository record ****/
873 /*********************************************************************/
874 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
881 repo_subs : /* empty */
885 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
886 | addr_struc_sub /* 0:1 */
887 | note_struc_sub /* 0:M */
888 | ident_struc_sub /* 0:1 */
889 | change_date_sub /* 0:1 */
894 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
895 { START(NAME) } no_std_subs { CHECK0 } CLOSE {}
898 /*********************************************************************/
899 /**** Source record ****/
900 /*********************************************************************/
901 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
908 sour_subs : /* empty */
912 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
913 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
914 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
915 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
916 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
917 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
918 | source_repos_cit_sub /* 0:1 */
919 | multim_link_sub /* 0:M */
920 | note_struc_sub /* 0:M */
921 | ident_struc_sub /* 0:1 */
922 | change_date_sub /* 0:1 */
927 sour_data_sect : OPEN DELIM TAG_DATA
934 sour_data_subs : /* empty */
935 | sour_data_subs sour_data_sub
938 sour_data_sub : sour_data_even_sect /* 0:M */
939 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
940 | note_struc_sub /* 0:M */
944 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
951 sour_data_even_subs : /* empty */
952 | sour_data_even_subs sour_data_even_sub
955 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
956 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
960 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
961 { START(DATE) } no_std_subs { CHECK0 } CLOSE { }
964 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
965 { START(PLAC) } no_std_subs { CHECK0 } CLOSE { }
968 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
969 { START(AGNC) } no_std_subs { CHECK0 } CLOSE { }
973 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
980 sour_auth_subs : /* empty */
981 | sour_auth_subs sour_auth_sub
984 sour_auth_sub : continuation_sub /* 0:M */
989 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
996 sour_titl_subs : /* empty */
997 | sour_titl_subs sour_titl_sub
1000 sour_titl_sub : continuation_sub /* 0:M */
1005 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1006 { START(ABBR) } no_std_subs { CHECK0 } CLOSE { }
1010 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1017 sour_publ_subs : /* empty */
1018 | sour_publ_subs sour_publ_sub
1021 sour_publ_sub : continuation_sub /* 0:M */
1026 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1033 sour_text_subs : /* empty */
1034 | sour_text_subs sour_text_sub
1037 sour_text_sub : continuation_sub /* 0:M */
1041 /*********************************************************************/
1042 /**** Submission record ****/
1043 /*********************************************************************/
1044 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1051 subn_subs : /* empty */
1052 | subn_subs subn_sub
1055 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1056 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1057 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1058 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1059 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1060 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1061 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1066 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1067 { START(SUBM) } no_std_subs { CHECK0 } CLOSE { }
1071 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1072 { START(FAMF) } no_std_subs { CHECK0 } CLOSE { }
1076 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1077 { START(TEMP) } no_std_subs { CHECK0 } CLOSE { }
1081 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1082 { START(ANCE) } no_std_subs { CHECK0 } CLOSE { }
1086 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1087 { START(DESC) } no_std_subs { CHECK0 } CLOSE { }
1091 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1092 { START(ORDI) } no_std_subs { CHECK0 } CLOSE { }
1096 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1097 { START(RIN) } no_std_subs { CHECK0 } CLOSE { }
1100 /*********************************************************************/
1101 /**** Submitter record ****/
1102 /*********************************************************************/
1103 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1110 subm_subs : /* empty */
1111 | subm_subs subm_sub
1114 subm_sub : subm_name_sect { OCCUR2(NAME, 0, 1) }
1115 | addr_struc_sub /* 0:1 */
1116 | multim_link_sub /* 0:M */
1117 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1118 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1119 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1120 | change_date_sub /* 0:1 */
1125 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1126 { START(NAME) } no_std_subs { CHECK0 } CLOSE { }
1130 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1131 { START(LANG) } no_std_subs { CHECK0 } CLOSE { }
1135 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1136 { START(RFN) } no_std_subs { CHECK0 } CLOSE { }
1140 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1141 { START(RIN) } no_std_subs { CHECK0 } CLOSE { }
1144 /*********************************************************************/
1145 /**** Substructures ****/
1146 /*********************************************************************/
1148 /* ADDRESS STRUCTURE */
1149 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1150 | phon_sect { OCCUR2(PHON, 0, 3) }
1153 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1160 addr_subs : /* empty */
1161 | addr_subs addr_sub
1164 addr_sub : addr_cont_sect /* 0:M */
1165 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1166 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1167 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1168 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1169 | addr_post_sect { OCCUR2(POST, 0, 1) }
1170 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1174 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1175 { START(CONT) } no_std_subs { CHECK0 } CLOSE { }
1177 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1178 { START(ADR1) } no_std_subs { CHECK0 } CLOSE { }
1180 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1181 { START(ADR2) } no_std_subs { CHECK0 } CLOSE { }
1183 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1184 { START(CITY) } no_std_subs { CHECK0 } CLOSE { }
1186 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1187 { START(STAE) } no_std_subs { CHECK0 } CLOSE { }
1189 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1190 { START(POST) } no_std_subs { CHECK0 } CLOSE { }
1192 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1193 { START(CTRY) } no_std_subs { CHECK0 } CLOSE { }
1196 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1197 { START(PHON) } no_std_subs { CHECK0 } CLOSE { }
1200 /* ASSOCIATION STRUCTURE */
1201 assoc_struc_sub : asso_sect /* 0:M */
1204 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
1207 { CHECK2(TYPE,RELA) }
1211 asso_subs : /* empty */
1212 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
1213 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
1219 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
1220 { START(TYPE) } no_std_subs { CHECK0 } CLOSE { }
1223 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
1224 { START(RELA) } no_std_subs { CHECK0 } CLOSE { }
1228 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
1231 change_date_chan_sect : OPEN DELIM TAG_CHAN
1233 change_date_chan_subs
1238 change_date_chan_subs : /* empty */
1239 | change_date_chan_subs change_date_chan_sub
1242 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
1247 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
1249 change_date_date_subs
1254 change_date_date_subs : /* empty */
1255 | change_date_date_subs change_date_date_sub
1258 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
1262 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
1263 { START(TIME) } no_std_subs { CHECK0 } CLOSE { }
1266 /* CHILD TO FAMILY LINK */
1267 chi_fam_link_sub : famc_sect /* 0:M */
1270 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
1277 famc_subs : /* empty */
1278 | famc_subs famc_sub
1281 famc_sub : famc_pedi_sect /* 0:M */
1286 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
1287 { START(PEDI) } no_std_subs { CHECK0 } CLOSE { }
1290 /* CONTINUATION SUBSECTIONS */
1291 continuation_sub : cont_sect /* 0:M */
1292 | conc_sect /* 0:M */
1295 cont_sect : OPEN DELIM TAG_CONT mand_line_item
1296 { START(CONT) } no_std_subs { CHECK0 } CLOSE { }
1299 conc_sect : OPEN DELIM TAG_CONC mand_line_item
1300 { START(CONC) } no_std_subs { CHECK0 } CLOSE { }
1304 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
1305 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
1308 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
1309 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
1310 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
1316 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
1317 { START(TYPE) } no_std_subs { CHECK0 } CLOSE { }
1319 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
1320 { START(DATE) } no_std_subs { CHECK0 } CLOSE { }
1322 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
1323 { START(AGE) } no_std_subs { CHECK0 } CLOSE { }
1325 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1326 { START(AGNC) } no_std_subs { CHECK0 } CLOSE { }
1328 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
1329 { START(CAUS) } no_std_subs { CHECK0 } CLOSE { }
1332 /* FAMILY EVENT STRUCTURE */
1333 fam_event_struc_sub : fam_event_sect
1334 | fam_gen_even_sect /* 0:M */
1337 fam_event_sect : OPEN DELIM fam_event_tag opt_value fam_event_subs
1342 fam_event_tag : TAG_ANUL { START(ANUL) }
1343 | TAG_CENS { START(CENS) }
1344 | TAG_DIV { START(DIV) }
1345 | TAG_DIVF { START(DIVF) }
1346 | TAG_ENGA { START(ENGA) }
1347 | TAG_MARR { START(MARR) }
1348 | TAG_MARB { START(MARB) }
1349 | TAG_MARC { START(MARC) }
1350 | TAG_MARL { START(MARL) }
1351 | TAG_MARS { START(MARS) }
1354 fam_event_subs : /* empty */
1355 | fam_event_subs fam_event_sub
1358 fam_event_sub : event_detail_sub
1359 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
1360 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
1364 fam_even_husb_sect : OPEN DELIM TAG_HUSB
1371 fam_even_husb_subs : /* empty */
1372 | fam_even_husb_subs fam_even_husb_sub
1375 fam_even_husb_sub : fam_even_husb_age_sect { OCCUR2(AGE, 1, 1) }
1379 fam_even_husb_age_sect : OPEN DELIM TAG_AGE mand_line_item
1380 { START(AGE) } no_std_subs { CHECK0 } CLOSE { }
1383 fam_even_wife_sect : OPEN DELIM TAG_WIFE
1390 fam_gen_even_sect : OPEN DELIM TAG_EVEN
1397 fam_gen_even_subs : /* empty */
1398 | fam_gen_even_subs fam_gen_even_sub
1401 fam_gen_even_sub : event_detail_sub
1402 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
1403 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
1407 /* IDENTIFICATION STRUCTURE */
1408 ident_struc_sub : ident_refn_sect /* 0:M */
1409 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
1412 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
1419 ident_refn_subs : /* empty */
1420 | ident_refn_subs ident_refn_sub
1423 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
1427 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
1428 { START(TYPE) } no_std_subs { CHECK0 } CLOSE { }
1431 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1432 { START(RIN) } no_std_subs { CHECK0 } CLOSE { }
1435 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
1436 indiv_attr_struc_sub : indiv_cast_sect /* 0:M */
1437 | indiv_dscr_sect /* 0:M */
1438 | indiv_educ_sect /* 0:M */
1439 | indiv_idno_sect /* 0:M */
1440 | indiv_nati_sect /* 0:M */
1441 | indiv_nchi_sect /* 0:M */
1442 | indiv_nmr_sect /* 0:M */
1443 | indiv_occu_sect /* 0:M */
1444 | indiv_prop_sect /* 0:M */
1445 | indiv_reli_sect /* 0:M */
1446 | indiv_resi_sect /* 0:M */
1447 | indiv_ssn_sect /* 0:M */
1448 | indiv_titl_sect /* 0:M */
1451 indiv_cast_sect : OPEN DELIM TAG_CAST mand_line_item
1453 indiv_attr_event_subs
1457 indiv_dscr_sect : OPEN DELIM TAG_DSCR mand_line_item
1459 indiv_attr_event_subs
1463 indiv_educ_sect : OPEN DELIM TAG_EDUC mand_line_item
1465 indiv_attr_event_subs
1469 indiv_idno_sect : OPEN DELIM TAG_IDNO mand_line_item
1471 indiv_attr_event_subs
1475 indiv_nati_sect : OPEN DELIM TAG_NATI mand_line_item
1477 indiv_attr_event_subs
1481 indiv_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1483 indiv_attr_event_subs
1487 indiv_nmr_sect : OPEN DELIM TAG_NMR mand_line_item
1489 indiv_attr_event_subs
1493 indiv_occu_sect : OPEN DELIM TAG_OCCU mand_line_item
1495 indiv_attr_event_subs
1499 indiv_prop_sect : OPEN DELIM TAG_PROP mand_line_item
1501 indiv_attr_event_subs
1505 indiv_reli_sect : OPEN DELIM TAG_RELI mand_line_item
1507 indiv_attr_event_subs
1511 indiv_resi_sect : OPEN DELIM TAG_RESI
1513 indiv_attr_event_subs
1517 indiv_ssn_sect : OPEN DELIM TAG_SSN mand_line_item
1519 indiv_attr_event_subs
1523 indiv_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1525 indiv_attr_event_subs
1530 indiv_attr_event_subs : /* empty */
1531 | indiv_attr_event_subs indiv_attr_event_sub
1534 indiv_attr_event_sub : event_detail_sub
1538 /* INDIVIDUAL EVENT STRUCTURE */
1539 indiv_even_struc_sub : indiv_birt_sect
1541 | indiv_adop_sect /* 0:M */
1542 | indiv_even_sect /* 0:M */
1545 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value indiv_birt_subs
1550 indiv_birt_tag : TAG_BIRT { START(BIRT) }
1551 | TAG_CHR { START(CHR) }
1554 indiv_birt_subs : /* empty */
1555 | indiv_birt_subs indiv_birt_sub
1558 indiv_birt_sub : event_detail_sub
1559 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
1563 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
1564 { START(FAMC) } no_std_subs { CHECK0 } CLOSE { }
1567 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value indiv_gen_subs
1572 indiv_gen_tag : TAG_DEAT { START(DEAT) }
1573 | TAG_BURI { START(BURI) }
1574 | TAG_CREM { START(CREM) }
1575 | TAG_BAPM { START(BAPM) }
1576 | TAG_BARM { START(BARM) }
1577 | TAG_BASM { START(BASM) }
1578 | TAG_BLES { START(BLES) }
1579 | TAG_CHRA { START(CHRA) }
1580 | TAG_CONF { START(CONF) }
1581 | TAG_FCOM { START(FCOM) }
1582 | TAG_ORDN { START(ORDN) }
1583 | TAG_NATU { START(NATU) }
1584 | TAG_EMIG { START(EMIG) }
1585 | TAG_IMMI { START(IMMI) }
1586 | TAG_CENS { START(CENS) }
1587 | TAG_PROB { START(PROB) }
1588 | TAG_WILL { START(WILL) }
1589 | TAG_GRAD { START(GRAD) }
1590 | TAG_RETI { START(RETI) }
1593 indiv_gen_subs : /* empty */
1594 | indiv_gen_subs indiv_gen_sub
1597 indiv_gen_sub : event_detail_sub
1601 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
1608 indiv_adop_subs : /* empty */
1609 | indiv_adop_subs indiv_adop_sub
1612 indiv_adop_sub : event_detail_sub
1613 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
1617 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
1619 indiv_adop_famc_subs
1624 indiv_adop_famc_subs : /* empty */
1625 | indiv_adop_famc_subs indiv_adop_famc_sub
1628 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
1632 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
1633 { START(ADOP) } no_std_subs { CHECK0 } CLOSE { }
1636 indiv_even_sect : OPEN DELIM TAG_EVEN
1643 /* LDS INDIVIDUAL ORDINANCE */
1644 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
1645 | lio_slgc_sect /* 0:M */
1648 lio_bapl_sect : OPEN DELIM lio_bapl_tag lio_bapl_subs
1653 lio_bapl_tag : TAG_BAPL { START(BAPL) }
1654 | TAG_CONL { START(CONL) }
1655 | TAG_ENDL { START(ENDL) }
1658 lio_bapl_subs : /* empty */
1659 | lio_bapl_subs lio_bapl_sub
1662 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
1663 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
1664 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
1665 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
1671 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
1672 { START(STAT) } no_std_subs { CHECK0 } CLOSE { }
1674 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
1675 { START(DATE) } no_std_subs { CHECK0 } CLOSE { }
1677 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1678 { START(TEMP) } no_std_subs { CHECK0 } CLOSE { }
1680 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1681 { START(PLAC) } no_std_subs { CHECK0 } CLOSE { }
1684 lio_slgc_sect : OPEN DELIM TAG_SLGC
1691 lio_slgc_subs : /* empty */
1692 | lio_slgc_subs lio_slgc_sub
1695 lio_slgc_sub : lio_bapl_sub
1696 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
1699 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
1700 { START(FAMC) } no_std_subs { CHECK0 } CLOSE { }
1703 /* LDS SPOUSE SEALING */
1704 lds_spouse_seal_sub : lss_slgs_sect
1707 lss_slgs_sect : OPEN DELIM TAG_SLGS
1714 lss_slgs_subs : /* empty */
1715 | lss_slgs_subs lss_slgs_sub
1718 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
1719 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
1720 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
1721 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
1727 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
1728 { START(STAT) } no_std_subs { CHECK0 } CLOSE { }
1730 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
1731 { START(DATE) } no_std_subs { CHECK0 } CLOSE { }
1733 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1734 { START(TEMP) } no_std_subs { CHECK0 } CLOSE { }
1736 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1737 { START(PLAC) } no_std_subs { CHECK0 } CLOSE { }
1740 /* MULTIMEDIA LINK */
1741 multim_link_sub : multim_obje_link_sect
1742 | multim_obje_emb_sect
1745 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
1746 { START(OBJE) } no_std_subs { CHECK0 } CLOSE { }
1749 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
1751 multim_obje_emb_subs
1752 { CHECK2(FORM,FILE) }
1756 multim_obje_emb_subs : /* empty */
1757 | multim_obje_emb_subs multim_obje_emb_sub
1760 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
1761 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
1762 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
1767 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1768 { START(FORM) } no_std_subs { CHECK0 } CLOSE { }
1770 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1771 { START(TITL) } no_std_subs { CHECK0 } CLOSE { }
1773 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
1774 { START(FILE) } no_std_subs { CHECK0 } CLOSE { }
1777 /* NOTE STRUCTURE */
1778 note_struc_sub : note_struc_link_sect /* 0:M */
1779 | note_struc_emb_sect /* 0:M */
1782 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
1784 note_struc_link_subs
1789 note_struc_link_subs : /* empty */
1790 | note_struc_link_subs note_struc_link_sub
1793 note_struc_link_sub : source_cit_sub
1797 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
1804 note_struc_emb_subs : /* empty */
1805 | note_struc_emb_subs note_struc_emb_sub
1808 note_struc_emb_sub : continuation_sub
1813 /* PERSONAL NAME STRUCTURE */
1814 pers_name_struc_sub : pers_name_sect /* 0:M */
1817 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
1824 pers_name_subs : /* empty */
1825 | pers_name_subs pers_name_sub
1828 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
1829 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
1830 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
1831 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
1832 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
1833 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
1839 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
1840 { START(NPFX) } no_std_subs { CHECK0 } CLOSE { }
1842 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
1843 { START(GIVN) } no_std_subs { CHECK0 } CLOSE { }
1845 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
1846 { START(NICK) } no_std_subs { CHECK0 } CLOSE { }
1848 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
1849 { START(SPFX) } no_std_subs { CHECK0 } CLOSE { }
1851 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
1852 { START(SURN) } no_std_subs { CHECK0 } CLOSE { }
1854 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
1855 { START(NSFX) } no_std_subs { CHECK0 } CLOSE { }
1858 /* PLACE STRUCTURE */
1859 place_struc_sub : place_struc_plac_sect /* 0:M */
1862 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1864 place_struc_plac_subs
1869 place_struc_plac_subs : /* empty */
1870 | place_struc_plac_subs place_struc_plac_sub
1873 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
1879 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
1880 { START(FORM) } no_std_subs { CHECK0 } CLOSE { }
1883 /* SOURCE_CITATION */
1884 source_cit_sub : source_cit_link_sect /* 0:M */
1885 | source_cit_emb_sect /* 0:M */
1888 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
1890 source_cit_link_subs
1895 source_cit_link_subs : /* empty */
1896 | source_cit_link_subs source_cit_link_sub
1899 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
1900 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
1901 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
1902 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
1908 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
1909 { START(PAGE) } no_std_subs { CHECK0 } CLOSE { }
1912 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1914 source_cit_even_subs
1919 source_cit_even_subs : /* empty */
1920 | source_cit_even_subs source_cit_even_sub
1923 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
1927 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
1928 { START(ROLE) } no_std_subs { CHECK0 } CLOSE { }
1931 source_cit_data_sect : OPEN DELIM TAG_DATA
1933 source_cit_data_subs
1938 source_cit_data_subs : /* empty */
1939 | source_cit_data_subs source_cit_data_sub
1942 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
1943 | source_cit_text_sect /* 0:M */
1947 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
1948 { START(DATE) } no_std_subs { CHECK0 } CLOSE { }
1951 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1953 source_cit_text_subs
1958 source_cit_text_subs : /* empty */
1959 | source_cit_text_subs source_cit_text_sub
1962 source_cit_text_sub : continuation_sub
1966 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
1967 { START(QUAY) } no_std_subs { CHECK0 } CLOSE { }
1970 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
1977 source_cit_emb_subs : /* empty */
1978 | source_cit_emb_subs source_cit_emb_sub
1981 source_cit_emb_sub : continuation_sub
1982 | source_cit_text_sect /* 0:M */
1987 /* SOURCE REPOSITORY CITATION */
1988 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
1991 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
1993 source_repos_repo_subs
1998 source_repos_repo_subs : /* empty */
1999 | source_repos_repo_subs source_repos_repo_sub
2002 source_repos_repo_sub : note_struc_sub
2003 | caln_sect /* 0:M */
2007 caln_sect : OPEN DELIM TAG_CALN mand_line_item
2014 caln_subs : /* empty */
2015 | caln_subs caln_sub
2018 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
2022 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
2023 { START(MEDI) } no_std_subs { CHECK0 } CLOSE { }
2026 /* SPOUSE TO FAMILY LINK */
2027 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
2030 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
2037 spou_fam_fams_subs : /* empty */
2038 | spou_fam_fams_subs spou_fam_fams_sub
2041 spou_fam_fams_sub : note_struc_sub
2045 /*********************************************************************/
2047 /*********************************************************************/
2049 no_std_subs : /* empty */
2050 | no_std_subs no_std_sub
2053 no_std_sub : user_sect /* 0:M */
2055 | error error_subs CLOSE { HANDLE_ERROR }
2058 no_std_rec : user_rec /* 0:M */
2060 | error error_subs CLOSE { HANDLE_ERROR }
2063 user_rec : OPEN DELIM opt_xref USERTAG
2064 { if ($4[0] != '_') {
2065 gedcom_error("Undefined tag (and not a valid user tag): %s",
2070 opt_value user_sects CLOSE { }
2073 user_sect : OPEN DELIM opt_xref USERTAG
2074 { if ($4[0] != '_') {
2075 gedcom_error("Undefined tag (and not a valid user tag): %s",
2080 opt_value user_sects CLOSE { }
2083 user_sects : /* empty */ { }
2084 | user_sects user_sect { }
2087 opt_xref : /* empty */ { }
2091 opt_value : /* empty */ { }
2092 | DELIM line_value { }
2095 line_value : POINTER { }
2099 mand_pointer : /* empty */ { gedcom_error("Missing pointer"); YYERROR; }
2103 mand_line_item : /* empty */ { gedcom_error("Missing value"); YYERROR; }
2104 | DELIM line_item { gedcom_debug_print("==Val: %s==\n", $2);
2108 opt_line_item : /* empty */ { }
2109 | DELIM line_item { }
2112 line_item : anychar { CLEAR_BUFFER(string_buf);
2113 string_buf_ptr = string_buf;
2114 /* The following also takes care of '@@' */
2115 *string_buf_ptr++ = $1[0];
2118 | ESCAPE { CLEAR_BUFFER(string_buf);
2119 string_buf_ptr = string_buf;
2120 /* For now, ignore escapes */
2124 { if (strlen(string_buf) >= MAXGEDCLINELEN) {
2125 gedcom_error("Line too long");
2129 /* The following also takes care of '@@' */
2130 *string_buf_ptr++ = $2[0];
2135 { /* For now, ignore escapes */
2140 anychar : ANYCHAR { }
2144 error_subs : /* empty */
2145 | error_subs error_sect
2148 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
2150 gen_sect : OPEN DELIM opt_xref anystdtag
2151 { INVALID_TAG($4); }
2152 opt_value opt_sects CLOSE
2156 gen_rec : gen_rec_top
2160 gen_rec_norm : OPEN DELIM opt_xref anystdtag
2161 { INVALID_TOP_TAG($4) }
2162 opt_value opt_sects CLOSE
2166 gen_rec_top : OPEN DELIM anytoptag
2167 { gedcom_error("Missing cross-reference"); YYERROR; }
2168 opt_value opt_sects CLOSE
2172 opt_sects : /* empty */ { }
2173 | opt_sects gen_sect { }
2176 anytag : USERTAG { }
2190 anystdtag : TAG_ABBR
2320 /* Functions that handle the counting of subtags */
2322 int* count_arrays[MAXGEDCLEVEL+1];
2323 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLENGTH+1];
2325 void push_countarray()
2328 if (count_level > MAXGEDCLEVEL) {
2329 gedcom_error("Internal error: count array overflow");
2333 count = (int *)calloc(YYNTOKENS, sizeof(int));
2334 if (count == NULL) {
2335 gedcom_error("Internal error: count array calloc error");
2339 count_arrays[count_level] = count;
2344 void set_parenttag(char* tag)
2346 strncpy(tag_stack[count_level], tag, MAXSTDTAGLENGTH+1);
2349 char* get_parenttag()
2351 return tag_stack[count_level];
2354 int count_tag(int tag)
2356 int *count = count_arrays[count_level];
2357 return ++count[tag - GEDCOMTAGOFFSET];
2360 int check_occurrence(int tag)
2362 int *count = count_arrays[count_level];
2363 return (count[tag - GEDCOMTAGOFFSET] > 0);
2366 void pop_countarray()
2369 if (count_level < 0) {
2370 gedcom_error("Internal error: count array underflow");
2374 count = count_arrays[count_level];
2376 count_arrays[count_level] = NULL;
2380 /* Enabling debug mode */
2381 /* level 0: no debugging */
2382 /* level 1: only internal */
2383 /* level 2: also bison */
2384 void gedcom_set_debug_level(int level)
2387 gedcom_high_level_debug = 1;
2396 int gedcom_debug_print(char* s, ...)
2399 if (gedcom_high_level_debug) {
2402 res = vfprintf(stderr, s, ap);
2408 /* Setting the error mechanism */
2409 void gedcom_set_error_handling(MECHANISM mechanism)
2411 error_mechanism = mechanism;
2414 /* Compatibility handling */
2416 void gedcom_set_compat_handling(int enable_compat)
2418 compat_enabled = enable_compat;
2421 void set_compatibility(char* program)
2423 if (compat_enabled) {
2424 gedcom_debug_print("==== Program: %s\n", program);
2425 if (! strncmp(program, "ftree", 6)) {
2426 gedcom_warning("Enabling compatibility with 'ftree'");
2427 compatibility = C_FTREE;
2435 int compat_mode(int compat_flags)
2437 return (compat_flags & compatibility);