GrammarsΒΆ
Definition: A grammar is a description of an edi-message.
- A grammar describes the records, fields, formats etc of an edi file.
 - Bots uses grammars to parse, check and generate edi files.
 - Grammars files are independent of the editype: a grammar for a csv files looks the same as a grammar for a x12 file.
 - Grammar files are in: usersys/grammars/editype/grammar name.py
 
Learn grammar by example
Best way to get the idea of a grammar is to look at the (simple) example in the chapter. Consider the below CSV file:
HEADER,ordernumber1,buyer1,20120524
LINE,1,article1,24,description1
LINE,2,article2,288,
LINE,3.article3,6,description3
The corresponding grammer for this file would be:
from bots.botsconfig import *        #always needed
syntax = {                           #'syntax' section
     'field_sep' : ',',               #specify field separator
     'charset'   : 'utf-8',           #specify character-set
     }
structure = [                        #'structure' section
 {ID:'HEADER',MIN:1,MAX:999,LEVEL:[   #each order starts with a HEADER record
     {ID:'LINE',MIN:1,MAX:9999},      #nested under the HEADER record are the LINE records, repeat up to 9999 times
     ]}
 ]
recorddefs = {                       #'recorddefs' section
 'HEADER':[                           #specify the fields in the HEADER record
     ['BOTSID','M',6,'A'],            #BOTSID is for the HEADER tag itself
     ['order number', 'M', 17, 'AN'], #for each field specify the format, max length, M(andatory) or C(onditional)
     ['buyer ID', 'M', 13, 'AN'],
     ['delivery date', 'C', 8, 'AN'],
     ],
 'LINE':[
     ['BOTSID','M',6,'A'],
     ['line number', 'C', 6, 'N'],
     ['article number', 'M', 13, 'AN'],
     ['quantity', 'M', 20, 'R'],
     ['description', 'C', 70, 'R'],
     ],
 }
The example above is simple, but fully functional.
Sections of a grammar
A grammar file consists of these sections:
- syntax: parameters for the grammar like field separator, merge or not, indent xml, etc.
 - structure: sequence of records in an edi-message: start-record, nested records, repeats.
 - recorddefs: fields per record.
 - nextmessage: to split up an edi file to separate messages.
 - nextmessageblock: to split up a cvs-file to messages.
 
A section can be reused/imported from another grammar file. Purpose: better maintenance of grammars. Example: edifact messages from a certain directory use the same recorddefs/segments:
from recordsD96AUN import recorddefs
One edifact grammar consists of four parts. Example:
- edifact.py (contains syntax common to all edifact grammars)
 - envelope.py (contains envelope structure and recorddefs common to all edifact grammars)
 - recordsD96AUN.py (contains recorddefs common to all edifact D96A grammars)
 - ORDERSD96AUN.py (contains structure specifically for ORDERS D96A)
 
Problems for some edifact grammars on sourceforge site
Sometimes you might meet this error for a grammar:
GrammarError: Grammar "...somewhere...", in structure: nesting collision detected at record "etc etc".
- This is the case eg with INVRPT D96A.
 - UN says about this that you have to make additional choices in message; either you make some segments mandatory or leave out some segment groups.
 - EANCOM did make such choices in their implementation guidelines.
 - So: you can not the grammar directly, edit it according to your needs. This is according to what UN-edifact wants...
 
Index