3 回答
幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
具體語法樹以完全解析的形式表示源文本。通常,它符合定義源語言的無上下文語法。
但是,具體的語法和樹有很多東西是使源文本明確可解析所必需的,但卻沒有實際意義。例如,要實現運算符優先級,您的CFG通常具有多個級別的表達式組件(術語,因子等),運算符將它們連接到不同的級別(您添加術語以獲取表達式,術語由可選乘以的因子組成)等)。但是,要實際解釋或編譯語言,您不需要這樣做; 您只需要具有運算符和操作數的Expression節點。抽象語法樹是將具體語法樹簡化為實際需要表示程序含義的結果。該樹具有更簡單的定義,因此在后續執行階段更容易處理。
您通常不需要實際構建具體的語法樹。您的YACC(或Antlr,或Menhir,或任何......)語法中的動作例程可以直接構建抽象語法樹,因此具體語法樹僅作為表示源文本的解析結構的概念實體存在。
蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
這是基于Terrence Parr 的Expression Evaluator語法。
這個例子的語法:
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=1y=23*(x+y)
解析樹
解析樹是輸入的具體表示。解析樹保留輸入的所有信息??湛虮硎究崭瘢葱形?。
AST
AST是輸入的抽象表示。請注意,AST中不存在parens,因為關聯可以從樹結構中派生。
編輯
有關更多解釋,請參閱編譯器和編譯器生成器。23
添加回答
舉報
0/150
提交
取消
