2010-02-04 6 views
18

나는 꽤 복잡한 DSL을 몇 가지 고수준 언어로 컴파일하려고합니다. 전체 과정은 학습 경험이었습니다. 컴파일러는 java로 작성됩니다.AST에서 코드를 생성하기위한 최상의 설계?

누군가 코드 생성기 부분의 설계에 대한 모범 사례를 알고 있는지 궁금합니다. 나는 현재 모든 것을 추상 구문 트리로 파싱했다.

템플릿 시스템을 사용하려고 생각했지만 스택 오버플로에서 처음으로 지혜를 듣고 싶습니다. 아직 방향을 너무 연구하지 않았습니다.

감사합니다.

+1

오래 전에 물어 본 것일 수도 있습니다. 하지만 오늘 (2013) 현재, ANTLR (사용중인 것으로 보입니다)에는 "문자열 템플릿"이 내장되어 있습니다. –

답변

8

프로그래밍 언어 클래스에서이 작업을 수행 할 때 Visitor 패턴을 기반으로 에미 터를 사용했습니다. 그것은 꽤 잘 작동했습니다 - 당신의 AST가 당신이 꽤 잘 인쇄하고있는 것과 일치하는 한 새로운 출력 언어로 그것을 재 타겟팅하는 것을 아주 쉽게 만듭니다.

+0

아이디어를 제공해 주셔서 감사합니다. Visitor 패턴에 익숙합니다. 트리에서 리터럴 식을 최적화하는 데 사용합니다. –

+0

당신이 익숙하지 않다고 주장하지 않고 단지 좋은 코드 생성기를 만드는 결과를 초래할 수도 있다고 제안합니다 .-) –

+0

그래, 나는 그 소리를 내야한다는 말은 아니 었습니다. 나는 지금 그것에 대해 고마워한다. 고마워. :) –

-1

DSL은 좋은 점입니다. 그리고 그것들을 쓰는 것은 좋은 습관입니다.

하지만 재미 나 교육을위한 것이 아니면 2010 년 자신 만의 YACC를 구현하는 것이 좋은 선택인지 확신 할 수 없습니다.

교육 과정을 마치고 DSL을 구현하는 좋은 방법을 찾기 시작할 때 동적 언어 사용을 고려할 수 있습니다.

예를 들어 Groovy을 사용하면 작고 큰 DSL을 매우 쉽고 즐겁게 구현할 수 있습니다.
BTW Groovy에는 AST 조작 API가 내장되어 있습니다.

+0

나는 당신이 오해했을 수도 있다고 생각합니다. AST를 생성하기 위해 이미 파서 생성기를 사용하고 있습니다. ANTLR3을 사용하고 있으며 트리를 만들었습니다. 나는 그 트리를 다른 고수준 언어의 코드로 되돌릴 최선의 방법을 찾고있다. 감사. –

6

정말로 원하는 것은입니다. 한 언어 (DSL)의 구문 구조를 다른 언어의 구문 패턴에 매핑합니다. 이러한 도구는 코드 생성 프로젝트 중에 임의의 변형 (트리 - 재 작성 일반화 문자열 재 작성, 전체 Turing 가능 포스트 시스템)을 수행 할 수 있습니다. 이는 생성 프로세스와 생성 프로세스가 야망에 의해서만 결정되는 방법을 의미합니다. "코드 생성기 프레임 워크"속성이 아닙니다.

정교한 프로그램 변환 시스템은 다양한 유형의 스코핑, 흐름 분석 및/또는 사용자 정의 분석기를 결합하여 변환을 가능하게합니다. 이것은 이론적 인 힘을 추가하지는 않지만 실용적인 힘을 많이 추가합니다. 대부분의 실제 언어 (심지어 DSL도)는 네임 스페이스, 제어 및 데이터 흐름, 유형 유추 등을 필요로합니다.

DMS Software Reengineering Toolkit이이 유형입니다. 변환 시스템의. 그것은 종래의 언어와 DSL, 단순하고 복잡한 언어, 크고 크고 거대한 소프트웨어 시스템을 분석/변형시키는 데 사용되어 왔습니다.

OP로 인한 의견과 관련하여 "turning the AST into other languages", that is accomplished by DMS by writing transformations that map surface syntax for the DSL (implemented behind the scenes his DSL's AST) to surface syntax for the target language (대상 언어 AST를 사용하여 구현 됨). 결과 타겟 언어 AST는 대상 언어의 실제 소스 코드를 제공하기 위해 대상 AST에 해당하는 DMS에 의해 자동으로 미리 인쇄됩니다.

3

이미 ANTLR을 사용하고 준비하여 AST이있는 경우 당신은 StringTemplate에서 살펴 봐야 할 수 있습니다 : http://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

또한 제 9 조.확실한 ANTLR 참조 6 : 건물 도메인 특정 언어이 설명 : http://www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

무료 코드 샘플은 http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgz에서 사용할 수 있습니다. 하위 폴더 코드 \ templates \ generator \ 2pass \에서 수학 표현식을 자바 바이트 코드로 변환하는 예제를 찾을 수 있습니다.

관련 문제