IntelliJ+ANTLR(+kotlin) 개발 환경 보완

5157 단어 antlrKotlin
kotlin에서 사용할 수 있는 템플릿 엔진을 만드는 절차를 조사했는데 ANTLR에 도달했기 때문에 제작 개발 환경의 과정을 간단하게 정리했다.

개요


호스트 언어에서 크게 벗어난 문법을 지원하고 싶다면, 해상도를 만들어야 한다.
JVM에서 실행되는 분석기 생성기 몇 개를 찾아봤는데 몇 개의 후보가 있지만 ANTLR이 가장 신뢰할 만한 것 같습니다.ANTLR의 특징은 다음과 같습니다.
  • LL(*)의 구문 분석(자세히 알지 못함)
  • 자바 이외에 c#,python,js 등 코드 생성
  • gradle 플러그인 및 IntelliJ 플러그인
  • 느린 실행 속도
  • 커뮤니티가 넓고 Github에 참고할 수 있는 소스 코드가 충분합니다
  • 동작 속도에 신경을 쓰지만 템플릿 엔진의 개발이 잘 안 되고 부분이 많아서 ANTLR이 이동을 만드는 데 가장 적합하다고 생각합니다.

    항목 만들기


    IntelliJ에서 새 Gradle 프로젝트를 만듭니다.

    build.gradle 편집


    build.다음 차이점을 gradle에 추가합니다.mainClassName는 응용 프로그램 플러그인의 입구점을 지정하는 속성입니다.kotlin을 대상으로 할 때 파일 이름의 끝에 Kt 를 추가합니다.
    group 'com.kazy'
    version '1.0-SNAPSHOT'
    
    buildscript {
        ext.kotlin_version = '1.0.3'
    
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'kotlin'
    + apply plugin: 'application'
    + apply plugin: 'antlr'
    
    repositories {
        mavenCentral()
    }
    
    + mainClassName = "com.kazy.MainKt"
    
    dependencies {
    +    antlr 'org.antlr:antlr4:4.5.3'
    +    compile "org.antlr:antlr4-runtime:4.5.3"
        compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        testCompile group: 'junit', name: 'junit', version: '4.11'
    }
    

    구문 정의 파일에서 해상도 생성


    환경을 만드는 것이 목적이기 때문에 문법 정의가 이용getting-started하는 것이다.
    소개된 문법 정의를 직접 사용하면 자바 코드를 생성할 때 패키지를 지정하지 않아 불편하다@header. 그래서 패키지 이름을 사용합니다.작성된 구문 정의 파일은 src>antlr 아래에 지정된 패키지와 같은 이름의 디렉터리 차원 구조를 만들고 배치합니다.
    // Define a grammar called Hello
    grammar Hello;
    @header {
        package your.package.name.generated;
    }
    r  : 'hello' ID ;         // match keyword hello followed by an identifier
    ID : [a-z]+ ;             // match lower-case identifiers
    WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
    

    여기까지 준비가 되면 자동으로 코드가 생성됩니다.
    프로젝트 디렉터리./gradlew generateGrammarSouce 또는 메뉴 모음View>Windows>Gradle에서 메뉴를 꺼내서other 작업 내generateGrammarSouce를 수행할 때build>generated-src>antlr 다음은 자동으로 해상도 코드를 생성합니다.

    생성된 해상도 실행


    입구점을 만들어 생성된 코드를 실행해 보세요.mainClassName = "com.kazy.MainKt"일 경우,kotlin 디렉터리 아래에 com.kazy.Main.kt라는 파일을 만듭니다.main의 실현은 다음과 같다.
    fun main(args: Array<String>) {
        val text = "hello world"
        val source = ANTLRInputStream(text)
        val lexer = HelloLexer(source)
        val tokenStream = CommonTokenStream(lexer)
        val parser = HelloParser(tokenStream)
        parser.r()
    }
    
    이 상태./gradlew run 또는 GUI에서 Main.kt를 오른쪽 단추로 눌러서 정상적으로 실행하고 끝날 때 동작이 정상적입니다.성공해도 아무것도 보이지 않아 재미가 부족하지만 텍스트를'Hello world'로 설정하면 Tokenizer가 인기가 많다는 것을 확인할 수 있다고 생각합니다.

    끝내다


    이곳에 와서 환경을 정리하는 데 한나절이 걸렸다.
    ANTLR의 커뮤니티는 커 보이지만 일본어 보도가 많지 않기 때문에 계속 개발할 수 있다면 조금씩 지식을 투고할 것이다.

    좋은 웹페이지 즐겨찾기