Sto cercando di trovare una soluzione migliore per fare un parser ad alcuni dei famosi formati di file come: EDIFACT e TRADACOMS .
Se non hai familiarità con questi standard, dai un'occhiata a questo esempio di Wikipedia:
See below for an example of an EDIFACT message used to answer to a product availability request:-
UNA:+.? '
UNB+IATB:1+6XPPC+LHPPC+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
APD+714C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:130::6+++++++DA'
UNT+13+1'
UNZ+1+1'
Il segmento UNA è opzionale. Se presente, specifica i caratteri speciali che devono essere utilizzati per interpretare il resto del messaggio. Ci sono sei caratteri che seguono UNA in questo ordine:
- separatore di elementi di dati componente (: in questo esempio)
- separatore di elementi di dati (+ in questo esempio)
- notifica decimale (. in questo esempio)
- rilascia carattere (? in questo esempio)
- riservato, deve essere uno spazio
- terminatore di segmento ('in questo esempio)
Come puoi vedere, sono solo alcuni dati formattati in un modo speciale in attesa di essere analizzati (in modo simile ai file XML ).
Ora il mio sistema è basato su PHP e sono riuscito a creare parser usando espressioni regolari per ogni segmento, ma il problema non è che tutti implementino perfettamente lo standard.
Alcuni fornitori tendono a ignorare completamente segmenti e campi opzionali. Altri potrebbero scegliere di inviare più dati di altri. Ecco perché sono stato costretto a creare validatori per segmenti e campi per verificare se il file fosse corretto o meno.
Puoi immaginare l'incubo delle espressioni regolari che sto avendo adesso. Inoltre, ogni fornitore ha bisogno di molte modifiche alle espressioni regolari che tendo a costruire un parser per ogni fornitore.
Domande:
1- Questa è la procedura migliore per analizzare i file (usando le espressioni regolari)?
2- C'è una soluzione migliore per analizzare i file (forse ci sono soluzioni già pronte in giro)? Sarà in grado di mostrare quale segmento manca o se il file è corrotto?
3- Se devo comunque costruire il mio parser, quale schema o metodologia di progettazione dovrei usare?
Note:
Ho letto da qualche parte su yacc e ANTLR, ma non so se corrispondono ai miei bisogni o no!