Estoy tratando de encontrar una mejor solución para hacer un analizador sintáctico de algunos de los formatos de archivo famosos, como: EDIFACT y TRADACOMS .
Si no está familiarizado con estos estándares, consulte este ejemplo de Wikipedia:
Consulte a continuación un ejemplo de un mensaje EDIFACT utilizado para responder a una solicitud de disponibilidad del producto:
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'
El segmento UNA es opcional. Si está presente, especifica los caracteres especiales que se utilizarán para interpretar el resto del mensaje. Hay seis caracteres que siguen a UNA en este orden:
- separador de elementos de datos de componentes (: en esta muestra)
- separador de elementos de datos (+ en esta muestra)
- notificación decimal (. en esta muestra)
- liberar personaje (? en esta muestra)
- reservado, debe ser un espacio
- terminador de segmento ('en esta muestra)
Como puede ver, solo se trata de algunos datos formateados de una manera especial que esperan ser analizados (al igual que los archivos XML ).
Ahora mi sistema está construido en PHP y pude crear un analizador utilizando expresiones regulares para cada segmento, pero el problema no es que todos implementen el estándar a la perfección.
Algunos proveedores tienden a ignorar por completo los segmentos y campos opcionales. Otros pueden optar por enviar más datos que otros. Es por eso que me vi obligado a crear validadores para segmentos y campos para probar si el archivo era correcto o no.
Puedes imaginar la pesadilla de las expresiones regulares que estoy teniendo en este momento. Además, cada proveedor necesita muchas modificaciones a las expresiones regulares que tiendo a construir un analizador para cada proveedor.
Preguntas:
1- ¿Es esta la mejor práctica para analizar archivos (usando expresiones regulares)?
2- ¿Existe una mejor solución para analizar archivos (tal vez hay una solución preparada)? ¿Podrá mostrar qué segmento falta o si el archivo está dañado?
3- Si tengo que construir mi analizador de todos modos, ¿qué patrón de diseño o metodología debo usar?
Notas:
Leí en alguna parte sobre yacc y ANTLR, ¡pero no sé si satisfacen mis necesidades o no!