งูหลามเป็นภาษาสคริปต์ที่มีความสุข มันยังช่วยให้คุณเข้าถึงตัวแยกวิเคราะห์ของตัวเองและคอมไพเลอร์ นอกจากนี้ยังช่วยให้คุณเข้าถึง parsers อื่น ๆ ที่แตกต่างกันเพื่อวัตถุประสงค์พิเศษเช่น XML และแม่แบบสตริง
แต่บางครั้งคุณอาจต้องการที่จะมีการแยกวิเคราะห์ของคุณเอง นี่คือสิ่งที่เป็น pyPEG สำหรับ
เพื่อให้ได้มุมมองที่รวดเร็วในสิ่งที่เกิดขึ้นโปรดอ่านบทความเกี่ยวกับวิธีการแยกภาษาโดยพลการ XML ที่มี pyPEG บนบล็อกของฉัน
อะไรคือสิ่งที่ PEG?
PEG หมายถึงไวยากรณ์การแสดงออกแยก มันเป็นสิ่งที่ต้องการความคิดของนิพจน์ปกติสำหรับภาษาฟรีบริบท; คำอธิบายที่ชัดเจนมากคุณจะพบในบทความวิกิพีเดียเกี่ยวกับ PEG
ด้วยหมุดคุณสามารถอธิบายภาษาเดียวกันเช่นเดียวกับ BNF (และพวกเขากำลังแม้คล้ายกัน)
อะไรคือสิ่งที่ตัวแยกวิเคราะห์-ล่าม?
parsers สามัญไม่ได้ใช้ PEGs และบนลงล่างแยก แต่ LR (n) หรือ LL (n) และแยกจากล่างขึ้นบน ผลนี้ในความคิดของการใช้เครื่องกำเนิดไฟฟ้า parser
เพราะด้วย LR (n) หรือ LL (n) parsers ที่คุณต้องการในการคำนวณออก DFA แรกมักจะให้กำเนิด parser ทำเพื่อคุณ ผลที่ตามมาคือการดำเนินการแยกวิเคราะห์ไวยากรณ์ BNF ของคุณซึ่งเป็นอินพุท หนึ่งสามารถโทรกำเนิดแยกวิเคราะห์คอมไพเลอร์จาก BNF การดำเนินการแยกวิเคราะห์
ตัวแยกวิเคราะห์-ล่ามทำงานเป็นล่ามแทนที่จะเป็นเช่นคอมไพเลอร์ เพียงแค่ให้ไวยากรณ์ของคุณเป็น input และมันจะแยกวิเคราะห์ภาษาอธิบายจากข้อความ จะมีไม่มีโปรแกรมที่สร้างขึ้น
การใช้ pyPEG
นั่นหมายความว่าการใช้ pyPEG เป็นเรื่องง่ายมาก;-) ถ้าคุณรู้ว่าการแสดงออกปกติแล้วคุณจะได้เรียนรู้ที่จะใช้ pyPEG ได้อย่างรวดเร็ว
ตัวอย่างเล็ก ๆ
ตัวอย่าง: คิดว่าภาษาที่ง่ายเช่นนี้:
ฟังก์ชั่นฟัก (n) {
& nbsp; ถ้า (n == 0) {// 0! 1 โดยความหมาย
& nbsp; return 1;
& nbsp;} อื่น {
& nbsp; n * กลับมาฟัก (n - 1);
& nbsp;};
}
pyPEG สำหรับภาษาที่มีลักษณะเช่นรหัสต่อไปนี้ (ดูยังสคริปต์ตัวอย่าง):
def ความคิดเห็น (): การกลับมา [re.compile (r "//.*") re.compile ("/*.*?*/" re.S)]
def อักษร (): การกลับมา re.compile (". *" r'd * * * * * * * * .d | | d + ')
สัญลักษณ์ def (): การกลับมา re.compile (r "+ w")
ประกอบ def (): การกลับมา re.compile (r "+ | - | * | / | ==")
การดำเนินงาน def (): สัญลักษณ์การกลับมาดำเนินการ [แท้จริง functioncall]
การแสดงออก def (): การกลับมา [ตัวอักษร, การดำเนินงาน functioncall]
def expressionlist (): กลับแสดงออก -1 ("," การแสดงออก)
def returnstatement (): การกลับมาของคำหลัก ("กลับ") การแสดงออก
def ifstatement (): การกลับมาของคำหลัก ("ถ้า"), "(", การแสดงออก ")" บล็อกคำ ("อื่น") บล็อก
คำสั่ง def (): การกลับมา [ifstatement, returnstatement] ";"
บล็อก def (): กลับ "{", -2, คำสั่ง "}"
def ParameterList (): การกลับมา "(", สัญลักษณ์ -1 ("," สัญลักษณ์) ")"
def functioncall (): สัญลักษณ์กลับ "(", expressionlist, ")"
ฟังก์ชั่น def (): การกลับมาของคำหลัก ("ฟังก์ชั่น"), สัญลักษณ์ ParameterList บล็อก
def simpleLanguage () ฟังก์ชั่นการกลับมา
มีอะไรใหม่ ในข่าวประชาสัมพันธ์นี้:
- นี้เป็นรุ่นการทำความสะอาด รหัสของแจง () และเขียน () ได้รับการแก้ไข.
มีอะไรใหม่ ในรุ่น 1.4:.
- รุ่นนี้ช่วยแก้ไขข้อบกพร่องบางอย่างที่มีการแยก packrat
มีอะไรใหม่ ในรุ่น 1.3:
- เปลี่ยน tuple สำหรับชื่อใน pyAST โดยสัญลักษณ์ (รายการ ) ชั้นที่เข้ากันได้อย่างเป็นธรรม แต่สนับสนุนรหัสอธิบายเพิ่มเติมในแบ็กเอนด์คอมไพเลอร์ด้วย.
มีอะไรใหม่ ในรุ่น 1.2:.
- Bugs กับ Unicode ในการจัดการข้อผิดพลาดได้รับการแก้ไข
มีอะไรใหม่ ในรุ่น 1.1:.
- สนับสนุน Unicode ถูกเพิ่มเข้ามา
มีอะไรใหม่ ในรุ่น 0.46:.
- pyPEG.print_trace เป็น True
- แปลง pyPEG หลาม 3.x ตอนนี้ทำงานต่อเนื่องโดยใช้ 2to3
- กฎไวยากรณ์ที่ถูกนำมาใช้สามารถตรวจสอบทางเลือกโดยการตั้งค่า
- pyPEG จะออกร่องรอยนี้เพื่อ stderr.
มีอะไรใหม่ ในรุ่น 0.45:.
- Bugfixes
มีอะไรใหม่ ในรุ่น 0.44:
- pyPEG ตอนนี้ประดับแต่ละวัตถุ pyAST ที่มีชื่อแฟ้มแหล่งที่มาและสาย จำนวน.
ต้องการ
- หลาม
ความคิดเห็นที่ไม่พบ