logoalt Hacker News

Parsing EDIFACT in Python with syntax trees

22 points • by alexprengere • last Thursday at 2:07 PM • 13 comments • view on HN

Comments

vc5 • today at 9:17 PM

This takes me back 20+ years to when I had to create/parse EDI messages for various retailers when I worked at an independent record distributor.

I wrote a C library to parse the messages with callbacks in the style of Expat. There's binding for Perl to make it a bit easier to use. EDIFACT, X12 and Tradacoms are supported.

Anyways, unlikely anyone might need it these days, but there are some Perl scripts which can interpret the EDIFACT "directories" (basically message schemas), so you don't have to build your own message syntax definitions. It should be possible to convert the XML output that it generates into the Python needed to define message syntax, element definitions, etc.

Best of luck with it - there's a whole world of crazy industry standards to explore.

Oh, and consulting is a possibility if anyone needs it ;-)

-- https://github.com/davidcoles/medici

CharlesW • today at 6:18 PM

In case other HNers have also not heard of this: https://en.wikipedia.org/wiki/EDIFACT

➕ show 1 reply
alexprengere • last Thursday at 2:07 PM

Edison is a Python library for parsing EDIFACT messages. Instead of treating a message as a flat list of segments, it models messages as a syntax tree: segments can define groups of child segments, recursively.

You define the syntax tree once, then parse, validate, or pretty-print messages against that structure. It works by converting the syntax tree to a state machine of possible transitions between segments.

DonaldPShimoda • today at 6:11 PM

What is a "real" syntax tree? I wonder if the intent was "concrete" (the contrast to an abstract syntax tree), or if it's meant colloquially (as in "you really get a syntax tree" or "you get an actual syntax tree") rather than as a technical term.

➕ show 1 reply
LouDNL • today at 7:07 PM

Really nice! I've been preparing to parse this for a possible customer in another language. Thanks for the insights.