ต้นไม้ไวยากรณ์ที่เป็นนามธรรมจะต้องเป็นต้นไม้หรือไม่?


13

ผลลัพธ์ของตัวแยกวิเคราะห์จะต้องเป็นต้นไม้หรืออาจเป็นกราฟทั่วไปด้วยหรือไม่

ยิ่งกว่านั้นมีภาษาใดที่มีอยู่หรือเป็นไปได้ที่ใช้การแสดงกราฟทั่วไปแทนต้นไม้สำหรับไวยากรณ์ของพวกเขา?


ลอจิก -calculus มีรูปแบบไวยากรณ์ที่เป็นนามธรรมที่เป็นวงจร μ
Pål GD

คำตอบ:


14

เอาต์พุตของตัวแยกวิเคราะห์ไม่จำเป็นต้องเป็นทรี แน่นอนเมื่อคุณพิจารณาสิ่งต่าง ๆ เช่นการอ้างอิงจาก USE ของตัวแปรไปยัง DEFinition ที่วางซ้อนอยู่บนต้นไม้ไวยากรณ์นามธรรมคุณจะมีกราฟทันที

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

มีสิ่งต่าง ๆ เช่นกราฟไวยากรณ์ แต่ฉันไม่รู้ว่ามันใช้สำหรับการแยกวิเคราะห์ภาษาการเขียนโปรแกรมหรือไม่


1
มันเป็นไปได้อย่างสมบูรณ์แบบกับโครงสร้างกราฟเอาท์พุทเช่นต้นไม้ไวยากรณ์ที่ตกแต่งด้วยลิงค์นิยามการใช้งานในครั้งเดียว คอมไพเลอร์หลายคนทำมันในอายุหกสิบเศษ
babou

4

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

ฉันเดาว่า parser เป็นอัลกอริธึมที่จะให้โครงสร้างประโยคของประโยคที่คุณป้อนตามการนิยามอย่างเป็นทางการของไวยากรณ์ของภาษา

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

ดังนั้นขึ้นอยู่กับสิ่งที่คุณกำหนดไวยากรณ์ที่จะเป็นคุณอาจต้องส่งออกโครงสร้างที่เป็นทางการที่แตกต่างกัน

ในกรณีง่าย ๆ ในการแยกบริบทที่ไม่มีความบริสุทธิ์ต้นไม้ในการแยกวิเคราะห์อาจทำยกเว้นปัญหาของความกำกวมที่ระบุไว้ด้านล่างหรือสำหรับข้อเท็จจริงที่ว่าคุณอาจต้องการแก้ไขเล็กน้อยเพื่อให้ได้ AST (ดูด้านล่าง)

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

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

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

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

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

เกี่ยวกับต้นไม้ไวยากรณ์ที่เป็นนามธรรม

ตอนนี้คำถามก็เกี่ยวกับต้นไม้ไวยากรณ์นามธรรม ฉันข้ามส่วน "นามธรรม" ไปเพราะจะทำให้เกิดความสับสน แน่นอนว่าคำถามนั้นทำให้เกิดความสับสนในการคืนค่าต่างๆ

เกี่ยวกับ AST ในมุมมองทางประวัติศาสตร์พวกเขามีต้นกำเนิดมาจากภาษา Lisp และระบบการปรับเปลี่ยนโปรแกรมในปี 1960-1970 ความคิดคือการพิจารณาโปรแกรมเป็นนิพจน์ขนาดใหญ่เช่นเดียวกับสูตรทางคณิตศาสตร์ทั้งเพื่อวัตถุประสงค์ในการจัดการและเพื่อวิเคราะห์คุณสมบัติหรือกำหนดความหมายในลักษณะที่เป็นทางการซึ่งนักคณิตศาสตร์รู้วิธีการทำในสูตร ในฐานะสูตรพวกเขามีโครงสร้างต้นไม้ตามธรรมชาติ แต่สามารถตกแต่งด้วยข้อมูลต่าง ๆ ที่ทำให้ต้นไม้เหล่านี้กลายเป็นกราฟ นี่คือความสะดวกทั้งทางการและในทางปฏิบัติและถูกนำไปใช้เพิ่มเติมโดยคอมไพเลอร์และระบบการเขียนโปรแกรม

ดังนั้นพื้นฐาน AST จึงเป็นต้นไม้โดยนัยโดยชื่อ แต่สามารถนำข้อมูลเพิ่มเติมไปใช้ได้ ส่วนที่เหลืออยู่ในการเลือกของผู้ดำเนินการและในสายตาของคนดู มันเป็นกราฟหรือต้นไม้ตกแต่ง? อย่างไรก็ตามต้นไม้ AS พื้นฐานนั้นสำคัญเพราะนั่นเป็นโครงสร้างที่คุณสร้างทั้งในเชิงทฤษฎีและในการเขียนโปรแกรม

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

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


