문제

며칠 전,저는 읽 블로그 항목(http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx)저자는 논의 아이디어의 일반적인 자연적인 언어 DSL 파서 사용합니다.NET.

화려한 부분의 자신의 아이디어 제 생각에는 텍스트가 구문과 일치에 대한 클래스를 사용하는 같은 이름의 문장입니다.

을 복용 예를 들어,다음과 같은 라인:

Create user user1 with email test@email.com 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

을 얻을 것으로 변환을 사용하여 컬렉션의"알려진"체,그 결과의 분석.몇 가지 예를 들어 개체의 것(Java 를 사용하여 예):

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;
    }
}

그래서 처리할 때 첫 번째 문장,인증 클래스 경기(분명하기 때문에 그것의 연결을 만들기"사용자")와 이후,그것은 매개변수에서 생성자를 파는 것을"user1"으로 사용자 매개 변수입니다.

그 후,파서는 것이 식별되는 다음 부분은"이메일"에도 일치 메서드 이름이며,그 이후 방법을 매개 변수를,그것은 분석"test@email.com"으로 이메일을 매개 변수입니다.

나는 당신은 아이디어를 얻으로,지금 옳은가?하나의 아주 분명 응용 프로그램의 것,적어도 나를 위해,도로 테스터를 만들"스크립트 테스트에서"자연적인 언어로 다음 문장을 분석합 클래스로 사용하는 JUnit 을 확인한 동작을 지원합니다.

내가 듣고 싶은 아이디어 끝에 도구 또는 리소스할 수 있는 코드 같은 파서 Java 를 사용하여.더 나은 아직 우리가 할 수 있는 경우에 사용하지 않는 복잡한 lexers,또는 프레임워크는 다음과 같 ANTLR,라고 생각하는 어쩌면 사용하는 것 망치를 죽이 있습니다.

더보다는,사람을 시작하는 오픈 소스 프로젝트를 위해,나는 확실히 관심이 있습니다.

도움이 되었습니까?

해결책

렉싱과 구문 분석의 복잡성을 고려할 때, 나는 모든 것을 손으로 코딩하고 싶은지 모르겠습니다. antlr 픽업하기가 어렵지 않으며 문제를 바탕으로 걱정하고 있다고 생각합니다. 구문 분석 문법을 사용하여 입력에서 구문 트리를 구축하고 추상화하는 경우 트리 문법으로 AST를 처리하기가 매우 쉽습니다. 트리 문법은 설명한 과정을 쉽게 실행할 수 있습니다.

일식, 그루비 및 성배를 포함하여 많은 곳에서 antlr을 찾을 수 있습니다. 결정적인 antlr 참조 심지어 기본의 속도를 상당히 빠르게 속도에 맞추는 것이 상당히 간단하게 만듭니다.

올해 초 사용자 생성 쿼리 텍스트를 처리 해야하는 프로젝트가있었습니다. 나는 수동으로 처리하는 길을 시작했지만 빠르게 압도적이되었습니다. 나는 Antlr의 속도를 높이는 데 며칠이 걸렸고 며칠 안에 문법과 프로세서의 초기 버전을 실행했습니다. 이후의 변경 및 요구 사항에 대한 조정은 모든 사용자 정의 버전이 끊어졌지만 Antlr 문법을 실행하고 실행 한 후에는 조정하기위한 비교적 적은 노력이 필요했습니다.

행운을 빕니다!

다른 팁

를 호출하는 경우에는"자연적인 언어는"당신이 속이고 자신입니다.그것은 여전히 프로그래밍 언어,그냥 하는 것을 모방하려고 자연적인 언어와 생각하는 것이 실패하면 당신이 얻을 구현하세요.을 만들기 위해서는 명백한,당신을 넣어야에 대한 제한 구문을 혼란스럽게 할 것이다 사용자도 생각하는 그들은 쓰기"영어".

의 장점 DSL(또는 해야,어떤 속도)는 그것은 간단하고 명확한 강력에 관한 문제는 도메인입니다.을 흉내내는 자연적인 언어를 보조 우려하고 있습니다 사실적을 기본 목표입니다.

만약 누군가가 너무 바보거나 수있는 능력이 부족한 공식적으로는 엄격한 사고하는 데 필요한 프로그래밍을 위한 다음,프로그래밍 언어 mimicks 자연적인 중 하나이지 않는 마술로 만들어 놓을 프로그래머입니다.

때 COBOL 발명되었다,어떤 사람들은 심각하게 믿는 10 년 이내에있을 것입 제로 수요에 대한 전문적인 프로그래머,이후 COBOL 었다"좋아요"영어,누구나 필요한 소프트웨어 쓸 수 있는 그것을 자신을합니다.그리고 우리 모두는 방법을 알고는 있었습니다.

고려하고 싶을 수도 있습니다 xtext, 내부적으로 Antlr을 사용하고 DSL의 편집기를 자동 생성하는 것과 같은 좋은 일을합니다.

DSL에 대해 처음 들었을 때 Intellj Idea의 제작자 인 Jetbrains 출신이었습니다.

그들은이 도구를 가지고 있습니다. MPS (메타 프로그래밍 시스템)

ANTLR을 사용하는 데 사용했던이 멀티 파트 블로그 시리즈는 출발점으로 유용하다는 것을 알 수 있습니다. antlr 2를 사용하므로 일부 항목은 Antlr 3에 대해 다릅니다.

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

Antlr에 대한 Mark Volkman의 프레젠테이션/기사도 매우 도움이됩니다.

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

나는 결정적인 Antlr 책에 대한 제안을 둘째, 이는 또한 우수하다.

"적어도 나에게 적어도 적용하는 것은 응용 프로그램 테스터가 자연 언어로"스크립트 테스트 "를 만들고 Junit을 사용하여 앱 동작을 확인하는 클래스로 문장을 구문 분석 할 수 있도록하는 것입니다.

여기서 말하는 것은 도구 인 피트니스와 똑같이 들립니다. 정확히 당신이 설명하는 것처럼, 고객은 Makese가 그들에게 의미하는 어떤 종류의 언어로 "스크립트"를 작성하고 프로그래머는 테스트를 통과하는 시스템을 구축합니다. 당신이 이야기하는 구현조차도 피트니스가 작동하는 방식과 거의 정확히 일치합니다. 스크립트에 사용 된 어휘는 기능 이름 등을 형성하기 위해 연결되어 피트니스 프레임 워크가 어떤 기능을 호출 해야하는지 알고 있습니다.

어쨌든, 그것을 확인하십시오 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top