Re: The new GEDCOM parser
[email protected] (Ron Savage) Tue, 06 Nov 2012 08:36:01 +1100
| Newsgroups | perl.gedcom |
|---|---|
| Message-ID | <[email protected]> |
Hi Steve On 06/11/12 00:54, Stephen Woodbridge wrote: > Hi Ron, > > This all sounds great. I have a question on your choice of using a tree > structure, can you explain that more? Are you thinking of the file being > the root, then having leaves like: indi, fams, famc, etc and then each > of these have their respective data hanging off those objects? Or are > you thinking the tree would represent the family relationships? I don't > see how the later will work. I got the idea from the nested structure in the GEDCOM doc itself. Any nesting in the doc could be represented by children of a node in a tree. But frankly, I have not thought it through. I really mentioned it to help clarify my thoughts, and I strongly suspect actual coding will modify my plan. But in a bit more detail: An individual can be seen as a node in a tree, in which case: o They have a list of (2) grandparents (IVF aside!) o They have a list of (N) spouses o They have a list of (N) children o (As a child) They have a list of (N) care-givers o (As a patient) They have a list of (N) donors or organs or whatever And fundamentally, in a tree, every node has N links (normally 1 up, N sideways and N down), and those links have metadata which would be used to represent the type of link. The most obvious problem with a tree is the cross-links due to divorce/re-marriage/adoption/... Still, whatever the data structure chosen, /something/ has to be chosen just to hold the data in memory. > -Steve > > On 11/5/2012 2:04 AM, Ron Savage wrote: >> Hi >> >> The new GEDCOM parser >> This document is a collection of ideas which have been percolating >> in my mind for a long time. >> >> Comments welcome. >> >> Ideas >> Module name >> Genealogy::Gedcom::Parser. >> >> A place-holder, Genealogy::Gedcom >> <http://metacpan.org/release/Genealogy-Gedcom>, is already on CPAN. >> >> Note: This module was written before the new, major tools now >> available were released. See Tools below. >> >> ETA >> There is no ETA for the parser. >> >> However, certain Perl-based tools are now available which will make >> coding a simple task. See Tools below. >> >> See also 'Famous Last Words' :-). >> >> UTF-8 >> The code will accept input files in utf-8, and generate files >> containing utf-8 characters. >> >> Apache and mod_perl >> These will not be required. I only mention these because references >> to them appear in the Gedcom.pm distro. >> >> Logging >> The code will have a built-in logger, so debugging, e.g., can be >> turned on with a parameter to new(). >> >> This logger will use Log::Handler. See Tools below. >> >> Sub-classing >> Sub-classing the main module will be trivial, and samples will be >> provided. >> >> Sub-classing will be done with Hash::FieldHash. See Tools and the >> FAQ below. >> >> Grammars and grammar generators >> Like Gedcom.pm, the code will read a GEDCOM grammar in BNF from a >> file. >> I'll run this phase before shipping the module, so you don't have to. >> See Tools below, specifically Marpa::Rules::Simple. >> >> Bascially, this means the startling complexity of the code in >> Gedcom.pm is a thing of the past. >> >> Operating the parser >> Using Marpa, callbacks are triggered when input is recognized. >> >> So, when lines like these are encountered: >> >> 1 @<XREF:FAM>@ FAM >> 2 RIN <AUTOMATED_RECORD_ID> >> >> Marpa will automatically call the callback attached to each tag. >> >> Callbacks will probably have names like 'do_fam' and 'do_rin', i.e. >> of the format 'do_$tag'. >> >> The parameters passed to the callback include the non-tag text on >> the line. >> >> Default callbacks for all tags will be provided, each one doing its >> part in parsing the parameters to the tag, and storing the result. >> >> The result will probably be stored in a tree. See Tools below, >> specifically Tree::DAG_Node. >> >> Database support >> A DBD::SQLite database is possible. >> >> Tools >> o Hash::FieldHash >> Simplifies class-building. >> >> As for the obvious question, why not use Moose, see the FAQ below. >> >> o Log::Handling >> Simplifies logging. >> >> o Marpa::R2 >> This is the modern way to do parsing. >> >> Home page <http://jeffreykegler.github.com/Marpa-web-site/>. >> >> Jeffrey's blog about Marpa >> <http://jeffreykegler.github.com/Ocean-of-Awareness-blog/>. >> >> My recent article about lexing and parsing with Marpa >> >> <http://www.perl.com/pub/2012/10/an-overview-of-lexing-and-parsing.html>. >> >> o MarpaX::Simple::Rules >> This module reads a grammar in BNF and generates a Marpa grammar. >> >> Hence it will read a BNF version of the GEDCOM spec and output >> the matching Marpa grammar. >> >> o Tree::DAG_Node >> The most sophisticated tree-handling code on CPAN. I've recently >> become co-maintainer of this module. >> >> FAQ >> Why did you choose Hash::FieldHash over Moose? >> My policy is to use the light-weight Hash::FieldHash for stand-alone >> modules and Moose for applications. >> >> Why did you choose to store the data in a tree? >> A GEDCOM file's structure can be viewed as a tree, so my initial >> plan is to store the data likewise. >> >> > > > -- Ron Savage http://savage.net.au/ Ph: 0421 920 622