2011-12-12 4 views
7

Java 소스 코드의 두 가지 추상 구문 트리를 비교할 수있는 오픈 소스 Java API가 있습니까?AST를 비교하는 API는 무엇입니까?

diff 도구에서 수행되는 것과 유사한 두 구문 트리 간의 차이점을보고 싶습니다. 이 작업을 수행 할 수 있습니다 어딘가에 ANTLR 확장이있는 경우

답변

6

대부분은 diff 도구를 사용하지 구문 나무 (Wikipedia article for discussion 참조), 라인을 비교 .... 궁금합니다.

구문 트리 작업을 수행하는 방법에 대해 이야기 몇 가지 techical 논문이 있습니다 어디서나 내가 아는 가능한 트리의 차이를 계산하기위한 API를이 없습니다 Diff/TS: A Tool for Fine-Grained Structural Change Analysis

, 예를 들어 비교합니다. 최소한의 diff를 원한다면 문제는 처음 소리보다 복잡합니다. 그러나 기본 기술은 Levenstein distance metrics의 변형을 사용하는 것입니다.

우리는 SmartDifferencers 라인을 위해 우리 자신을 굴려야했습니다. 다행스럽게도 우리는 정확한 AST를 생성하기 위해 많은 언어 학자들이 정말 좋은 프론트 엔드를 가지고 있습니다.

AST가 무엇인지, 깨진 파일을 비교하고 싶거나, 문법이 일치하지 않는 언어 방언을 비교하거나, 코드를 사용하고 싶지만, 비교를 원하는 사람들과 같이 더 많은 사람들이 놀라움을 금치 못합니다 다른 언어의 삽입을 포함하고 있습니다. 라인별로 diff를하면 이러한 문제가 발생하지 않습니다. 이는 line-diff가 광범위하고 tree-diff가 아닌 이유 중 하나입니다.

2
+2

그것은 AS를 쉽게 얻을 수있다 : https://bitbucket.org/sealuzh/tools-changedistiller/wiki/Home

CodingSpectator (AST의 diffing의 코드의 나머지 부분에서 하드 코드) 소스 파일의 T, 그들 사이의 유사점을 찾는 또 다른 이야기입니다 :). stackoverflow에있는 로컬 파싱 전문가의 [Ira Baxter] (http://stackoverflow.com/users/120163/ira-baxter)는 [Google Tech Talk] (http://www.youtube. .com/watch? v = C-_dw9iEzhA) 여기서 그는 자신의 소프트웨어가이를 수행한다고 언급합니다. –

+0

매우 사실입니다 - 그것은 당신이 '비교'한다는 의미에 달려 있습니다. 어쩌면 정의하는 것이 더 나을 것입니다. AST가 사용하는 것이 가장 좋지 않을 수도 있습니다. –

6

예, 출력 트리 차이점 것을 무료로 구현이 있습니다 :

출처 : 인크루트 (빠른 멀티 languague는, 자식과 통합은) : http://www.labri.fr/perso/falleri/perso/tools/gumtree/ https://github.com/jrfaller/gumtree

ChangeDistiller (매우 성숙, 자기 포함 된 라이브러리로 구축) : https://github.com/vazexqi/CodingSpectator/tree/codingtracker-ast-inference

+0

https://github.com/SpoonLabs/gumtree-spoon-ast-diff도 참조하십시오. –

관련 문제