컴파일 프로세스의 여러 단계에서 생성됩니까? 아니면 같은 것에 대해 다른 이름입니까?
컴파일 프로세스의 여러 단계에서 생성됩니까? 아니면 같은 것에 대해 다른 이름입니까?
답변:
이것은 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=1
y=2
3*(x+y)
구문 분석 트리
구문 분석 트리는 입력의 구체적인 표현입니다. 구문 분석 트리는 입력의 모든 정보를 유지합니다. 빈 상자는 공백, 즉 줄 끝을 나타냅니다.
AST
AST는 입력의 추상적 인 표현입니다. 연결은 트리 구조에서 파생 될 수 있으므로 AST에는 괄호가 없습니다.
자세한 설명은 컴파일러 및 컴파일러 생성기 페이지를 참조하십시오 . 23
또는 추상 구문 나무 페이지에. 21 프로그래밍 언어의 구문 및 의미론
내가 이해 한 바에 따르면 AST는 소스 코드 구성 요소 간의 추상적 인 관계에 더 중점을 두는 반면 구문 분석 트리는 간결한 세부 사항을 포함하여 언어가 사용하는 문법의 실제 구현에 중점을 둡니다. "parse tree"의 또 다른 용어는 "concrete syntax tree"이기 때문에 그것들은 확실히 동일하지 않습니다.
이 정확한 질문을 해결하려는 이 페이지 를 찾았습니다 .
Martin Fowler 의 DSL 책 은 이것을 잘 설명합니다. AST에는 추가 처리에 사용될 모든 '유용한'요소 만 포함되어 있으며 구문 분석 트리에는 구문 분석 한 원본 문서의 모든 아티팩트 (공백, 대괄호 등)가 포함됩니다.