2010-10-05 3 views
8

프로그래밍 언어에 대한 통역사를 직접 작성하는 것에 대해 배우고 있으며 추상 구문 트리에 대해 읽었습니다. 나는 그들이 무엇인지에 대한 아이디어를 가지고 있지만, 나는 그들의 사용법을 보지 못한다.추상 구문 트리의 용도는 무엇입니까?

왜 AST가 유용합니까?

+0

AST가 없으면 어떻게 언어 구문을 모델링 할 계획입니까? 파서/컴파일러/인터프리터/등을 쓸 때. –

답변

4

그들은 코드의 논리/구문을 나타내며, 구체적으로는 place your asterisk과 같은 구체적인 구문 문제에 빠지지 않고 자연스럽게 선 목록이 아닌 트리입니다.

그런 다음 로직을 구체적인 구문을 작성하는 방법과 매우 다른 백엔드의 POV (더 나아가서는 Lisps 제외)에서보다 일관되고 편리하게 조작 할 수 있습니다.

+0

그런데 왜 "IDENTIFIER blah ASTERISK NUMBER 4"와 같은 자료를 만드는 대신 ASM을 사용하고 FSM 등을 사용하면 한 번에 하나의 토큰 만 먹을 수 있습니까? – RacecaR

+2

@Rac : 설명하는 것은 원시 파일과 AST 생성 사이의 단계입니다. 즉, 원시 -> 토큰 -> AST입니다. BinaryOp (곱하기, 식별자 ("blah"), 정수 (4))는 백엔드에서 더 편리합니다. –

+0

@RacecaR 구문 분석을위한 FSM이 스트림을 먹어서 AST를 생성합니다. 코드 생성 및 최적화 (optimization) 루틴은 AST를 사용합니다 –

0

일반적으로 코드를 구문 분석하여 AST의 일부 형식으로 만들 것입니다. 공식적인 모델 일 수 있습니다. 그래서 Kirk Woll이 위의 주석에서 얻은 바는, 언어를 구문 분석 할 때 파서를 사용하여 독서중인 내용의 원시 내용에 대한 데이터 모델을 일반적으로 트리 형식으로 작성한다는 것입니다 . 따라서 AST는 매우 단순한 번역자가 아니라면 피하기가 어렵습니다.

복잡한 언어를 구문 분석하기 위해 ANTLR을 자주 사용하며 그 문맥에서 AST의 약간 더 구체적인 의미가 있습니다. ANTLR은 아주 간단한 작업을 사용하여 구문 분석기 문법에 AST를 생성하는 편리한 방법을 제공합니다. 그런 다음이 AST에 대해 훨씬 더 간단한 구문 분석기를 작성합니다.이 구문 분석기는 훨씬 간단한 버전의 언어처럼 처리 할 수 ​​있습니다. 두 구문 분석기를 작성하는 추가 작업이 순 이득인지 여부는 언어 복잡성의 함수이며 구문 분석을 수행하고 나면이를 수행 할 계획입니다.

주목할만한 주제에 관한 훌륭한 책은 ANTLR 작성자 인 Terrence Parr의 "언어 구현 패턴"입니다. 그는이 주제를 아주 철저하게 다룹니다. 즉, 사용하기 전까지는 실제로 AST를 얻지 못했기 때문에 (보통 때처럼) 이해하는 가장 좋은 방법입니다.

4

AST를 사용하는 주된 이점은 구문 분석 및 유효성 검사 논리를 구현 조각과 분리한다는 것입니다. AST로 구현 된 통역사는 실제로 이해하고 유지하기가 쉽습니다. 이상한 구문을 파싱하는 데 문제가 있다면 AST 파서를 살펴 봅니다. AST를 해석하는 코드보다 예상 결과가 나오지 않으면 코드 파편이 나타납니다.

다른 큰 이점은 구문에 "lookahead"가 필요한 경우입니다. 구문이 정의되기 전에 서브 루틴을 사용할 수 있도록 허용하는 경우 AST를 사용할 때 서브 루틴의 존재를 확인하는 것이 쉽습니다. 즉석에서 파서를 사용하는 것이 훨씬 어렵습니다.

+0

감사합니다. 나는 방금 AST를 만드는 것이 단순한 언어에 비해 가치있는 것보다 번거롭다고 주장하면서 Java로 건물 파서를 연구하고 있습니다. 이 페이지의 유일한 의견은 AST를 구축하지 않고 유용한 것을 할 수 있음을 인정하는 것입니다. – kybernetikos

1

프로그래밍 언어 텍스트가 포함 된 문서를 분석하거나 변환하기 위해 대부분의 프로그래밍 언어의 구조를 나타내는 "구문 트리"가 필요합니다. (당신은 나의 바이오를 통해 이것의 멋진 예를 볼 수있다).

트리가 추상 (AST) 또는 콘크리트 (CST)인지 여부는 맛, 편의성 및 엔지니어링 땀의 문제입니다. 용어 CST는 문법이 소스 코드를 분해하는 데 사용되는 경우 구문 분석 파생 트리를 설명하는 데 특히 사용됩니다. 명령문 종결 자 세미콜론과 같은 많은 구체적인 구문을위한 트리 요소가 포함되어 있습니다. AST는 "CST보다 단순한 것"을 의미하는 데 사용됩니다. 예를 들어 프로그램 분석에 많은 영향을 미치지 않으므로 세미콜론 트리 노드를 두지 않으므로 AST를 처리하는 분석기 작성은 분석기를 중부 표준시. 이것을 이해하는 더 좋은 방법은 대서양 표준시가 대개 중부 표준시와 동등한 것임을 인식하는 것입니다. 즉, 대서양 표준시에서 중부 표준시를 다시 생성 할 수 있어야합니다. 소스 텍스트로 변환하고 다시 생성하려면 원 프로그램에서 정보를 덜 잃어 버리기 때문에 CST가 더 나은 선택이 될 수 있습니다.

저는 abstract vs. concrete syntax trees에 대한 SO 토론이 도움이된다고 생각합니다.