ฉันพยายามที่จะหาทางออกที่ดีสำหรับการทำ parser ให้บางส่วนของรูปแบบไฟล์ที่มีชื่อเสียงออกมีเช่น: EDIFACTและTRADACOMS
หากคุณไม่คุ้นเคยกับมาตรฐานเหล่านี้ลองดูตัวอย่างนี้จาก Wikipedia:
ดูตัวอย่างข้อความ 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 แต่ฉันไม่รู้ว่าตรงกับความต้องการของฉันหรือไม่!