ทำไมการใช้ lexer / parser กับข้อมูลไบนารีจึงผิด?


13

ฉันมักจะทำงานร่วมกับlexer / parsersซึ่งต่างจากผู้รวบรวม parser และเห็นคนที่ไม่เคยเรียนในการแยกวิเคราะห์ถามเกี่ยวกับการแยกวิเคราะห์ข้อมูลไบนารี โดยทั่วไปแล้วข้อมูลไม่เพียง แต่เป็นไบนารี แต่ยังคำนึงถึงบริบทด้วย โดยทั่วไปจะนำไปสู่การมีโทเค็นประเภทเดียวเท่านั้นโทเค็นสำหรับไบต์

บางคนสามารถอธิบายได้ว่าทำไมการแยกวิเคราะห์ข้อมูลไบนารีด้วย lexer / parser นั้นมีความชัดเจนเพียงพอสำหรับนักเรียน CS ที่ไม่ได้ทำการแยกวิเคราะห์ แต่มีพื้นฐานทางทฤษฎี


ฉันเดาว่า lexer อาจไม่พบโทเค็นที่มีขนาดเล็กกว่าไบต์ / คำ หากคุณต้องการ Erlang ได้รับการสนับสนุนอย่างดีเยี่ยมในการวิเคราะห์ไบนารี: user.it.uu.se/~pergu/papers/JFP_06.pdf
Dave Clarke

3
ฉันไม่คิดว่าสมมติฐานของคุณเป็นจริง เห็นได้ชัดว่าข้อมูลที่ไม่ใช่บริบทไม่มีปัญหา (ซึ่งมักจะหลีกเลี่ยง) แต่คุณสามารถให้ไวยากรณ์สำหรับคำไบนารี คุณอาจจะไม่สามารถที่จะใช้เครื่องกำเนิดไฟฟ้า parser นิยมเป็นผู้ที่ถือว่าการป้อนข้อความ นั่นเป็นอีกประเด็นหนึ่ง
Raphael

@GuyCoder: ตัวอย่างคลาสสิกมากสำหรับการใช้ไวยากรณ์ตัวอักษรไบนารีเช่น S S0S10S
Raphael

1
28

5
@GuyCoder: ข้อมูลทั้งหมดที่สร้างโดยโปรแกรมอื่นสามารถอธิบายได้ด้วยไวยากรณ์ แม้ว่ามันอาจจะไม่ใช่บริบทก็ตาม
Raphael

คำตอบ:


10

โดยหลักการแล้วไม่มีอะไรผิดปกติ

ในทางปฏิบัติ

  • รูปแบบข้อมูลที่ไม่ใช่ข้อความส่วนใหญ่ฉันรู้ว่าไม่บริบทและดังนั้นจึงไม่เหมาะสำหรับตัวแยกวิเคราะห์ทั่วไป สาเหตุที่พบบ่อยที่สุดคือมีฟิลด์ความยาวที่ให้จำนวนครั้งที่ผลิตได้

    เห็นได้ชัดว่าการมีภาษาที่ไม่ใช้บริบทไม่เคยขัดขวางการใช้เครื่องแยกวิเคราะห์: เราแยกวิเคราะห์ชุดภาษาและใช้กฎความหมายเพื่อลดสิ่งที่เราต้องการ วิธีการนั้นสามารถนำมาใช้สำหรับรูปแบบที่ไม่ใช่ข้อความหากผลลัพธ์จะถูกกำหนดไว้ ปัญหาคือการหาสิ่งอื่นที่ไม่ใช่การนับเพื่อซิงโครไนซ์เนื่องจากรูปแบบไบนารีส่วนใหญ่อนุญาตให้มีการฝังข้อมูลโดยพลการ ความยาวของฟิลด์จะบอกคุณว่ามันคืออะไร

    จากนั้นคุณสามารถเริ่มเล่นลูกเล่นเช่นการให้ lexer เขียนด้วยตนเองสามารถจัดการกับคำติชมจาก parser (การจัดการ lex / yacc ของ C ใช้เทคนิคชนิดนั้นเพื่อจัดการ typedef เป็นต้น) แต่เรามาถึงจุดที่สอง

  • รูปแบบข้อมูลที่ไม่ใช่ข้อความส่วนใหญ่นั้นค่อนข้างง่าย (แม้ว่าจะไม่มีบริบท) เมื่อจำนวนที่กล่าวถึงข้างต้นถูกละเว้นภาษาจะปกติ LL1 ที่แย่ที่สุดและเหมาะสำหรับเทคนิคการวิเคราะห์ด้วยตนเอง และการจัดการนับเป็นเรื่องง่ายสำหรับเทคนิคการแยกวิเคราะห์ด้วยตนเองเช่นการสืบเชื้อสายซ้ำ


