[go: nahoru, domu]

Jump to content

ANTLR: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
m fix spelling
Tags: Visual edit Mobile edit Mobile web edit Advanced mobile edit
update latest release version
(34 intermediate revisions by 20 users not shown)
Line 1: Line 1:
{{more citations needed|date=March 2016}}
{{more citations needed|date=March 2016}}
{{Infobox software
{{Infobox software
| name = ANTLR
| name = ANTLR
| logo =
| logo =
| screenshot =
| screenshot =
| caption =
| caption =
| author = [[Terence Parr]] and others
| author = [[Terence Parr]] and others
| developer =
| developer =
| released = {{Start date and age|1992|02}}
| released = {{Start date and age|1992|04|10}}
| latest release version = 4.8
| latest release version = 4.13.1
| latest release date = {{Start date and age|2020|01|16|df=yes}}
| latest release date = {{Start date and age|2023|09|04|df=yes}}
| programming language = [[Java (programming language)|Java]]
| programming language = [[Java (programming language)|Java]]
| operating system =
| operating system =
| platform = [[Cross-platform]]
| platform = [[Cross-platform]]
| language =
| language =
| genre =
| genre =
| license = [[BSD License]]
| license = [[BSD License]]
| website = {{URL|www.antlr.org}}
| website = {{URL|www.antlr.org}}
}}
}}


In computer-based language recognition, '''ANTLR''' (pronounced ''[[antler]]''), or '''ANother Tool for Language Recognition''', is a [[parser generator]] that uses [[LL parser|LL(*)]] for parsing. ANTLR is the successor to the '''Purdue Compiler Construction Tool Set''' ('''PCCTS'''), first developed in 1989, and is under active development. Its maintainer is Professor [[Terence Parr]] of the [[University of San Francisco]].{{citation needed|date=March 2016}}
In computer-based language recognition, '''ANTLR''' (pronounced ''[[antler]]''), or '''ANother Tool for Language Recognition''', is a [[parser generator]] that uses a [[LL parser|LL(*)]] algorithm for parsing. ANTLR is the successor to the '''Purdue Compiler Construction Tool Set''' ('''PCCTS'''), first developed in 1989, and is under active development. Its maintainer is Professor [[Terence Parr]] of the [[University of San Francisco]].{{citation needed|date=March 2016}}

