Antlr (ANother Tool for Language Recognition)
ANTLR is lexer generator. It translates:
- a grammar
ANTLR is implemented in Java and generates lexer and parser in the following languages:
- and Objective C.
It grew from the old C/C++ PCCTS project. Java is then a “recent” addition in the ANTLR's lifetime.
The url string was not validated as an URL (http://www.antlr.org:license.html). Error: The url (http://www.antlr.org:license.html) is not validANTLR is licensed under BSD.
There are three use cases:
- “validators.” to validate an input. Grammars for validators don't use actions or rewrite rules.
- “processors.” to validate an input and process it. Grammars for processors use actions, but not rewrite rules.
- “translators.” to validate and translate the input data structure into another data structure. Grammars for translators use actions (containing printlns) and/or rewrite rules.
LifeCyle / Workflow
- Write the grammar using one or more files with extension .g4
- Test your grammar with grun (note that you can also type the input at the console)
antlr4 # generate the parser grun <grammar-name> <rule-to-test> <input-filename(s)> # CTRL+D/CTRL+Z to quit without file name
- Optionally write StringTemplate templates for producing output.
- Generate the lexer and parser classes from the grammar along with:
- Write an application that uses the the generated classes.
ANTLRInputStream input = new ANTLRInputStream(sqlStream); MyLanguageLexer lexer = new MyLanguageLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); MyLanguageParser parser = new MyLanguageParser(tokens); CollectingErrorListener errorListener = new CollectingErrorListener(); parser.removeErrorListeners(); parser.addErrorListener(errorListener);
ANTLR is made up of two components:
- the generator (Java based) called the tool that:
- creates the lexer and parser in your target language
- the runtime (target language based) that permits to run the lexer and parser (with visitor ,…)
StringTemplate is a library that supports using templates with placeholders for outputting text (ex. Java source code)