파스 트리와 AST의 차이점은 무엇입니까?


94

컴파일 프로세스의 여러 단계에서 생성됩니까? 아니면 같은 것에 대해 다른 이름입니까?


구문 분석 트리는 아티팩트가 포함 된 문법의 결과이며 (동일한 언어에 대해 무한한 문법을 ​​작성할 수 있음) AST는 구문 분석 트리를 언어에 가능한 가장 가깝게 줄입니다. 동일한 언어에 대한 여러 문법은 다른 구문 분석 트리를 제공하지만 결과는 동일한 AST 여야합니다. (여러 스크립트 (동일한 문법의 다른 구문 분석 트리)를 동일한 AST로 줄일 수도 있습니다)
Guillaume86

1
이 SO 답변은 dfference에 대해 자세히 설명합니다. stackoverflow.com/a/1916687/120163
Ira Baxter

답변:


98

이것은 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에는 괄호가 없습니다.

AST

자세한 설명은 컴파일러 및 컴파일러 생성기 페이지를 참조하십시오 . 23
또는 추상 구문 나무 페이지에. 21 프로그래밍 언어의 구문 및 의미론


5
구문 분석 트리에서 AST를 어떻게 유도합니까? 구문 분석 트리를 AST로 단순화하는 방법은 무엇입니까?
CMCDragonkai

3
구문 분석 트리에서 AST를 파생시키는 특정 알고리즘은 없습니다. AST에 들어가는 것은 개인적인 선호에 가깝지만 작업을 수행하기에 충분한 정보를 포함해야합니다. ANTLR을 사용하여 AST에서 괄호를 제외했습니다 ! 연산자 는 필요하지 않기 때문에 문법에 있지만 기본적으로 ANTLR에 포함되었을 것입니다. 저는 구문 분석 트리가 필요 여부에 관계없이 모든 것을 제공하는 것으로 생각하고 AST는 최소한의 것을 제공하는 것으로 생각합니다. 나무를 많이 횡단하므로 크기가 중요합니다.
Guy Coder

2
CST (구체적 구문 트리) 대 AST (추상 구문 트리)를 의미합니까?
CMCDragonkai

구문 분석기 또는 구문 분석기 생성기의 구문 파일에 포함 된 의미 론적 작업 / 규칙은 의미 론적 분석 및 AST 생성의 일반적인 방법 인 반면, 구문 분석 트리는 파서 정확성 확인을 제외하고는 사용자 코드에 의해 생성되거나 사용되는 경우는 거의 없습니다.


16

내가 이해 한 바에 따르면 AST는 소스 코드 구성 요소 간의 추상적 인 관계에 더 중점을 두는 반면 구문 분석 트리는 간결한 세부 사항을 포함하여 언어가 사용하는 문법의 실제 구현에 중점을 둡니다. "parse tree"의 또 다른 용어는 "concrete syntax tree"이기 때문에 그것들은 확실히 동일하지 않습니다.

이 정확한 질문을 해결하려는 이 페이지 를 찾았습니다 .


11

Martin Fowler 의 DSL 책 은 이것을 잘 설명합니다. AST에는 추가 처리에 사용될 모든 '유용한'요소 만 포함되어 있으며 구문 분석 트리에는 구문 분석 한 원본 문서의 모든 아티팩트 (공백, 대괄호 등)가 포함됩니다.


4

파스칼 과제를 취하십시오. Age : = 42;

구문 트리는 소스 코드와 비슷합니다. 아래에서 노드 주위에 괄호를 두었습니다. [연령] [: =] [42] [;]

추상 트리는 다음과 같습니다. [=] [Age] [42]

할당은 Age와 42의 두 가지 요소가있는 노드가됩니다. 아이디어는 할당을 실행할 수 있다는 것입니다.

또한 파스칼 구문이 사라집니다. 따라서 둘 이상의 언어가 동일한 AST를 생성하도록 할 수 있습니다. 이것은 교차 언어 스크립트 엔진에 유용합니다.


1

구문 분석 트리에서 내부 노드는 터미널이 아니고 잎은 터미널입니다. 구문 트리에서 내부 노드는 연산자이고 잎은 피연산자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.