2008-09-27 4 views
13

며칠 전, 저자가 .NET을 사용하는 일반적인 자연 언어 DSL 파서에 대한 아이디어를 토론하는 블로그 항목 (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx)을 읽었습니다.Java에서 자연 DSL을 만드는 가장 좋은 도구는 무엇입니까?

필자 생각으로는 텍스트가 구문 분석되고 문장과 동일한 이름을 사용하는 클래스와 일치한다는 것이 그의 아이디어의 가장 훌륭한 부분입니다.

다음 줄, 예를 들어 촬영 :

 
Create user user1 with email [email protected] and password test 
Log user1 in 
Take user1 to category t-shirts 
Make user1 add item Flower T-Shirt to cart 
Take user1 to checkout 

구문 분석의 결과를한다 "알려진"개체의 컬렉션을 사용하여 변환 얻을 것입니다. 일부 예를 들어 객체는 (내 예를 들어 자바를 사용) 것입니다 : 첫 번째 문장을 처리 할 때

public class CreateUser { 
    private final String user; 
    private String email; 
    private String password; 

    public CreateUser(String user) { 
    this.user = user; 
    } 

    public void withEmail(String email) { 
    this.email = email; 
    } 

    public String andPassword(String password) { 
     this.password = password; 
    } 
} 

그래서, createuser가 클래스가 있기 때문에, (이 "사용자를 만듭니다"의 연결이야 분명하기 때문에) 일치하고 것 생성자에서 매개 변수를 사용하면 파서는 "user1"을 user 매개 변수로 사용합니다.

그 후 파서는 다음 부분 인 "with email"도 메소드 이름과 일치한다는 것을 식별하고 해당 메소드가 매개 변수를 취하므로 "[email protected]"을 email 매개 변수로 구문 분석합니다.

지금 생각해보십시오. 최소한 저에게는 분명히 응용 프로그램 테스터가 자연어로 "테스트 스크립트"를 만든 다음 JUnit을 사용하여 응용 프로그램 동작을 확인하는 클래스로 문장을 구문 분석 할 수 있습니다.

Java를 사용하여 파서를 코딩 할 수있는 도구 또는 리소스에 대한 아이디어, 팁 및 의견을 듣고 싶습니다. 우리가 복잡한 lexer 나 ANTLR과 같은 프레임 워크를 사용하는 것을 피할 수 있다면, 아마도 나는 파리를 죽이기 위해 망치를 사용할 것입니다.

누군가가 오픈 소스 프로젝트를 시작한다면, 나는 분명히 관심을 가질 것이다.

+0