1

หากคุณแยกวิเคราะห์โดยใช้การแยกวิเคราะห์ GLR (LR ทั่วไป) และหากการแยกวิเคราะห์ของอินพุตมีความกำกวม (มีหลายวิธีที่เป็นไปได้ในการแยกวิเคราะห์อินพุต) ดังนั้นผลลัพธ์ของการแยกวิเคราะห์สามารถพิจารณาเป็น DAG แยกวิเคราะห์แทน แยกต้นไม้ DAG แยกวิเคราะห์ขนาดกะทัดรัดเข้ารหัสแยกวิเคราะห์เป็นไปได้หลาย: ต้นไม้แยกวิเคราะห์ที่เป็นไปได้

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


ตัวแยกวิเคราะห์ GLR ดั้งเดิม (อันที่เรียกว่าอย่างนั้น) อาจทำให้เกิดการแยกวิเคราะห์ DAG เพราะมันถูกบั๊ก เนื่องจากจำนวนของการแยกวิเคราะห์ที่เป็นไปได้อาจไม่มีที่สิ้นสุดโดยทั่วไปจึงไม่มีวิธีที่คุณสามารถแสดงถึงอนันต์นี้ด้วยโครงสร้าง จำกัด ที่ไม่มีไคล์ โครงสร้างที่แท้จริงคือกราฟสองส่วนซึ่งคล้ายกับและ - หรือกราฟ เป็นที่รู้จักกันภายใต้ชื่ออื่น การไร้ความสามารถที่จะนำเสนอความกำกวมที่ไม่มีที่สิ้นสุดนี้อาจเป็นปัญหาในสถานการณ์ NLP ต่างๆการสิ้นสุดประโยคสุดท้ายนั้นค่อนข้างแปลก (หรือไร้ความหมาย) และฉันแก้ไขการพิมพ์ผิดสองครั้ง (ฉันเดา)
babou

0

ใน NLP การแทนค่าทางไวยากรณ์ที่เป็นนามธรรมนั้นเป็นการนำกราฟแบบวงกลม (DAG) สถานการณ์เมื่อสองขอบชี้ไปที่โหนดเดียวกันเรียกว่า "การแบ่งปันโครงสร้าง"


0

ฉันเคยเขียนล่ามสำหรับ C ซึ่ง "AST" สำหรับตัวดำเนินการ + = (ตัวอย่าง) ไม่ใช่ต้นไม้ พิจารณาa[i++] += dที่a[i++]เป็นintและเป็นd doubleการดำเนินการแปลงและดึงข้อมูลโดยนัยมีความชัดเจนในต้นไม้ดังนั้นปัญหาคือที่ที่จะดึงข้อมูลa[i++]และการแปลงเป็นสองเท่า ทางออกของเราคือการละทิ้งต้นไม้ ผลลัพธ์ "ASG" จะเป็นเช่นนี้

         +=
       / | \
      /  |  \
     /   |   \
    / convert \
    |     |    \
    |   fetch  fetch
    |   /       |
    index       d
    /  \
   a   postinc
       |
       i

0

ฉันงงงวยด้วยตัวเองนี้จนกระทั่งฉันเพิ่งรู้ว่ามันไม่ใช่ต้นไม้ที่เป็นนามธรรมไม่เกี่ยวกับนามธรรม "ต้นไม้ไวยากรณ์" แต่ไวยากรณ์เป็นนามธรรม

ดังนั้นเพื่อตอบคำถามของคุณฉันสรุปได้ว่าต้นไม้ไวยากรณ์นามธรรมเช่นเดียวกับต้นไม้ไวยากรณ์ที่เป็นรูปธรรมหรือต้นไม้ตัดสินใจหรือต้นไม้อื่น ๆ ควรเป็นต้นไม้

ในทางกลับกันไม่มีสิ่งใดที่ควรป้องกันไม่ให้ใครใช้กราฟไวยากรณ์นามธรรมหรือแผนภาพไวยากรณ์นามธรรมหรือคิวบ์บทคัดย่อที่เป็นนามธรรมหรือสเปคไวยากรณ์ที่เป็นนามธรรม

ฉันคิดว่าต้นไม้ไวยากรณ์นามธรรมของ "ต้นไม้ไวยากรณ์นามธรรม" จะช่วยให้ฉันหลีกเลี่ยงความสับสน

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