Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Translator using Antlr4

I want to create a translator from SQL to XQuery.
I want to parse SQL and generate an intermediate structure and then use it to generate the XQuery query.
(Note- I want to use an intermediate representation because i'm looking forward to translating SQL to other Query languages in future)
but I don't know exactly how to produce a translator once the grammar has been defined. I want to use ANTLR and have indeed already created the grammar. I'm stuck at the moment with the grammar file and proceeding to build the translator as I don't know exactly the next step in producing one is.

like image 850
Great Avatar asked Sep 19 '16 11:09

Great


People also ask

What is antlr4 used for?

ANTLR 4 allows you to define lexer and parser rules in a single combined grammar file. This makes it really easy to get started. To get familiar with working with ANTLR, let's take a look at what a simple JSON grammar would look like and break it down. grammar Json; @header { package com.

What languages use ANTLR?

While Version 3 supported generating code in the programming languages Ada95, ActionScript, C, C#, Java, JavaScript, Objective-C, Perl, Python, Ruby, and Standard ML, Version 4 at present targets C#, C++, Dart, Java, JavaScript, Go, PHP, Python (2 and 3), and Swift.

What is ANTLR tool?

What is ANTLR? ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files.

Is ANTLR open source?

ANTLRv4 is an Open Source project and provides an online documentation sufficient to get started with the project, but mastering it requires to read the ANTLR 4 Definitive Reference. The Free Software Definition on gnu.org states that software manuals should be free.


1 Answers

This depends on what you want to do and in what language you want to do it. Now you have your grammar you should be looking into what language you wish to develop a parser for that language in. Antlr4 has runtimes for Java,javascript and python.

So you can compile your grammar to one of those output languages:

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

Note

Your really should read the ANTLR documentation for how to proceed using ANTLR or a full tutorial including the book written by terence parr.

But once you have compiled your grammar you can then begin to construct your translator by filling in a listener or visitor method that will produce whatever you decide when elements of your grammar are encountered. By default you will have an empty listener named "yourGrammarListener" where your grammar is the name of your .g4 file with listener appended to the end. This file will have many blank methods for any of your rules you defined.

Whichever language you choose as a target therefore defines whether you just should extend this file or implement your functionality into the generated listener.

Once you fill in any of the methods you should be able to run your application after you make sure your project contains links to whichever ANTLR runtime is required for your application, again the default is the Java runtime and the most popular so usually this means including the ANTLR.jar file into your Java project.

So in short:

  1. Write your grammar
  2. Compile your grammar
  3. Fill in any listener/visitor methods.
  4. In your Java file or whichever target language, define a visitor/tree and pass it the file from an argument like this (depending on language, see documentation for python alternative):

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

    }

Once you have this basic application taking an input file and producing output you wish to have it output into your intermediate format only. Another parser will be required to read your intermediate code and translate it finally into the complete and final language.

One final note is also to consider whether your specific language needs to incorporate the parsing of separate files, i.e files linked from within your current file in the form of includes etc as you would have to develop a parser in its own class and call a new instance for each file that is then linked.

Anyway hope this helps in someway and good luck on your project!

like image 143
D3181 Avatar answered Sep 19 '22 23:09

D3181