3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
具體語法樹以完全解析的形式表示源文本。通常,它符合定義源語言的無上下文語法。
但是,具體的語法和樹有很多東西是使源文本明確可解析所必需的,但卻沒有實(shí)際意義。例如,要實(shí)現(xiàn)運(yùn)算符優(yōu)先級(jí),您的CFG通常具有多個(gè)級(jí)別的表達(dá)式組件(術(shù)語,因子等),運(yùn)算符將它們連接到不同的級(jí)別(您添加術(shù)語以獲取表達(dá)式,術(shù)語由可選乘以的因子組成)等)。但是,要實(shí)際解釋或編譯語言,您不需要這樣做; 您只需要具有運(yùn)算符和操作數(shù)的Expression節(jié)點(diǎn)。抽象語法樹是將具體語法樹簡(jiǎn)化為實(shí)際需要表示程序含義的結(jié)果。該樹具有更簡(jiǎn)單的定義,因此在后續(xù)執(zhí)行階段更容易處理。
您通常不需要實(shí)際構(gòu)建具體的語法樹。您的YACC(或Antlr,或Menhir,或任何......)語法中的動(dòng)作例程可以直接構(gòu)建抽象語法樹,因此具體語法樹僅作為表示源文本的解析結(jié)構(gòu)的概念實(shí)體存在。

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是基于Terrence Parr 的Expression Evaluator語法。
這個(gè)例子的語法:
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是輸入的抽象表示。請(qǐng)注意,AST中不存在parens,因?yàn)殛P(guān)聯(lián)可以從樹結(jié)構(gòu)中派生。
編輯
有關(guān)更多解釋,請(qǐng)參閱編譯器和編譯器生成器。23
添加回答
舉報(bào)