2016-09-19 12 views
1

SQL에서 XQuery로 변환기를 만들고 싶습니다.
SQL을 구문 분석하고 중간 구조를 생성 한 다음이를 사용하여 XQuery 쿼리를 생성하려고합니다.
(참고 - 앞으로 다른 쿼리 언어로 SQL을 변환하기를 기대하기 때문에 중간 표현을 사용하고 싶습니다.)
하지만 문법이 정의되면 번역기를 만드는 방법을 정확히 알지 못합니다. 나는 ANTLR을 사용하고 실제로 문법을 이미 만들고 싶다. 저는 문법 파일을 가지고 지금 당장 멈춰 있습니다. 번역기를 만드는 과정에서 다음 단계를 정확히 알지 못해서 말입니다.Translator using Antlr4

답변

2

이것은 원하는 작업과 원하는 언어에 따라 다릅니다. 이제 Antlr4에는 자바, 자바 스크립트 및 파이썬 런타임이 있습니다.

여러분 정말 ANTLR 또는 포함한 전체 자습서를 사용하여 진행 방법에 대한 ANTLR documentation을 읽어야

Java -jar yourgrammar.g4 
Java -jar -Dlanguage=Python2 yourgrammar.g4 
Java -jar -Dlanguage=Python3 yourgrammar.g4 

참고 :

그래서 당신은 그 출력 언어 중 하나로 문법를 컴파일 할 수 있습니다 terence parr에 의해 쓰여진 책.

그러나 일단 문법을 컴파일하고 나면 문법 요소가 발생할 때 어떤 결정을 내릴지 청취자 또는 방문자 메서드를 작성하여 번역기를 구성 할 수 있습니다. 기본적으로 "yourGrammarListener"라는 빈 리스너가 있습니다. 여기서 문법은 .g4 파일의 이름이고 끝에는 리스너가 추가됩니다. 이 파일에는 정의한 규칙에 대해 많은 공백 메소드가 있습니다.

대상으로 선택한 언어는이 파일을 확장해야하는지 또는 생성 된 리스너에 기능을 구현해야 하는지를 정의합니다.

프로젝트에 ANTLR 런타임이 필요한 응용 프로그램에 대한 링크가 프로젝트에 포함되어 있는지 확인한 후에 응용 프로그램을 실행할 수있는 방법을 모두 입력하면 기본값은 Java 런타임이며 가장 많이 사용되는 방법입니다 대개 이것은 ANTLR.jar 파일을 Java 프로젝트에 포함시키는 것을 의미합니다. 그래서 짧은에서

:

  1. 이 문법 쓰기
  2. 은 문법
  3. 어떤 청취자/방문자 방법을 기입 컴파일합니다.

    private void main(String[] args) { 
    // Get our lexer 
    yourGrammarLexer lexer = new yourGrammarLexer(new ANTLRInputStream(args[0])); 
    
    // Get a list of matched tokens 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    
    // Pass the tokens to the parser 
    yourGrammarParser parser = new yourGrammarParser(tokens); 
    
    // Specify our entry point 
    yourGrammarContext yourGrammarContext = yourGrammarRule.drinkSentence(); 
    
    // Walk it and attach our listener 
    ParseTreeWalker walker = new ParseTreeWalker(); 
    yourGrammarListener listener = new yourGrammarListener(); 
    walker.walk(listener, yourGrammarContext); 
    

    }

  4. : 자바 파일이나 중 대상 언어, 방문자/트리를 정의하고이 같은 인수에서 그것을 파일을 통과에서
  5. (언어에 따라, 파이썬 대안에 대한 설명서를 참조하십시오)

기본 응용 프로그램에서 입력 파일을 가져 와서 출력하려면 중간 형식에만 출력하고 싶습니다.다른 파서는 중간 코드를 읽고 최종적으로 완성 된 언어로 번역해야합니다.

마지막으로 주목해야 할 점은 특정 언어가 포함 된 파일 (예 : 포함 파일 형식으로 현재 파일에서 링크 된 파일)을 자체 클래스에 파서를 개발할 때와 같이 통합 할 필요가 있는지 고려하는 것입니다. 연결되어있는 각 파일에 대해 새 인스턴스를 호출하십시오.

어쨌든 이것이 도움이 되었으면 좋겠습니다.

+0

안녕하세요 @ Dean219. 답해 주셔서 감사 드리며 첫 번째 링크도 유용했습니다. 나는 이미 그것을 다운로드 한 책이고, 나는 조금씩 읽고있다. 내 타겟 언어가 자바입니다. 이미 문법을 컴파일하고 생성 된 파일 (리스너 및 방문자)을 얻었습니다. 그 시점에서 (리스너/방문자를 사용하는 방법) – Great

+0

기본적으로 리스너 또는 방문자 클래스는 생성 된 메소드를 포함합니다 ur 문법에서, 당신의 언어의 일부분이 당신의 규칙 중 하나와 일치 할 때마다 각 메소드가 호출됩니다. 그래서 antlr이 파일을 읽고 import 문을 발견했을 때 import 규칙을 가지고 있다고 가정하면 java 파일에 들어있는 listener/visitor 메소드가 호출되고 그 결과 발생한 텍스트를 처리 할 수 ​​있습니다. – D3181

+0

Thanks again @ Dean219. 인생을 파싱 한 후 그런 난폭 한 영역, 나는 그것을 시작하는 방법을 정말로하지 않는다, 나는 나를 위해 작업을 단순화 수있는 몇 가지 간단한 예제를 찾을 수 없습니다. 가끔은 예제없이 새로운 것을 이해하는 것이 너무 느립니다. – Great