Parse Tree กับ AST ต่างกันอย่างไร


94

สร้างขึ้นจากขั้นตอนต่างๆของกระบวนการคอมไพล์หรือไม่? หรือต่างกันแค่ชื่อเดียวกัน?


Parse Tree เป็นผลมาจากไวยากรณ์ของคุณด้วยสิ่งประดิษฐ์ (คุณสามารถเขียนไวยากรณ์ได้ไม่ จำกัด สำหรับภาษาเดียวกัน) AST จะลด Parse Tree ให้ใกล้เคียงกับภาษามากที่สุด ไวยากรณ์หลายคำสำหรับภาษาเดียวกันจะให้โครงสร้างการแยกวิเคราะห์ที่แตกต่างกัน แต่ควรส่งผลให้ AST เดียวกัน (คุณยังสามารถลดสคริปต์ที่แตกต่างกัน (โครงสร้างการแยกวิเคราะห์ที่แตกต่างกันจากไวยากรณ์เดียวกัน) เป็น AST เดียวกัน)
Guillaume86

1
คำตอบ SO นี้กล่าวถึงความแตกต่างโดยละเอียด: stackoverflow.com/a/1916687/120163
Ira Baxter

คำตอบ:


98

นี่เป็นไปตามไวยากรณ์ของExpression Evaluatorโดย Terrence Parr

ไวยากรณ์สำหรับตัวอย่างนี้:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

multExpr
        :   atom ('*'^ atom)*
        ; 

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

อินพุต

x=1
y=2
3*(x+y)

แยกวิเคราะห์ต้นไม้

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

แยกวิเคราะห์ต้นไม้

AST

AST คือการนำเสนอข้อมูลเชิงนามธรรม โปรดสังเกตว่า parens ไม่มีอยู่ใน AST เนื่องจากการเชื่อมโยงนั้นได้มาจากโครงสร้างต้นไม้

AST

สำหรับคำอธิบายเพิ่มเติมโปรดดูที่คอมไพเลอร์และตัวสร้างคอมไพเลอร์หน้า 23
หรือAbstract Syntax Treesในหน้า 21 ในไวยากรณ์และความหมายของภาษาโปรแกรม


5
คุณได้รับ AST จากโครงสร้างการแยกวิเคราะห์อย่างไร วิธีการลดความซับซ้อนของโครงสร้างการแยกวิเคราะห์ลงใน AST คืออะไร?
CMCDragonkai

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

2
คุณหมายถึงเหมือน CST (ต้นไม้ไวยากรณ์คอนกรีต) เทียบกับ AST (โครงสร้างไวยากรณ์นามธรรม)?
CMCDragonkai

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


16

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

ฉันพบหน้านี้ซึ่งพยายามแก้ไขคำถามนี้


11

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


4

ใช้เวลากำหนดปาสคาลอายุ: = 42;

โครงสร้างไวยากรณ์จะมีลักษณะเหมือนกับซอร์สโค้ด ด้านล่างฉันวางวงเล็บไว้รอบ ๆ โหนด [อายุ] [: =] [42] [;]

ต้นไม้นามธรรมจะมีลักษณะเช่นนี้ [=] [Age] [42]

งานจะกลายเป็นโหนดที่มี 2 องค์ประกอบอายุและ 42 ปีแนวคิดคือคุณสามารถดำเนินการมอบหมายได้

โปรดทราบว่าไวยากรณ์ภาษาปาสคาลหายไป ดังนั้นจึงเป็นไปได้ที่จะมีมากกว่าหนึ่งภาษาที่สร้าง AST เดียวกัน สิ่งนี้มีประโยชน์สำหรับเอ็นจิ้นสคริปต์ข้ามภาษา


1

ในการแยกโหนดภายในต้นไม้ไม่ใช่เทอร์มินัลใบไม้คือเทอร์มินัล ในโหนดภายในต้นไม้ไวยากรณ์เป็นตัวดำเนินการใบเป็นตัวถูกดำเนินการ

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