สร้างขึ้นจากขั้นตอนต่างๆของกระบวนการคอมไพล์หรือไม่? หรือต่างกันแค่ชื่อเดียวกัน?
สร้างขึ้นจากขั้นตอนต่างๆของกระบวนการคอมไพล์หรือไม่? หรือต่างกันแค่ชื่อเดียวกัน?
คำตอบ:
นี่เป็นไปตามไวยากรณ์ของ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 เนื่องจากการเชื่อมโยงนั้นได้มาจากโครงสร้างต้นไม้
สำหรับคำอธิบายเพิ่มเติมโปรดดูที่คอมไพเลอร์และตัวสร้างคอมไพเลอร์หน้า 23
หรือAbstract Syntax Treesในหน้า 21 ในไวยากรณ์และความหมายของภาษาโปรแกรม
จากสิ่งที่ฉันเข้าใจ AST มุ่งเน้นไปที่ความสัมพันธ์เชิงนามธรรมระหว่างส่วนประกอบของซอร์สโค้ดมากขึ้นในขณะที่โครงสร้างการแยกวิเคราะห์จะมุ่งเน้นไปที่การนำไวยากรณ์ไปใช้จริงที่ใช้โดยภาษารวมถึงรายละเอียด nitpicky คำเหล่านี้ไม่เหมือนกันอย่างแน่นอนเนื่องจากคำอื่นสำหรับ "parse tree" คือ "ต้นไม้ไวยากรณ์ที่เป็นรูปธรรม"
ฉันพบหน้านี้ซึ่งพยายามแก้ไขคำถามนี้
หนังสือ DSLจากมาร์ตินฟาวเลอร์อธิบายอย่างนี้ AST มีเฉพาะองค์ประกอบ 'มีประโยชน์' ทั้งหมดที่จะใช้สำหรับการประมวลผลต่อไปในขณะที่โครงสร้างการแยกวิเคราะห์มีสิ่งประดิษฐ์ทั้งหมด (ช่องว่างวงเล็บ ... ) จากเอกสารต้นฉบับที่คุณแยกวิเคราะห์
ใช้เวลากำหนดปาสคาลอายุ: = 42;
โครงสร้างไวยากรณ์จะมีลักษณะเหมือนกับซอร์สโค้ด ด้านล่างฉันวางวงเล็บไว้รอบ ๆ โหนด [อายุ] [: =] [42] [;]
ต้นไม้นามธรรมจะมีลักษณะเช่นนี้ [=] [Age] [42]
งานจะกลายเป็นโหนดที่มี 2 องค์ประกอบอายุและ 42 ปีแนวคิดคือคุณสามารถดำเนินการมอบหมายได้
โปรดทราบว่าไวยากรณ์ภาษาปาสคาลหายไป ดังนั้นจึงเป็นไปได้ที่จะมีมากกว่าหนึ่งภาษาที่สร้าง AST เดียวกัน สิ่งนี้มีประโยชน์สำหรับเอ็นจิ้นสคริปต์ข้ามภาษา
ในการแยกโหนดภายในต้นไม้ไม่ใช่เทอร์มินัลใบไม้คือเทอร์มินัล ในโหนดภายในต้นไม้ไวยากรณ์เป็นตัวดำเนินการใบเป็นตัวถูกดำเนินการ