ทำไมต้องแยก lexing และแยก?


15

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


2
ที่เกี่ยวข้อง: programmers.stackexchange.com/questions/128888/…
ผู้ใช้

2
นี้ได้รับการกล่าวถึงใน CS, stackexchange มีหลายความคิดเห็นทางเทคนิคมากในคำตอบที่จะแสดงพลังของ lexer + parser แต่อาจมีที่ว่างสำหรับคำตอบเพิ่มเติม
babou

ฉันสงสัยว่าการขนานของสไตล์ไปป์ไลน์ (แม้ว่าจะมีความไม่สมดุลอย่างมาก) อาจเป็นข้อได้เปรียบด้านข้าง ทั้งคำสั่งและพฤติกรรมแคชข้อมูลอาจเป็นที่น่าสนใจ จะลดเวลาในการคอมไพล์ได้มากน้อยเพียงใด (ขึ้นอยู่กับฮาร์ดแวร์เฉพาะ)
Paul A. Clayton

เหตุผลอย่างหนึ่งที่ชัดเจน (อย่างน้อยสำหรับฉัน) ก็คือคุณสามารถใช้เครื่องมือเครื่องสแกนแยกกันได้ ในทางปฏิบัติฉันมักใช้ดิ้นเพื่อสแกนอินพุต แต่ไม่ค่อยต้องการพลังเต็มรูปแบบของ yacc
jamesqf

คำตอบ:


13

คุณไม่ต้องแยกพวกมันออก ผู้คนรวมเข้าด้วยกันเป็นparsers ที่ไม่มีสแกนเนอร์

ข้อเสียเปรียบที่สำคัญของตัวแยกวิเคราะห์สแกนเนอร์ดูเหมือนจะเป็นไปได้ว่าผลไวยากรณ์นั้นค่อนข้างซับซ้อน - ซับซ้อนกว่าการรวมกันของนิพจน์ทั่วไปที่ทำ lexing และไวยากรณ์ที่ปราศจากบริบททำการแยกวิเคราะห์บนโทเค็นสตรีม โดยเฉพาะอย่างยิ่งไวยากรณ์สำหรับการวิเคราะห์คำแบบแสกนเนอร์แบบไม่สแกนเนอร์มีแนวโน้มที่จะคลุมเครือ ง่ายต่อการลบความกำกวมสำหรับไวยากรณ์ที่ทำงานบนโทเค็นสตรีม

ประโยชน์ในทางปฏิบัติของการใช้เฟส lexing ล่วงหน้าโดยเฉพาะคือคุณไม่ได้จับคู่ parser ที่ตามมาพร้อมรายละเอียดคำศัพท์ สิ่งนี้มีประโยชน์ในระหว่างการพัฒนาภาษาโปรแกรมช่วงต้นเมื่อรายละเอียดศัพท์และวากยสัมพันธ์ยังคงเปลี่ยนแปลงอยู่บ่อยครั้ง


1
TPPPT

@Babou ใช่ถูกต้อง ฉันไม่ทราบว่าผลลัพธ์ที่เป็นทางการของฟอร์มนิพจน์ทั่วไปที่ประกอบด้วย LL (k) ออกไปจาก LL (k) หรือคล้ายกัน ยิ่งไปกว่านั้น lexing มักจะไม่ได้ทำในภาษาปกติ แต่มีบางสิ่งที่มีประสิทธิภาพมากกว่านั่นคือภาษาปกติที่มีการจับคู่ที่ยาวที่สุดและลำดับความสำคัญอันดับแรกของคำหลัก ฉันไม่แน่ใจว่าชั้นเรียนภาษาที่แน่นอนคืออะไรและคุณสมบัติการปิดของมันคืออะไร
Martin Berger

2
หากการมองไปข้างหน้าของคุณเกี่ยวข้องกับการอ่านตัวบ่งชี้การแต่งเพลงจะต้องใช้การมองไปข้างหน้าอย่างไม่ จำกัด เนื่องจากไม่มี (ตามหลักการ) ที่ไม่มีขอบเขตของความยาวของตัวระบุ
babou

@ บาบูฉันไม่แน่ใจ หากคำหลักที่ยาวที่สุดมีความยาว 17 ตัวอักษรดังนั้นสตริงใด ๆ ที่ยาวกว่าต้องเป็นตัวระบุหรือใช้ไม่ได้กับคำ
Martin Berger

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