"ภาษาเป็นปกติ" ถ้า "แต่บริบทยังอ่อนไหว" ถูกนำมาใช้เพื่อหมายถึงข้อมูลไบนารีเป็นไวยากรณ์ฉันจะชี้แจงในคำตอบนั่นจะเป็นส่วนหนึ่งของปัญหาคนมักจะคิดไวยากรณ์หรือภาษาปกติเมื่อคุณ พูดถึง parser
Guy Coder

7

แบ่งหมวดหมู่ข้อมูลออกเป็นสามหมวดหมู่: ข้อมูลที่มนุษย์อ่านได้ (โดยทั่วไปคือข้อความ, หนังสือที่แตกต่างกันไปตามโปรแกรม) ข้อมูลที่คอมพิวเตอร์ตั้งใจอ่านและข้อมูลอื่น ๆ (แยกวิเคราะห์รูปภาพหรือเสียง)

สำหรับหมวดหมู่แรกเราต้องประมวลผลเป็นสิ่งที่คอมพิวเตอร์สามารถใช้ได้ เนื่องจากภาษาที่มนุษย์ใช้มักจะถูกจับได้ค่อนข้างดีโดยตัวแยกวิเคราะห์เรามักใช้ตัวแยกวิเคราะห์นี้

ตัวอย่างของข้อมูลในหมวดหมู่ที่สามจะเป็นภาพสแกนของหน้าหนังสือที่คุณต้องการแยกวิเคราะห์เป็นข้อความ สำหรับหมวดหมู่นี้คุณมักจะต้องการความรู้เฉพาะเกี่ยวกับข้อมูลที่คุณป้อนดังนั้นคุณจึงจำเป็นต้องมีโปรแกรมเฉพาะในการแยกวิเคราะห์ เทคโนโลยีการแยกวิเคราะห์แบบมาตรฐานจะช่วยให้คุณไปได้ไกล

คำถามของคุณเกี่ยวกับหมวดหมู่ที่สอง: หากเรามีข้อมูลที่อยู่ในรูปแบบไบนารีมันเกือบจะเป็นผลิตภัณฑ์ของโปรแกรมคอมพิวเตอร์ที่มีไว้สำหรับโปรแกรมคอมพิวเตอร์อื่น ทันทีซึ่งหมายความว่ารูปแบบข้อมูลที่เลือกจะถูกเลือกโดยโปรแกรมที่รับผิดชอบในการสร้าง

โปรแกรมคอมพิวเตอร์มักจะผลิตข้อมูลในรูปแบบที่มีโครงสร้างชัดเจน หากเราแยกวิเคราะห์บางส่วนเราจะพยายามหาโครงสร้างของอินพุต ด้วยข้อมูลไบนารีโครงสร้างนี้โดยทั่วไปจะง่ายมากและง่ายต่อการแยกวิเคราะห์โดยคอมพิวเตอร์

กล่าวอีกนัยหนึ่งคือโดยปกติแล้วจะมีเศษขยะเล็กน้อยที่จะเข้าใจโครงสร้างของอินพุตที่คุณรู้จักโครงสร้างนั้นอยู่แล้ว เนื่องจากการแยกวิเคราะห์ไม่ฟรี (ต้องใช้เวลาและเพิ่มความซับซ้อนให้กับโปรแกรมของคุณ) นี่คือเหตุผลว่าทำไมการใช้ lexers / parsers กับข้อมูลไบนารีจึง 'ผิดปกติ'


2
นี่เป็นมุมมองที่ดี แต่ฉันรู้สึกว่ามันไม่ได้ตอบคำถาม
กราฟิลส์

LANGSEC: Language-theoretic Securityเสนอมุมมองที่น่าสนใจ หนึ่งในบทความที่พูดถึง "เครื่องแปลก ๆ ": ตัวแยกวิเคราะห์เฉพาะกิจในรูปแบบที่รู้จักกันดีซึ่งสร้างสิ่งอำนวยความสะดวกในการจัดการอินพุตของระบบ พวกเขาอาจไม่ทำงานตามที่ตั้งใจจริง เนื่องจากข้อสันนิษฐานที่ไม่ถูกต้องเครื่องที่ชำรุดจะทำการเปลี่ยนสถานะที่ไม่คาดคิดโดยเฉพาะการป้อนข้อมูลที่สร้างขึ้นมาโดยเฉพาะการทำการคำนวณที่ไม่ควรเกิดขึ้น สิ่งนี้จะสร้างเวกเตอร์การโจมตี การใช้ไวยากรณ์อย่างเป็นทางการจะให้อัลกอริธึมที่ถูกต้องอย่างพิสูจน์ได้
Matheus Moreira