PCCTS 1.00 was announced April 10, 1992.<ref>{{Cite web |date=10 Apr 1992 |title=Comp.compilers: Purdue Compiler-Construction Tool Set 1.00 available |url=https://compilers.iecc.com/comparch/article/92-04-048 |access-date=2023-05-05 |website=compilers.iecc.com}}</ref><ref>{{Cite web |date=30 Apr 1992 |title=Comp.compilers: More on PCCTS |url=https://compilers.iecc.com/comparch/article/92-05-006 |access-date=2023-05-05 |website=compilers.iecc.com}}</ref>


==Usage==
==Usage==
ANTLR takes as input a [[formal grammar|grammar]] that specifies a language and generates as output [[source code]] for a [[recognizer]] of that language.
ANTLR takes as input a [[formal grammar|grammar]] that specifies a language and generates as output [[source code]] for a [[recognizer]] of that language. While Version 3 supported generating code in the [[programming language]]s [[Ada95]], [[ActionScript]], [[C (programming language)|C]], [[C Sharp (programming language)|C#]], [[Java (programming language)|Java]], [[JavaScript]], [[Objective-C]], [[Perl]], [[Python (programming language)|Python]], [[Ruby (programming language)|Ruby]], and [[Standard ML]],<ref>[http://www.classes.cs.uchicago.edu/archive/2007/winter/22610-1/docs/lpt-manual.pdf SML/NJ Language Processing Tools: User Guide]</ref> the current release at present only targets Java, C#, C++ <ref>https://soft-gems.net/the-antlr4-c-runtime-reached-home</ref>, JavaScript, Python, [[Swift (programming language)|Swift]], and [[Go (programming language)|Go]]. A language is specified using a [[context-free grammar]] expressed using [[Extended Backus–Naur Form]] (EBNF).{{citation needed|date=March 2016}}
While Version 3 supported generating code in the [[programming language]]s
[[Ada95]],
[[ActionScript]],
[[C (programming language)|C]],
[[C Sharp (programming language)|C#]],
[[Java (programming language)|Java]],
[[JavaScript]],
[[Objective-C]],
[[Perl]],
[[Python (programming language)|Python]],
[[Ruby (programming language)|Ruby]], and [[Standard ML]],<ref>[http://www.classes.cs.uchicago.edu/archive/2007/winter/22610-1/docs/lpt-manual.pdf SML/NJ Language Processing Tools: User Guide]</ref> Version 4 at present targets
C#,
C++,
[[Dart (programming language)|Dart]],<ref name="github">{{cite web |title=Runtime Libraries and Code Generation Targets |url=https://github.com/antlr/antlr4/blob/master/doc/targets.md |website=github|date=6 January 2022 }}</ref><ref>{{Cite web | url=https://soft-gems.net/the-antlr4-c-runtime-reached-home | title=The ANTLR4 C++ runtime reached home – Soft Gems }}</ref>
Java,
JavaScript,
[[Go (programming language)|Go]],
[[PHP]],
Python (2 and 3),
and [[Swift (programming language)|Swift]].


A language is specified using a [[context-free grammar]] expressed using [[Extended Backus–Naur Form]] (EBNF).{{citation needed|date=March 2016}}<ref name=":0">{{Cite book|last=Parr|first=Terence|url=https://books.google.com/books?id=gA9QDwAAQBAJ|title=The Definitive ANTLR 4 Reference|date=2013-01-15|publisher=Pragmatic Bookshelf|isbn=978-1-68050-500-9|language=en}}</ref>
ANTLR can generate [[lexical analysis|lexer]]s, [[parser]]s, [[tree parser]]s, and combined [[lexer-parser]]s. Parsers can automatically generate [[parse tree]]s or [[abstract syntax tree]]s, which can be further processed with tree parsers. ANTLR provides a single consistent notation for specifying lexers, parsers, and tree parsers.
ANTLR can generate [[lexical analysis|lexer]]s, [[parser]]s, [[Parse tree|tree parsers]], and combined [[Lexical analysis|lexer-parsers]]. Parsers can automatically generate [[parse tree]]s or [[abstract syntax tree]]s, which can be further processed with tree parsers. ANTLR provides a single consistent notation for specifying lexers, parsers, and tree parsers.


By default, ANTLR reads a grammar and generates a recognizer for the language defined by the grammar (i.e., a program that reads an input stream and generates an error if the input stream does not conform to the syntax specified by the grammar). If there are no syntax errors, the default action is to simply exit without printing any message. In order to do something useful with the language, actions can be attached to grammar elements in the grammar. These actions are written in the programming language in which the recognizer is being generated. When the recognizer is being generated, the actions are embedded in the source code of the recognizer at the appropriate points. Actions can be used to build and check symbol tables and to emit instructions in a target language, in the case of a compiler.{{citation needed|date=March 2016}}
By default, ANTLR reads a grammar and generates a recognizer for the language defined by the grammar (i.e., a program that reads an input stream and generates an error if the input stream does not conform to the syntax specified by the grammar). If there are no syntax errors, the default action is to simply exit without printing any message. In order to do something useful with the language, actions can be attached to grammar elements in the grammar. These actions are written in the programming language in which the recognizer is being generated. When the recognizer is being generated, the actions are embedded in the source code of the recognizer at the appropriate points. Actions can be used to build and check symbol tables and to emit instructions in a target language, in the case of a compiler.{{citation needed|date=March 2016}}<ref name=":0" />


Other than lexers and parsers, ANTLR can be used to generate tree parsers. These are recognizers that process abstract syntax trees, which can be automatically generated by parsers. These tree parsers are unique to ANTLR and help processing abstract syntax trees.{{citation needed|date=March 2016}}
Other than lexers and parsers, ANTLR can be used to generate tree parsers. These are recognizers that process abstract syntax trees, which can be automatically generated by parsers. These tree parsers are unique to ANTLR and help processing abstract syntax trees.{{citation needed|date=March 2016}}<ref name=":0" />


==Licensing==
==Licensing==
{{citation needed span|date=September 2017|text=ANTLR 3}} and ANTLR 4 are [[free software]], published under a three-clause [[BSD License]].<ref name=antlr4-license>{{cite web |date=2017-03-30 |title=antlr4/LICENSE.txt |website=GitHub |url=https://github.com/antlr/antlr4/blob/master/LICENSE.txt }}</ref> Prior versions were released as [[public domain software]].<ref>{{cite mailing list|url=http://www.antlr.org/pipermail/antlr-interest/2004-February/006340.html |title=licensing stuff |date=2004-02-05 |accessdate=2009-12-15 |mailing-list=antlr-interest |last=Parr |first=Terence |url-status=dead |archiveurl=https://web.archive.org/web/20110718165021/http://www.antlr.org/pipermail/antlr-interest/2004-February/006340.html |archivedate=2011-07-18 }}</ref> Documentation, derived from Parr's book ''The Definitive ANTLR 4 Reference'', is included with the BSD-licensed ANTLR 4 source.<ref name=antlr4-license/><ref>{{cite web |date=2017-03-30 |title=ANTLR 4 Documentation |website=GitHub |url=https://github.com/antlr/antlr4/blob/master/doc/index.md }}</ref>
{{citation needed span|date=September 2017|text=ANTLR 3}} and ANTLR 4 are [[free software]], published under a three-clause [[BSD License]].<ref name=antlr4-license>{{cite web |date=2017-03-30 |title=antlr4/LICENSE.txt |website=GitHub |url=https://github.com/antlr/antlr4/blob/master/LICENSE.txt }}</ref> Prior versions were released as [[public domain software]].<ref>{{cite mailing list|url=http://www.antlr.org/pipermail/antlr-interest/2004-February/006340.html |title=licensing stuff |date=2004-02-05 |accessdate=2009-12-15 |mailing-list=antlr-interest |last=Parr |first=Terence |url-status=dead |archiveurl=https://web.archive.org/web/20110718165021/http://www.antlr.org/pipermail/antlr-interest/2004-February/006340.html |archivedate=2011-07-18 }}</ref> Documentation, derived from Parr's book ''The Definitive ANTLR 4 Reference'', is included with the BSD-licensed ANTLR 4 source.<ref name=antlr4-license/><ref>{{cite web |date=2017-03-30 |title=ANTLR 4 Documentation |website=GitHub |url=https://github.com/antlr/antlr4/blob/master/doc/index.md }}</ref>


Various plugins have been developed for the [[Eclipse IDE|Eclipse development environment]] to support the ANTLR grammar, including [[ANTLR Studio]], a [[Proprietary software|proprietary product]], as well as the "ANTLR 2"<ref>http://antlreclipse.sourceforge.net</ref> and "ANTLR 3"<ref>http://antlrv3ide.sourceforge.net</ref> plugins for Eclipse hosted on [[SourceForge]].{{citation needed|date=March 2016}}
Various plugins have been developed for the [[Eclipse IDE|Eclipse development environment]] to support the ANTLR grammar, including [[ANTLR Studio]], a [[Proprietary software|proprietary product]], as well as the "ANTLR 2"<ref>{{cite web |url=http://antlreclipse.sourceforge.net |title = ANTLR plugin for Eclipse}}</ref> and "ANTLR 3"<ref>{{cite web |url=http://antlrv3ide.sourceforge.net |title = ANTLR IDE. An eclipse plugin for ANTLR grammars}}</ref> plugins for Eclipse hosted on [[SourceForge]].{{citation needed|date=March 2016}}


== ANTLR 4 ==
== ANTLR 4 ==
ANTLR 4 deals with [[left recursion]] correctly (except for indirect left recursion, i.e., grammar rules ''x'' that refer to ''y'' that refer to ''x'')<ref>[https://github.com/antlr/antlr4/blob/master/doc/faq/general.md#what-is-the-difference-between-antlr-3-and-4 What is the difference between ANTLR 3 & 4]</ref> and supports actions and attributes flexibly. That is, actions can be defined separately from the grammar, allowing for easier targeting of multiple languages.{{citation needed|date=March 2016}}
ANTLR 4 deals with direct [[left recursion]] correctly, but not with left recursion in general, i.e., grammar rules ''x'' that refer to ''y'' that refer to ''x''.<ref>[https://github.com/antlr/antlr4/blob/master/doc/faq/general.md#what-is-the-difference-between-antlr-3-and-4 What is the difference between ANTLR 3 & 4]</ref>


=== Development ===
=== Development ===
As reported on the tools<ref>http://www.antlr.org/tools.html</ref> page of the ANTLR project, plug-ins that enable features like syntax highlighting, syntax error checking and code completion are freely available for the most common IDEs ([[Intellij]] IDEA, [[NetBeans]], Eclipse, [[Visual Studio]]<ref>https://marketplace.visualstudio.com/items?itemName=SamHarwell.ANTLRLanguageSupport</ref> and [[Visual Studio Code]]).
As reported on the tools<ref>{{Cite web|url=http://www.antlr.org/tools.html|title = ANTLR Development Tools}}</ref> page of the ANTLR project, plug-ins that enable features like syntax highlighting, syntax error checking and code completion are freely available for the most common IDEs ([[Intellij]] IDEA, [[NetBeans]], [[Eclipse (software)|Eclipse]], [[Visual Studio]]<ref>{{Cite web|url=https://marketplace.visualstudio.com/items?itemName=SamHarwell.ANTLRLanguageSupport|title = ANTLR Language Support - Visual Studio Marketplace}}</ref> and [[Visual Studio Code]]).


== Projects ==
== Projects ==
Here is a non-comprehensive list of software built using ANTLR:
Software built using ANTLR includes:


* [[Groovy (programming language)|Groovy]].<ref>http://docs.groovy-lang.org/2.4.0/html/api/org/codehaus/groovy/antlr/parser/GroovyRecognizer.html</ref>
* [[Groovy (programming language)|Groovy]].<ref>{{Cite web|url=http://docs.groovy-lang.org/2.4.0/html/api/org/codehaus/groovy/antlr/parser/GroovyRecognizer.html|title = GroovyRecognizer (Groovy 2.4.0)}}</ref>
* [[Jython]].<ref>https://hg.python.org/jython/rev/31d97f0de5fe</ref>
* [[Jython]].<ref>{{Cite web|url=https://hg.python.org/jython/rev/31d97f0de5fe|title=Jython: 31d97f0de5fe}}</ref>
* [[Hibernate (java)|Hibernate]]<ref>{{cite web |last1=Ebersole |first1=Steve |title=Hibernate ORM 6.0.0.Alpha1 released |url=https://in.relation.to/2018/12/06/hibernate-orm-600-alpha1-out/ |website=In Relation To, The Hibernate team blog on everything data |accessdate=2020-07-11 |date=2018-12-06}}</ref>
* [[Hibernate (java)|Hibernate]]<ref>{{cite web |last1=Ebersole |first1=Steve |title=Hibernate ORM 6.0.0.Alpha1 released |url=https://in.relation.to/2018/12/06/hibernate-orm-600-alpha1-out/ |website=In Relation To, The Hibernate team blog on everything data |access-date=2020-07-11 |date=2018-12-06}}</ref>
* OpenJDK Compiler Grammar project experimental version of the [[javac]] compiler based upon a grammar written in ANTLR.{{citation needed|date=October 2017}}
* OpenJDK Compiler Grammar project experimental version of the [[javac]] compiler based upon a grammar written in ANTLR.<ref>{{Cite web|url=https://openjdk.java.net/projects/compiler-grammar/|title=OpenJDK: Compiler Grammar}}</ref>
* [[Salesforce.com#Apex|Apex]], [[Salesforce.com]]'s programming language.{{citation needed|date=October 2017}}
* [[Salesforce.com#Apex|Apex]], [[Salesforce.com]]'s programming language.{{citation needed|date=October 2017}}
* The expression evaluator in [[Numbers (spreadsheet)|Numbers]], Apple's spreadsheet.{{citation needed|date=October 2017}}
* The expression evaluator in [[Numbers (spreadsheet)|Numbers]], Apple's spreadsheet.{{citation needed|date=October 2017}}
Line 55: Line 78:
* [[Processing (programming language)|Processing]].{{citation needed|date=October 2017}}
* [[Processing (programming language)|Processing]].{{citation needed|date=October 2017}}
* [[JabRef]].{{citation needed|date=October 2017}}
* [[JabRef]].{{citation needed|date=October 2017}}
* [[Trino (SQL query engine)]]
* [[Presto (SQL query engine)]]
* [[Presto (SQL query engine)]]
* [[MySQL Workbench]]
* [[MySQL Workbench]]


Over 200 grammars implemented in ANTLR 4 are available on [[GitHub|Github]].<ref>{{Citation|title=Grammars written for ANTLR v4; expectation that the grammars are free of actions.: antlr/grammars-v4|date=2019-09-25|url=https://github.com/antlr/grammars-v4|publisher=Antlr Project|access-date=2019-09-25}}</ref> They range from grammars for a [[URL]] to grammars for entire languages like C, Java and Go.
Over 200 grammars implemented in ANTLR 4 are available on [[GitHub]].<ref>{{Citation|title=Grammars written for ANTLR v4; expectation that the grammars are free of actions.: antlr/grammars-v4|date=2019-09-25|url=https://github.com/antlr/grammars-v4|publisher=Antlr Project|access-date=2019-09-25}}</ref> They range from grammars for a [[URL]] to grammars for entire languages like C, Java and Go.


== Example ==
== Example ==
Line 130: Line 154:
==Further reading==
==Further reading==
{{refbegin}}
{{refbegin}}
* {{cite journal |first1=T.J. |last1=Parr |first2=R.W. |last2=Quong |title=ANTLR: A Predicated-LL(k) Parser Generator |journal=Software: Practice and Experience |volume=25 |issue=7 |pages=789–810 |date=July 1995 |doi=10.1002/spe.4380250705 |citeseerx=10.1.1.54.6015 }}
* {{cite journal |first1=T.J. |last1=Parr |first2=R.W. |last2=Quong |title=ANTLR: A Predicated-LL(k) Parser Generator |journal=Software: Practice and Experience |volume=25 |issue=7 |pages=789–810 |date=July 1995 |doi=10.1002/spe.4380250705 |citeseerx=10.1.1.54.6015 |s2cid=13453016 }}
{{refend}}
{{refend}}


Line 140: Line 164:
*[http://www.placidsystems.com/antlrstudio.aspx ANTLR Studio]
*[http://www.placidsystems.com/antlrstudio.aspx ANTLR Studio]


{{DEFAULTSORT:Antlr}}
[[Category:1992 software]]
[[Category:1992 software]]
[[Category:Free compilers and interpreters]]
[[Category:Free compilers and interpreters]]

Revision as of 09:46, 25 October 2023

ANTLR
Original author(s)Terence Parr and others
Initial releaseApril 10, 1992; 32 years ago (1992-04-10)
Stable release
4.13.1 / 4 September 2023; 12 months ago (2023-09-04)
Repository
Written inJava
PlatformCross-platform
LicenseBSD License
Websitewww.antlr.org

In computer-based language recognition, ANTLR (pronounced antler), or ANother Tool for Language Recognition, is a parser generator that uses a LL(*) algorithm for parsing. ANTLR is the successor to the Purdue Compiler Construction Tool Set (PCCTS), first developed in 1989, and is under active development. Its maintainer is Professor Terence Parr of the University of San Francisco.[citation needed]

PCCTS 1.00 was announced April 10, 1992.[1][2]

Usage

ANTLR takes as input a grammar that specifies a language and generates as output source code for a recognizer of that language. While Version 3 supported generating code in the programming languages Ada95, ActionScript, C, C#, Java, JavaScript, Objective-C, Perl, Python, Ruby, and Standard ML,[3] Version 4 at present targets C#, C++, Dart,[4][5] Java, JavaScript, Go, PHP, Python (2 and 3), and Swift.

A language is specified using a context-free grammar expressed using Extended Backus–Naur Form (EBNF).[citation needed][6] ANTLR can generate lexers, parsers, tree parsers, and combined lexer-parsers. Parsers can automatically generate parse trees or abstract syntax trees, which can be further processed with tree parsers. ANTLR provides a single consistent notation for specifying lexers, parsers, and tree parsers.

By default, ANTLR reads a grammar and generates a recognizer for the language defined by the grammar (i.e., a program that reads an input stream and generates an error if the input stream does not conform to the syntax specified by the grammar). If there are no syntax errors, the default action is to simply exit without printing any message. In order to do something useful with the language, actions can be attached to grammar elements in the grammar. These actions are written in the programming language in which the recognizer is being generated. When the recognizer is being generated, the actions are embedded in the source code of the recognizer at the appropriate points. Actions can be used to build and check symbol tables and to emit instructions in a target language, in the case of a compiler.[citation needed][6]

Other than lexers and parsers, ANTLR can be used to generate tree parsers. These are recognizers that process abstract syntax trees, which can be automatically generated by parsers. These tree parsers are unique to ANTLR and help processing abstract syntax trees.[citation needed][6]

Licensing

ANTLR 3[citation needed] and ANTLR 4 are free software, published under a three-clause BSD License.[7] Prior versions were released as public domain software.[8] Documentation, derived from Parr's book The Definitive ANTLR 4 Reference, is included with the BSD-licensed ANTLR 4 source.[7][9]

Various plugins have been developed for the Eclipse development environment to support the ANTLR grammar, including ANTLR Studio, a proprietary product, as well as the "ANTLR 2"[10] and "ANTLR 3"[11] plugins for Eclipse hosted on SourceForge.[citation needed]

ANTLR 4

ANTLR 4 deals with direct left recursion correctly, but not with left recursion in general, i.e., grammar rules x that refer to y that refer to x.[12]

Development

As reported on the tools[13] page of the ANTLR project, plug-ins that enable features like syntax highlighting, syntax error checking and code completion are freely available for the most common IDEs (Intellij IDEA, NetBeans, Eclipse, Visual Studio[14] and Visual Studio Code).

Projects

Software built using ANTLR includes:

Over 200 grammars implemented in ANTLR 4 are available on GitHub.[19] They range from grammars for a URL to grammars for entire languages like C, Java and Go.

Example

In the following example, a parser in ANTLR describes the sum of expressions can be seen in the form of "1 + 2 + 3":

 // Common options, for example, the target language
 options
 {
  language = "CSharp";
 }
 // Followed by the parser 
 class SumParser extends Parser;
 options
 {
   k = 1; // Parser Lookahead: 1 Token
 }
 // Definition of an expression
 statement: INTEGER (PLUS^ INTEGER)*;
 // Here is the Lexer
 class SumLexer extends Lexer;
 options
 {
   k = 1; // Lexer Lookahead: 1 characters
 }
 PLUS: '+';
 DIGIT: ('0'..'9');
 INTEGER: (DIGIT)+;

The following listing demonstrates the call of the parser in a program:

 TextReader reader;
 // (...) Fill TextReader with character
 SumLexer lexer = new SumLexer(reader);
 SumParser parser = new SumParser(lexer);

 parser.statement();

See also

References

  1. ^ "Comp.compilers: Purdue Compiler-Construction Tool Set 1.00 available". compilers.iecc.com. 10 Apr 1992. Retrieved 2023-05-05.
  2. ^ "Comp.compilers: More on PCCTS". compilers.iecc.com. 30 Apr 1992. Retrieved 2023-05-05.
  3. ^ SML/NJ Language Processing Tools: User Guide
  4. ^ "Runtime Libraries and Code Generation Targets". github. 6 January 2022.
  5. ^ "The ANTLR4 C++ runtime reached home – Soft Gems".
  6. ^ a b c Parr, Terence (2013-01-15). The Definitive ANTLR 4 Reference. Pragmatic Bookshelf. ISBN 978-1-68050-500-9.
  7. ^ a b "antlr4/LICENSE.txt". GitHub. 2017-03-30.
  8. ^ Parr, Terence (2004-02-05). "licensing stuff". antlr-interest (Mailing list). Archived from the original on 2011-07-18. Retrieved 2009-12-15.
  9. ^ "ANTLR 4 Documentation". GitHub. 2017-03-30.
  10. ^ "ANTLR plugin for Eclipse".
  11. ^ "ANTLR IDE. An eclipse plugin for ANTLR grammars".
  12. ^ What is the difference between ANTLR 3 & 4
  13. ^ "ANTLR Development Tools".
  14. ^ "ANTLR Language Support - Visual Studio Marketplace".
  15. ^ "GroovyRecognizer (Groovy 2.4.0)".
  16. ^ "Jython: 31d97f0de5fe".
  17. ^ Ebersole, Steve (2018-12-06). "Hibernate ORM 6.0.0.Alpha1 released". In Relation To, The Hibernate team blog on everything data. Retrieved 2020-07-11.
  18. ^ "OpenJDK: Compiler Grammar".
  19. ^ Grammars written for ANTLR v4; expectation that the grammars are free of actions.: antlr/grammars-v4, Antlr Project, 2019-09-25, retrieved 2019-09-25

Bibliography

Further reading