Tôi đang cố gắng tìm một giải pháp tốt hơn để tạo một trình phân tích cú pháp cho một số định dạng tệp nổi tiếng ngoài kia, chẳng hạn như: EDIFACT và TradACOMS .
Nếu bạn không quen thuộc với các tiêu chuẩn này thì hãy xem ví dụ này từ Wikipedia:
Xem bên dưới để biết ví dụ về thông báo EDIFACT được sử dụng để trả lời yêu cầu về tính sẵn có của sản phẩm: -
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'
Phân khúc UNA là tùy chọn. Nếu có, nó chỉ định các ký tự đặc biệt sẽ được sử dụng để giải thích phần còn lại của tin nhắn. Có sáu nhân vật theo UNA theo thứ tự này:
- phân tách thành phần dữ liệu thành phần (: trong mẫu này)
- dấu tách phần tử dữ liệu (+ trong mẫu này)
- thông báo thập phân (. trong mẫu này)
- phát hành ký tự (? trong mẫu này)
- dành riêng, phải là một không gian
- terminator phân đoạn ('trong mẫu này)
Như bạn có thể thấy đó chỉ là một số dữ liệu được định dạng theo cách đặc biệt đang chờ phân tích cú pháp (giống như các tệp XML ).
Bây giờ hệ thống của tôi được xây dựng trên PHP và tôi đã có thể tạo trình phân tích cú pháp bằng cách sử dụng các biểu thức thông thường cho từng phân đoạn, nhưng vấn đề không phải là mọi người đều thực hiện tiêu chuẩn một cách hoàn hảo.
Một số nhà cung cấp có xu hướng bỏ qua các phân khúc và lĩnh vực tùy chọn hoàn toàn. Những người khác có thể chọn gửi nhiều dữ liệu hơn những người khác. Đó là lý do tại sao tôi buộc phải tạo trình xác nhận cho các phân đoạn và trường để kiểm tra xem tệp có đúng hay không.
Bạn có thể tưởng tượng cơn ác mộng của những biểu hiện thông thường mà tôi đang có ngay bây giờ. Ngoài ra, mỗi nhà cung cấp cần nhiều sửa đổi cho các biểu thức thông thường mà tôi có xu hướng xây dựng trình phân tích cú pháp cho mỗi nhà cung cấp.
Câu hỏi:
1- Đây có phải là cách thực hành tốt nhất để phân tích tệp (sử dụng biểu thức chính quy)?
2- Có giải pháp nào tốt hơn để phân tích tệp (có thể có giải pháp đã sẵn sàng ngoài đó) không? Nó sẽ có thể hiển thị đoạn nào bị thiếu hoặc nếu tập tin bị hỏng?
3- Nếu tôi phải xây dựng trình phân tích cú pháp của mình thì tôi nên sử dụng mẫu thiết kế hoặc phương pháp nào?
Ghi chú:
Tôi đã đọc ở đâu đó về yacc và ANTLR, nhưng tôi không biết liệu chúng có phù hợp với nhu cầu của tôi hay không!