0

a+b×(cd)+e(+ a (* b (- c d)) e)a b c d - * + e +. สัญกรณ์คณิตศาสตร์ปกติมีความซ้ำซ้อนมากกว่า Lisp (ซึ่งต้องใช้วงเล็บมากกว่า แต่รับตัวแปร arities ฟรีดังนั้นต้องใช้สัญลักษณ์น้อยลงในการแสดงนิพจน์โดยใช้ arities ขนาดใหญ่) หรือ RPL (ซึ่งไม่ต้องการวงเล็บ) ความซ้ำซ้อนดังกล่าวไม่ค่อยมีประโยชน์กับคอมพิวเตอร์ - และในกรณีที่มีข้อผิดพลาดในข้อมูลมักจะมีการแก้ไขตรรกะการแก้ไขข้อผิดพลาดโดยแยกออกจากความหมายการทำงานของข้อมูลตัวอย่างเช่นการใช้รหัสแก้ไขข้อผิดพลาด ลำดับไบต์โดยไม่คำนึงถึงสิ่งที่พวกเขาเป็นตัวแทน

รูปแบบไบนารีมักจะถูกออกแบบมาให้มีขนาดกะทัดรัดซึ่งหมายถึงคุณสมบัติทางภาษาง่าย ๆ สองสามอย่างเช่นวงเล็บที่มีความสมดุลซึ่งสามารถแสดงออกได้ด้วยไวยากรณ์ที่ไม่มีบริบท ยิ่งไปกว่านั้นมันมักจะมีประโยชน์สำหรับการนำเสนอข้อมูลแบบไบนานิคซึ่งเป็นที่ยอมรับเช่นมีการแสดงเพียงครั้งเดียวของแต่ละวัตถุ กฎนี้ออกคุณสมบัติที่ซ้ำซ้อนบางครั้งเช่นวงเล็บ อีกผลที่น่าชื่นชมน้อยกว่าของการมีความซ้ำซ้อนน้อยกว่าคือถ้าทุกอินพุตถูกต้องทางไวยากรณ์มันจะบันทึกในการตรวจสอบข้อผิดพลาด

ปัจจัยอีกประการหนึ่งสำหรับการแยกวิเคราะห์แบบไม่ระบุชื่อสำหรับข้อมูลไบนารีคือรูปแบบไบนารีจำนวนมากได้รับการออกแบบให้แยกวิเคราะห์ด้วยรหัสระดับต่ำที่ชอบทำงานในหน่วยความจำคงที่โดยมีค่าใช้จ่ายเล็กน้อย ขนาดคงที่เป็นที่ต้องการเมื่อใช้กับการอนุญาตให้ทำซ้ำองค์ประกอบโดยพลการ รูปแบบเช่นTLVที่อนุญาตให้ parser จากซ้ายไปขวาจัดสรรจำนวนหน่วยความจำที่เหมาะสมสำหรับวัตถุก่อนจากนั้นอ่านการแทนค่าของวัตถุ การแยกวิเคราะห์จากซ้ายไปขวาเป็นข้อได้เปรียบเนื่องจากช่วยให้สามารถประมวลผลข้อมูลตามที่มาพร้อมกับไม่มีบัฟเฟอร์กลาง


จุดประสงค์ของสองย่อหน้าแรกคืออะไร? แม้ว่าคุณจะไม่มีความซ้ำซ้อนคุณก็ต้องมีโปรแกรมแยกวิเคราะห์ นอกจากนี้ย่อหน้าแรกไม่ถูกต้อง: มีตัวอย่างที่อนุญาตให้ใช้คำทั้งหมด แต่คุณแยกวิเคราะห์เพื่อรับโครงสร้าง (เช่นการทำนายโครงสร้างรองของ RNA)
ราฟาเอล

@Raphael โปรแกรมแยกวิเคราะห์ที่ไม่สำคัญมักจะหมายถึงความซ้ำซ้อน (ใช่ตามที่คุณชี้ว่ามีข้อยกเว้น) ฉันไม่ได้พิจารณาภาษาที่ไม่ได้ออกแบบมาสำหรับมนุษย์หรือคอมพิวเตอร์นี่เป็นตัวอย่างที่น่าสนใจ สองย่อหน้าแรกพูดถึงความแตกต่างทั่วไประหว่างรูปแบบไบนารีและรูปแบบที่มนุษย์อ่านได้ (ความหมายทั่วไปว่าถ้าคุณไปหาข้อยกเว้น
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.