6

보통 외부의 Scala 컴파일러와 상호 작용하는 방법이 "소스를 컴파일하기 위해 명령 줄에서 호출"할 수 있는지 궁금합니다.스칼라 코드 자체에서 컴파일러와 상호 작용하는 방법은 무엇입니까?

코드를 구문 분석하거나, 추상 구문 트리를 작성하거나, 라이브러리를 사용하여 런타임에 코드를 컴파일 할 수 있습니까?

+0

[라이브 스칼라 코드에서 AST를 얻을 수 있습니까?] (http://stackoverflow.com/questions/1962925/can-i-get-ast-from-live-scala-code) –

답변

2

얼마전에 나는 (지금은 부끄러운) scala.tools.nsc.Interpreter 클래스를 사용하여 수정하고로드했습니다. - 런타임에 스칼라 코드를 해석합니다. 자신과 해석 된 코드간에 값을 교환하려면 bind 메소드를 살펴보십시오. 또한 compileSourcescompileString 메서드가 있지만 지금까지는 그 중 하나를 사용하지 않았습니다. 또한 나는 AST를 얻기 위해 이것 (또는 다른 것)을 사용하는 방법에 대해서는 아무것도 모른다.

참조 : What is the purpose of the scala.tools.nsc package?nsc package scaladoc.

업데이트 : 이것은 AST의 질문에 대답해야한다 (2009 년, 오래된 것일 수) : Scala AST in Scala

1

내가 과거에 이런 짓을했는지에 의해, 그리고, 더 중요한 것은 명령 줄 인수를 구문 분석하는 새로운 CompilerCommand 인스턴스를 생성하여 영원 무서운 Global 클래스를 확장합니다.

computeInternalPhases 메서드를 재정 의하여 컴파일러의 일부 단계 (예 : 최대 refchecks)를 사용하여 파서/유형 검사기로만 사용하고 예상 한대로 자신의 단계 (플러그인)를 추가 할 수 있습니다 . 물론 클래스 파일을 생성 할 수 있습니다.

그렇습니다. 확실히 가능합니다. 결국 컴파일러 자체도 JVM에서 실행됩니다.