Я пытаюсь найти лучшее решение для создания парсера для некоторых известных форматов файлов, таких как: EDIFACT и TRADACOMS .
Если вы не знакомы с этими стандартами, посмотрите этот пример из Википедии:
Ниже приведен пример сообщения EDIFACT, используемого для ответа на запрос доступности продукта: -
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'
Сегмент UNA является необязательным. Если он присутствует, он указывает специальные символы, которые должны использоваться для интерпретации оставшейся части сообщения. В этом порядке после UNA есть шесть символов:
- разделитель элементов данных компонента (: в этом примере)
- разделитель элементов данных (+ в этом примере)
- десятичное уведомление (в этом примере)
- выпустить символ (? в этом примере)
- зарезервировано, должно быть пробелом
- терминатор сегмента (в данном примере)
Как вы можете видеть, это просто некоторые данные, отформатированные особым образом и ожидающие анализа (во многом как XML- файлы).
Теперь моя система построена на PHP, и я смог создать синтаксический анализатор с использованием регулярных выражений для каждого сегмента, но проблема не в том, что все прекрасно реализуют стандарт.
Некоторые поставщики имеют тенденцию полностью игнорировать дополнительные сегменты и поля. Другие могут отправить больше данных, чем другие. Вот почему я был вынужден создать валидаторы для сегментов и полей, чтобы проверить правильность файла или нет.
Вы можете представить себе кошмар регулярных выражений, которые у меня сейчас есть. Кроме того, каждому поставщику нужно много модификаций регулярных выражений, которые я собираю создать для каждого поставщика.
Вопросов:
1- Это лучший метод для анализа файлов (с использованием регулярных выражений)?
2- Есть ли лучшее решение для разбора файлов (может быть, есть готовое решение там)? Сможет ли он показать, какой сегмент отсутствует или файл поврежден?
3. Если мне все равно придется создавать свой парсер, какой шаблон или метод проектирования мне использовать?
Ноты:
Я где-то читал о YACC и ANTLR, но я не знаю, соответствуют ли они моим потребностям или нет!