Glurk의 대답과 비슷합니다. 따라서 주석으로 : 실행 가능한 "자연스러운"언어 사양을 찾으려면 Cucumber (http://cukes.info/)를 시도해야합니다. JRuby (및 RSpec)와 함께 Java 기반 BDD (http://behaviour-driven.org/)에 사용할 수 있습니다. 대안으로는 EasyB 및 JBehave가 있습니다. –

+0

DSL이란 무엇입니까? 비슷한 언어의 모호성 제거입니까? corporavm.uni-koeln.de/vardial/sharedtask.html을 참조하십시오. – alvas

답변

22

렉싱 및 구문 분석의 복잡성을 고려해 볼 때 필자가 모든 것을 손으로 코딩하고 싶지는 모르겠다. ANTLR는 픽업하기가 그리 어렵지 않으며 문제를 기반으로 조사 할 가치가 있다고 생각합니다. 구문 분석 문법을 사용하여 입력에서 구문 트리를 작성하고 추상화하면 트리 문법으로 AST를 처리하기가 매우 쉽습니다. 트리 문법은 설명 된 프로세스 실행을 쉽게 처리 할 수 ​​있습니다.

Eclipse, Groovy 및 Grails를 비롯한 여러 곳에서 ANTLR을 시작할 수 있습니다. The Definitive ANTLR Reference도 기본 속도를 상당히 빠르게 향상시킬 수 있습니다.

올해 초 사용자 생성 쿼리 텍스트를 처리해야하는 프로젝트가있었습니다. 나는 그것을 수동으로 처리하기위한 경로를 시작했지만, 그것은 빠르게 압도적으로되었다. ANTLR에서 속도를 높이기 위해 며칠이 걸렸으며 며칠 만에 문법과 프로세서의 초기 버전을 실행했습니다. 이후 요구 사항을 변경하고 조정하면 모든 사용자 정의 버전이 삭제되었지만 ANTLR 문법을 설정하고 실행하면 조정하기가 상대적으로 거의 필요하지 않았습니다.

행운을 빈다.

+0

조, 감사합니다. 그 책을 내 장바구니에 아마존에 몇 번 추가했습니다. 등록 된 파서를 기반으로 동적 문법 트리를 쉽게 만들 수 있다고 생각합니까? 라이브러리는 리플렉션을 사용하여 클래스 이름, 메소드 (...)를 추출하고 ANTLR에 대한 문법 트리를 작성해야합니다. 맞습니까? – kolrie

+0

문법에 Java (또는 다른 ANTLR이 다양한 언어를 생성 할 수 있음)를 직접 삽입 할 수 있습니다. 하나의 문법을 사용하여 DSL을 파싱하고 두 번째 문법을 사용하여 AST 트리를 걸어 노드를 처리했습니다. 이 모든 것이 앱에서 실행되기 때문에 쉽게 객체를 만들고 메소드를 호출 할 수 있습니다. –

+2

어휘/파서/컴파일 과정을 전혀 거치지 않은 채로 ANTLR을 감싸는 데 며칠이 걸렸습니다. 앞으로도 계속 유용 할 것이므로 매우 기쁩니다. Parr은 ANTLR을 썼습니다. 그래서이 책은 렉싱 (lexing)과 파싱 (parsing)에 대한 훌륭한 자료이자 잘 작성된 소개입니다. –

9

Xtext은 내부적으로 ANTLR을 사용하며 DSL 용 편집기를 자동 생성하는 것과 같은 멋진 작업을 수행합니다.

1

Antlr을 사용하여 여러 부분으로 구성된이 시리즈를 처음부터 유용하게 사용할 수 있습니다. 그것은 ANTLR이 사용하기 때문에 몇 가지 물건은 ANTLR 3 다를 수 :

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

마크 볼크 먼의 프리젠 테이션/ANTLR에 대한 기사는 매우 도움이뿐만 아니라 다음과 같습니다

http://www.ociweb.com/mark/programming/ANTLR3.html

나는 것 두 번째 확실한 ANTLR 책에 대한 제안.

4

처음으로 DSL에 대해 들었을 때, Jetbrains에서 IntellJ Idea를 만들었습니다.

그들은이 도구를 가지고 : MPS (Meta Programming System)

+0

DLS가 아니라 DSL을 사용하셨습니까? – dzieciou

+0

당신을 위해 그것을 고정. – cod3monk3y

0

자연 언어에서 "스크립트를 테스트 한 후 사용하는 클래스로 문장을 구문 분석"그 중 하나는 매우 명확 응용 프로그램, 적어도 나를 위해, 응용 프로그램 테스터를 만들 수 있도록하는 것 " 앱 동작을 확인하는 JUnit "

여기서 말하는 내용은 도구 FitNesse와 정확하게 같습니다. 당신이 묘사하는대로 클라이언트는 받아 들일 테스트 "스크립트"를 그들에게 의미있는 어떤 종류의 언어로 작성하고, 프로그래머는 테스트를 통과시키는 시스템을 만듭니다. 여러분이 이야기하는 구현조차도 FitNesse의 작동 방식과 거의 비슷합니다. 스크립트에 사용 된 어휘를 연결하여 함수 이름 등을 구성하므로 FitNesse 프레임 워크는 호출 할 함수를 알고 있습니다. 당신이 "자연 언어", 당신이 자신을 속이고 있다는 것을 호출하는 경우

어쨌든, :)

10

을 확인해. 그것은 여전히 ​​프로그래밍 언어입니다. 자연어를 모방하려고 시도하는 언어입니다. 구현 세부 사항에 들어가면 실패 할 것으로 생각됩니다. 모호하지 않게하기 위해서는 "영어"를 쓰고 있다고 생각하게 만든 사용자를 혼란스럽게하는 구문에 제한을 두어야합니다.

DSL의 장점은 간단하고 명확하지만 문제 영역과 관련하여 강력하다는 것입니다. 자연어를 모방하는 것이 이차적 인 관심사이며 실제로 이러한 주요 목표에 반하는 결과를 가져올 수 있습니다.

누군가가 너무 어리 석거나 프로그래밍에 필요한 형식적으로 엄격한 사고 능력이 부족하다면 자연 언어를 모방 한 프로그래밍 언어로 마술처럼 프로그래머가 될 수 있습니다.

COBOL이 발명되었을 때 사람들은 COBOL이 "영어와 같았으므로"전문 프로그래머에 대한 요구가 10 년 이내에있을 것이라고 진지하게 믿었습니다. 소프트웨어가 필요한 사람은 누구나 직접 작성할 수 있습니다. 그리고 우리는 그것이 어떻게 진행되고 있는지 알고 있습니다.

+1

+1, 그래, 회사들이 실제로 COBOL을 포기하고 있다는 것을 알게되었습니다. 왜 값 비싼 프로그래머를 고용 할 때 저렴한 영어를 사용하는 사람들이 많이 있습니까? –

관련 문제