ผลลัพธ์ของตัวแยกวิเคราะห์จะต้องเป็นต้นไม้หรืออาจเป็นกราฟทั่วไปด้วยหรือไม่
ยิ่งกว่านั้นมีภาษาใดที่มีอยู่หรือเป็นไปได้ที่ใช้การแสดงกราฟทั่วไปแทนต้นไม้สำหรับไวยากรณ์ของพวกเขา?
ผลลัพธ์ของตัวแยกวิเคราะห์จะต้องเป็นต้นไม้หรืออาจเป็นกราฟทั่วไปด้วยหรือไม่
ยิ่งกว่านั้นมีภาษาใดที่มีอยู่หรือเป็นไปได้ที่ใช้การแสดงกราฟทั่วไปแทนต้นไม้สำหรับไวยากรณ์ของพวกเขา?
คำตอบ:
เอาต์พุตของตัวแยกวิเคราะห์ไม่จำเป็นต้องเป็นทรี แน่นอนเมื่อคุณพิจารณาสิ่งต่าง ๆ เช่นการอ้างอิงจาก USE ของตัวแปรไปยัง DEFinition ที่วางซ้อนอยู่บนต้นไม้ไวยากรณ์นามธรรมคุณจะมีกราฟทันที
สิ่งคือการแยกวิเคราะห์โดยทั่วไปได้รับการออกแบบให้เกิดขึ้นในรอบเดียว - เรื่องนี้มีความสำคัญด้วยเหตุผลทางประวัติศาสตร์เช่นการขาดพื้นที่ว่างและความเร็วของโปรเซสเซอร์ แต่ยังเป็นเพราะมันง่ายกว่าที่จะให้เหตุผลเกี่ยวกับ จากนั้นเฟสที่ตามมาจะตกแต่งต้นไม้แยกวิเคราะห์ด้วยข้อมูลเพิ่มเติม
มีสิ่งต่าง ๆ เช่นกราฟไวยากรณ์ แต่ฉันไม่รู้ว่ามันใช้สำหรับการแยกวิเคราะห์ภาษาการเขียนโปรแกรมหรือไม่
คำถามของ OP ระบุไว้เล็กน้อย แน่นอนอัลกอริทึมการแยกวิเคราะห์สามารถส่งออกสิ่งที่ต้องการ คำถามคือการเข้าใจว่าการวิเคราะห์คำมีไว้เพื่ออะไรและนักวิเคราะห์คำส่งผลลัพธ์ผลลัพธ์ที่บรรลุเป้าหมายนี้หรือไม่ จากนั้นหนึ่งสามารถสงสัยว่าการแสดงที่เหมาะสมสำหรับสิ่งนั้นคืออะไรเช่นต้นไม้หรือกราฟ
ฉันเดาว่า parser เป็นอัลกอริธึมที่จะให้โครงสร้างประโยคของประโยคที่คุณป้อนตามการนิยามอย่างเป็นทางการของไวยากรณ์ของภาษา
โปรดทราบว่าผู้คนอาจไม่เห็นด้วยกับสิ่งที่เป็นรูปแบบของภาษา บางคนอาจ จำกัด ว่าเป็นกระดูกสันหลังของภาษาที่เป็นทางการอย่างบริสุทธิ์ในขณะที่คนอื่นอาจแนะนำการพิจารณาความหมายเล็กน้อยเช่นประเภทประเภทจำนวนหรืออื่น ๆ ที่ซับซ้อนมากขึ้น (ฉันไม่ได้แยก NLP หรือภาษาโปรแกรม) ภาษาส่วนใหญ่มีคุณสมบัติที่ต้องการแสดงกราฟ แต่ขึ้นอยู่กับ "implementor" (เนื่องจากไม่มีคำที่ดีกว่า) เพื่อตัดสินใจว่าเขาต้องการรวมไว้ในไวยากรณ์หรือไม่
ดังนั้นขึ้นอยู่กับสิ่งที่คุณกำหนดไวยากรณ์ที่จะเป็นคุณอาจต้องส่งออกโครงสร้างที่เป็นทางการที่แตกต่างกัน
ในกรณีง่าย ๆ ในการแยกบริบทที่ไม่มีความบริสุทธิ์ต้นไม้ในการแยกวิเคราะห์อาจทำยกเว้นปัญหาของความกำกวมที่ระบุไว้ด้านล่างหรือสำหรับข้อเท็จจริงที่ว่าคุณอาจต้องการแก้ไขเล็กน้อยเพื่อให้ได้ AST (ดูด้านล่าง)
อย่างไรก็ตามในกรณีที่ซับซ้อนมากขึ้นคุณอาจต้องการโครงสร้างที่แตกต่างกันซึ่งมักจะแสดงโดยลิงก์ในต้นไม้ซึ่งนำไปสู่โครงสร้างกราฟ ขึ้นอยู่กับนิยามของไวยากรณ์ภาษาของคุณเป็นอย่างมาก
นอกจากนี้ต้นไม้ที่คุณควรจะเอาท์พุทไม่ชัดเจน หากคุณใช้กรณีของไวยากรณ์ที่อยู่ติดกันของต้นไม้ (TAG) พวกเขาจะทำงานในลักษณะที่ต้นไม้ไวยากรณ์ไม่เหมือนกับต้นไม้ที่ได้รับแม้ว่าอดีตจะได้มาจากด้านหลัง ซึ่งคุณต้องการส่งออกอาจเป็นคำถามที่เกี่ยวข้อง
นอกจากนี้ยังมีปัญหาอื่นที่เกี่ยวข้องกับความกำกวม ประโยคที่กำหนดในขณะที่เป็นภาษาของคุณอาจทำได้หลายวิธี แต่อาจได้รับการกำหนดโครงสร้างประโยคในรูปแบบต่างๆ
จากนั้นคุณสามารถเลือกที่จะส่งออกเพียงหนึ่งในโครงสร้างเหล่านี้เลือกแบบสุ่มหรือตามเกณฑ์ที่กำหนดไว้อย่างดี (เช่นโอกาส) นอกจากนี้คุณยังสามารถเลือกที่จะเอาท์พุทหลายหรือทั้งหมด หากคุณต้องการส่งออกหลาย ๆ อย่างก็มักจะสะดวกในการแพ็คแล้วในโครงสร้างที่เป็นเอกลักษณ์ที่จะแบ่งปันสิ่งที่พวกเขามีเหมือนกัน ประหยัดพื้นที่และเวลาในการคำนวณและความซับซ้อนอาจเป็นปัญหาจริง
เมื่อคุณเลือกที่จะส่งออกทั้งหมดของพวกเขาคุณไม่มีทางเลือกนอกจากจะแบ่งปันเพราะอาจมีการแยกวิเคราะห์เป็นไปได้ไม่ จำกัด จำนวน และสามารถชดเชยได้อย่างไร้ขีด จำกัด เพียงแค่มีวงจรในกราฟ ดังนั้นคุณต้องสร้างโครงสร้างกราฟโดยทั่วไป แต่คุณสมบัติของโครงสร้างกราฟนี้จะเกี่ยวข้องกับชนิดของไวยากรณ์ที่เป็นทางการที่คุณเลือก
ตอนนี้คำถามก็เกี่ยวกับต้นไม้ไวยากรณ์นามธรรม ฉันข้ามส่วน "นามธรรม" ไปเพราะจะทำให้เกิดความสับสน แน่นอนว่าคำถามนั้นทำให้เกิดความสับสนในการคืนค่าต่างๆ
เกี่ยวกับ AST ในมุมมองทางประวัติศาสตร์พวกเขามีต้นกำเนิดมาจากภาษา Lisp และระบบการปรับเปลี่ยนโปรแกรมในปี 1960-1970 ความคิดคือการพิจารณาโปรแกรมเป็นนิพจน์ขนาดใหญ่เช่นเดียวกับสูตรทางคณิตศาสตร์ทั้งเพื่อวัตถุประสงค์ในการจัดการและเพื่อวิเคราะห์คุณสมบัติหรือกำหนดความหมายในลักษณะที่เป็นทางการซึ่งนักคณิตศาสตร์รู้วิธีการทำในสูตร ในฐานะสูตรพวกเขามีโครงสร้างต้นไม้ตามธรรมชาติ แต่สามารถตกแต่งด้วยข้อมูลต่าง ๆ ที่ทำให้ต้นไม้เหล่านี้กลายเป็นกราฟ นี่คือความสะดวกทั้งทางการและในทางปฏิบัติและถูกนำไปใช้เพิ่มเติมโดยคอมไพเลอร์และระบบการเขียนโปรแกรม
ดังนั้นพื้นฐาน AST จึงเป็นต้นไม้โดยนัยโดยชื่อ แต่สามารถนำข้อมูลเพิ่มเติมไปใช้ได้ ส่วนที่เหลืออยู่ในการเลือกของผู้ดำเนินการและในสายตาของคนดู มันเป็นกราฟหรือต้นไม้ตกแต่ง? อย่างไรก็ตามต้นไม้ AS พื้นฐานนั้นสำคัญเพราะนั่นเป็นโครงสร้างที่คุณสร้างทั้งในเชิงทฤษฎีและในการเขียนโปรแกรม
โปรดทราบว่า AST นั้นแตกต่างจากการแยกวิเคราะห์ต้นไม้ (ไวยากรณ์เป็นพื้นฐานแบบไม่มีบริบท) ซึ่งผลิตโดยอัลกอริทึมการแยกวิเคราะห์ตามที่ศึกษาในทฤษฎีภาษาที่เป็นทางการ เหตุผลก็คือการออกแบบของไวยากรณ์ถูก จำกัด ด้วยเทคโนโลยีการแยกเวลา, ตัวเองถูก จำกัด ด้วยพลังงานการคำนวณต่ำที่มีอยู่ ผลที่ได้คือต้นไม้ไวยากรณ์ถูกทรมานเพียงสายพันธุ์ของสิ่งที่หนึ่งจะพิจารณาโครงสร้างของโปรแกรมตามธรรมชาติและการประมวลผลต่อไปไม่ได้เป็นส่วนหนึ่งของกระบวนการแยกวิเคราะห์ขั้นพื้นฐานอย่างเป็นทางการจะต้องดำเนินการเพื่อให้ได้รุ่นที่สะอาดและเรียบง่ายขึ้น
อย่างไรก็ตามการเป็นตัวแทนของต้นไม้บนคอมพิวเตอร์ไม่ว่าจะเป็นนามธรรมหรือไม่นั้นค่อนข้าง จำกัด เมื่อคุณต้องการแสดงโครงสร้างทั้งหมดของประโยคที่ไม่ชัดเจน โดยเฉพาะอย่างยิ่งสิ่งนี้ซ่อนปัญหาความซับซ้อน การรักษาความคลุมเครือในโครงสร้างกราฟในขณะที่การแปลจากต้นไม้แยกเป็น AS Trees อาจเป็นปัญหาเช่นกัน อย่างไรก็ตามหากคุณกังวลเกี่ยวกับเรื่องนี้คุณสามารถกำหนดไวยากรณ์ที่เป็นรูปธรรมของคุณได้ในลักษณะที่ต้นไม้แยกวิเคราะห์สามารถทำหน้าที่เป็น AST ได้ สิ่งนี้ได้รับอนุญาตจากอัลกอริทึมทั่วไปที่จัดการกับความคลุมเครือและด้วยพลังของคอมพิวเตอร์ปัจจุบัน
หากคุณแยกวิเคราะห์โดยใช้การแยกวิเคราะห์ GLR (LR ทั่วไป) และหากการแยกวิเคราะห์ของอินพุตมีความกำกวม (มีหลายวิธีที่เป็นไปได้ในการแยกวิเคราะห์อินพุต) ดังนั้นผลลัพธ์ของการแยกวิเคราะห์สามารถพิจารณาเป็น DAG แยกวิเคราะห์แทน แยกต้นไม้ DAG แยกวิเคราะห์ขนาดกะทัดรัดเข้ารหัสแยกวิเคราะห์เป็นไปได้หลาย: ต้นไม้แยกวิเคราะห์ที่เป็นไปได้
อย่างไรก็ตามบรรทัดล่างยังคงอยู่หากคุณมีไวยากรณ์ที่ไม่มีบริบทและหากสตริงอินพุตของคุณแยกวิเคราะห์ได้อย่างไม่น่าสงสัย (มีเพียงไวยากรณ์เดียวที่ได้มาในไวยากรณ์ที่สร้างสตริงอินพุตนี้) และหากงานการแยกวิเคราะห์คือการสร้าง ที่มา ... จากนั้นภายใต้เงื่อนไขเหล่านี้ผลลัพธ์ของการแยกวิเคราะห์จะจำเป็นต้องเป็นต้นไม้แยกเพราะการผลิตใด ๆ ของไวยากรณ์ฟรีบริบทบริบทโดยเนื้อแท้มีโครงสร้างต้นไม้
ใน NLP การแทนค่าทางไวยากรณ์ที่เป็นนามธรรมนั้นเป็นการนำกราฟแบบวงกลม (DAG) สถานการณ์เมื่อสองขอบชี้ไปที่โหนดเดียวกันเรียกว่า "การแบ่งปันโครงสร้าง"
ฉันเคยเขียนล่ามสำหรับ C ซึ่ง "AST" สำหรับตัวดำเนินการ + = (ตัวอย่าง) ไม่ใช่ต้นไม้ พิจารณาa[i++] += d
ที่a[i++]
เป็นint
และเป็นd
double
การดำเนินการแปลงและดึงข้อมูลโดยนัยมีความชัดเจนในต้นไม้ดังนั้นปัญหาคือที่ที่จะดึงข้อมูลa[i++]
และการแปลงเป็นสองเท่า ทางออกของเราคือการละทิ้งต้นไม้ ผลลัพธ์ "ASG" จะเป็นเช่นนี้
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
ฉันงงงวยด้วยตัวเองนี้จนกระทั่งฉันเพิ่งรู้ว่ามันไม่ใช่ต้นไม้ที่เป็นนามธรรมไม่เกี่ยวกับนามธรรม "ต้นไม้ไวยากรณ์" แต่ไวยากรณ์เป็นนามธรรม
ดังนั้นเพื่อตอบคำถามของคุณฉันสรุปได้ว่าต้นไม้ไวยากรณ์นามธรรมเช่นเดียวกับต้นไม้ไวยากรณ์ที่เป็นรูปธรรมหรือต้นไม้ตัดสินใจหรือต้นไม้อื่น ๆ ควรเป็นต้นไม้
ในทางกลับกันไม่มีสิ่งใดที่ควรป้องกันไม่ให้ใครใช้กราฟไวยากรณ์นามธรรมหรือแผนภาพไวยากรณ์นามธรรมหรือคิวบ์บทคัดย่อที่เป็นนามธรรมหรือสเปคไวยากรณ์ที่เป็นนามธรรม
ฉันคิดว่าต้นไม้ไวยากรณ์นามธรรมของ "ต้นไม้ไวยากรณ์นามธรรม" จะช่วยให้ฉันหลีกเลี่ยงความสับสน