Merge branch 'antlr4-maven-plugin' of git://github.com/sharwell/antlr4
This commit is contained in:
commit
4c6ee82317
|
@ -1,4 +1,5 @@
|
||||||
/tool/target/
|
/tool/target/
|
||||||
/runtime/Java/target/
|
/runtime/Java/target/
|
||||||
/gunit/target/
|
/gunit/target/
|
||||||
*.hprof
|
*.hprof
|
||||||
|
/antlr4-maven-plugin/target/
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
|
</classpath>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>antlr4-maven-plugin</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,2 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding/<project>=UTF-8
|
|
@ -0,0 +1,5 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.6
|
|
@ -0,0 +1,4 @@
|
||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
|
@ -0,0 +1,361 @@
|
||||||
|
<!--
|
||||||
|
|
||||||
|
[The "BSD license"]
|
||||||
|
|
||||||
|
ANTLR - Copyright (c) 2005-2010 Terence Parr
|
||||||
|
Maven Plugin - Copyright (c) 2009 Jim Idle
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
|
<!-- Maven model we are inheriting from
|
||||||
|
-->
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Now that the ANTLR project has adopted Maven with a vengence,
|
||||||
|
all ANTLR tools will be grouped under org.antlr and will be
|
||||||
|
controlled by a project member.
|
||||||
|
-->
|
||||||
|
<groupId>org.antlr</groupId>
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
This is the ANTLR plugin for ANTLR version 4.0 and above. It might
|
||||||
|
have been best to change the name of the plugin as the 4.0 plugins
|
||||||
|
behave a little differently, however for the sake of one transitional
|
||||||
|
phase to a much better plugin, it was decided that the name should
|
||||||
|
remain the same.
|
||||||
|
-->
|
||||||
|
<artifactId>antlr4-maven-plugin</artifactId>
|
||||||
|
<packaging>maven-plugin</packaging>
|
||||||
|
|
||||||
|
<!-- Note that as this plugin depends on the ANTLR tool itself
|
||||||
|
we cannot use the paren pom to control the version number
|
||||||
|
and MUST update <version> in this pom manually!
|
||||||
|
-->
|
||||||
|
<version>4.0-SNAPSHOT</version>
|
||||||
|
<name>Maven plugin for ANTLR V4</name>
|
||||||
|
<prerequisites>
|
||||||
|
<maven>3.0</maven>
|
||||||
|
</prerequisites>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Where does our actual project live on the interwebs.
|
||||||
|
-->
|
||||||
|
<url>http://antlr.org</url>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<description>
|
||||||
|
|
||||||
|
This is the brand new, re-written from scratch plugin for ANTLR v4.
|
||||||
|
|
||||||
|
Previous valiant efforts all suffered from being unable to modify the ANTLR Tool
|
||||||
|
itself to provide support not just for Maven oriented things but any other tool
|
||||||
|
that might wish to invoke ANTLR without resorting to the command line interface.
|
||||||
|
|
||||||
|
Rather than try to shoe-horn new code into the existing Mojo (in fact I think that
|
||||||
|
by incorporating a patch supplied by someone I ended up with tow versions of the
|
||||||
|
Mojo, I elected to rewrite everything from scratch, including the documentation, so
|
||||||
|
that we might end up with a perfect Mojo that can do everything that ANTLR v4 supports
|
||||||
|
such as imported grammar processing, proper support for library directories and
|
||||||
|
locating token files from generated sources, and so on.
|
||||||
|
|
||||||
|
In the end I decided to also change the the ANTLR Tool.java code so that it
|
||||||
|
would be the provider of all the things that a build tool needs, rather than
|
||||||
|
delegating things to 5 different tools. So, things like dependencies, dependency
|
||||||
|
sorting, option tracking, generating sources and so on are all folded back
|
||||||
|
in to ANTLR's Tool.java code, where they belong, and they now provide a
|
||||||
|
public interface to anyone that might want to interface with them.
|
||||||
|
|
||||||
|
One other goal of this rewrite was to completely document the whole thing
|
||||||
|
to death. Hence even this pom has more comments than funcitonal elements,
|
||||||
|
in case I get run over by a bus or fall off a cliff while skiing.
|
||||||
|
|
||||||
|
Jim Idle - March 2009
|
||||||
|
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
|
||||||
|
<developer>
|
||||||
|
<name>Jim Idle</name>
|
||||||
|
<url>http://www.temporal-wave.com</url>
|
||||||
|
<roles>
|
||||||
|
<role>Originator, version 4.0</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
|
||||||
|
<developer>
|
||||||
|
<name>Terence Parr</name>
|
||||||
|
<url>http://antlr.org/wiki/display/~admin/Home</url>
|
||||||
|
<roles>
|
||||||
|
<role>Project lead - ANTLR</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
|
||||||
|
<developer>
|
||||||
|
<name>David Holroyd</name>
|
||||||
|
<url>http://david.holroyd.me.uk/</url>
|
||||||
|
<roles>
|
||||||
|
<role>Originator - prior version</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
|
||||||
|
<developer>
|
||||||
|
<name>Kenny MacDermid</name>
|
||||||
|
<url>mailto:kenny "at" kmdconsulting.ca</url>
|
||||||
|
<roles>
|
||||||
|
<role>Contributor - prior versions</role>
|
||||||
|
</roles>
|
||||||
|
</developer>
|
||||||
|
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<!-- Where do we track bugs for this project?
|
||||||
|
-->
|
||||||
|
<issueManagement>
|
||||||
|
<system>JIRA</system>
|
||||||
|
<url>http://antlr.org/jira/browse/ANTLR</url>
|
||||||
|
</issueManagement>
|
||||||
|
|
||||||
|
<!-- Location of the license description for this project
|
||||||
|
-->
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<distribution>repo</distribution>
|
||||||
|
<name>The BSD License</name>
|
||||||
|
<url>http://www.antlr.org/LICENSE.txt </url>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<distributionManagement>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>antlr-repo</id>
|
||||||
|
<name>ANTLR Testing repository</name>
|
||||||
|
<url>scpexe://antlr.org/home/mavensync/antlr-repo</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<snapshotRepository>
|
||||||
|
<id>antlr-snapshot</id>
|
||||||
|
<name>ANTLR Testing Snapshot Repository</name>
|
||||||
|
<url>scpexe://antlr.org/home/mavensync/antlr-snapshot</url>
|
||||||
|
</snapshotRepository>
|
||||||
|
|
||||||
|
<site>
|
||||||
|
<id>antlr-repo</id>
|
||||||
|
<name>ANTLR Maven Plugin Web Site</name>
|
||||||
|
<url>scpexe://antlr.org/home/mavensync/antlr-maven-webs/antlr4-maven-plugin</url>
|
||||||
|
</site>
|
||||||
|
</distributionManagement>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
Inform Maven of the ANTLR snapshot repository, which it will
|
||||||
|
need to consult to get the latest snapshot build of the runtime and tool
|
||||||
|
if it was not built and installed locally.
|
||||||
|
-->
|
||||||
|
<repositories>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This is the ANTLR repository.
|
||||||
|
-->
|
||||||
|
<repository>
|
||||||
|
<id>antlr-snapshot</id>
|
||||||
|
<name>ANTLR Testing Snapshot Repository</name>
|
||||||
|
<url>http://antlr.org/antlr-snapshot</url>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<updatePolicy>always</updatePolicy>
|
||||||
|
</snapshots>
|
||||||
|
|
||||||
|
<releases>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</releases>
|
||||||
|
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<!-- Ancilliary information for completeness
|
||||||
|
-->
|
||||||
|
<inceptionYear>2009</inceptionYear>
|
||||||
|
|
||||||
|
<mailingLists>
|
||||||
|
<mailingList>
|
||||||
|
<archive>http://antlr.markmail.org/</archive>
|
||||||
|
<otherArchives>
|
||||||
|
<otherArchive>http://www.antlr.org/pipermail/antlr-interest/</otherArchive>
|
||||||
|
</otherArchives>
|
||||||
|
<name>ANTLR Users</name>
|
||||||
|
<subscribe>http://www.antlr.org/mailman/listinfo/antlr-interest/</subscribe>
|
||||||
|
<unsubscribe>http://www.antlr.org/mailman/options/antlr-interest/</unsubscribe>
|
||||||
|
<post>antlr-interest@antlr.org</post>
|
||||||
|
</mailingList>
|
||||||
|
</mailingLists>
|
||||||
|
|
||||||
|
<organization>
|
||||||
|
<name>ANTLR.org</name>
|
||||||
|
<url>http://www.antlr.org</url>
|
||||||
|
</organization>
|
||||||
|
<!-- ============================================================================= -->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
|
||||||
|
What are we depedent on for the Mojos to execute? We need the
|
||||||
|
plugin API itself and of course we need the ANTLR Tool and runtime
|
||||||
|
and any of their dependencies, which we inherit. The Tool itself provides
|
||||||
|
us with all the dependencies, so we need only name it here.
|
||||||
|
-->
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The things we need to build the target language recognizer
|
||||||
|
-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-plugin-api</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-project</artifactId>
|
||||||
|
<version>2.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
|
<artifactId>plexus-compiler-api</artifactId>
|
||||||
|
<version>1.8.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The version of ANTLR tool that this version of the plugin controls.
|
||||||
|
We have decided that this should be in lockstep with ANTLR itself, other
|
||||||
|
than -1 -2 -3 etc patch releases.
|
||||||
|
-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.antlr</groupId>
|
||||||
|
<artifactId>antlr4</artifactId>
|
||||||
|
<version>4.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Testing requirements...
|
||||||
|
-->
|
||||||
|
<dependency>
|
||||||
|
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.10</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.shared</groupId>
|
||||||
|
<artifactId>maven-plugin-testing-harness</artifactId>
|
||||||
|
<version>1.1</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
|
||||||
|
<defaultGoal>install</defaultGoal>
|
||||||
|
|
||||||
|
<extensions>
|
||||||
|
<extension>
|
||||||
|
<groupId>org.apache.maven.wagon</groupId>
|
||||||
|
<artifactId>wagon-ssh-external</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
</extension>
|
||||||
|
</extensions>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>2.3.2</version>
|
||||||
|
<configuration>
|
||||||
|
<source>1.6</source>
|
||||||
|
<target>1.6</target>
|
||||||
|
<showDeprecation>true</showDeprecation>
|
||||||
|
<showWarnings>true</showWarnings>
|
||||||
|
<compilerArguments>
|
||||||
|
<Xlint/>
|
||||||
|
</compilerArguments>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-site-plugin</artifactId>
|
||||||
|
<version>3.0</version>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<configuration>
|
||||||
|
<dependencyLocationsEnabled>false</dependencyLocationsEnabled>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>2.1.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,84 @@
|
||||||
|
/**
|
||||||
|
[The "BSD licence"]
|
||||||
|
|
||||||
|
ANTLR - Copyright (c) 2005-2008 Terence Parr
|
||||||
|
Maven Plugin - Copyright (c) 2009 Jim Idle
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.antlr.mojo.antlr4;
|
||||||
|
|
||||||
|
import org.antlr.v4.tool.ANTLRMessage;
|
||||||
|
import org.antlr.v4.tool.ANTLRToolListener;
|
||||||
|
import org.apache.maven.plugin.logging.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Maven plexus container gives us a Log logging provider
|
||||||
|
* which we can use to install an error listener for the ANTLR
|
||||||
|
* tool to report errors by.
|
||||||
|
*/
|
||||||
|
public class Antlr4ErrorLog implements ANTLRToolListener {
|
||||||
|
|
||||||
|
private Log log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate an ANTLR ErrorListner that communicates any messages
|
||||||
|
* it receives to the Maven error sink.
|
||||||
|
*
|
||||||
|
* @param log The Maven Error Log
|
||||||
|
*/
|
||||||
|
public Antlr4ErrorLog(Log log) {
|
||||||
|
this.log = log;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an informational message to the Maven log sink.
|
||||||
|
* @param s The message to send to Maven
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void info(String message) {
|
||||||
|
log.info(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an error message from ANTLR analysis to the Maven Log sink.
|
||||||
|
*
|
||||||
|
* @param message The message to send to Maven.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void error(ANTLRMessage message) {
|
||||||
|
log.error(message.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a warning message to the Maven log sink.
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void warning(ANTLRMessage message) {
|
||||||
|
log.warn(message.toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,566 @@
|
||||||
|
/**
|
||||||
|
[The "BSD licence"]
|
||||||
|
|
||||||
|
ANTLR - Copyright (c) 2005-2008 Terence Parr
|
||||||
|
Maven Plugin - Copyright (c) 2009 Jim Idle
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
1. Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
3. The name of the author may not be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ========================================================================
|
||||||
|
* This is the definitive ANTLR4 Mojo set. All other sets are belong to us.
|
||||||
|
*/
|
||||||
|
package org.antlr.mojo.antlr4;
|
||||||
|
|
||||||
|
import antlr.RecognitionException;
|
||||||
|
import antlr.TokenStreamException;
|
||||||
|
import org.antlr.v4.Tool;
|
||||||
|
import org.antlr.v4.codegen.CodeGenerator;
|
||||||
|
import org.antlr.v4.tool.Grammar;
|
||||||
|
import org.apache.maven.plugin.AbstractMojo;
|
||||||
|
import org.apache.maven.plugin.MojoExecutionException;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.apache.maven.plugin.logging.Log;
|
||||||
|
import org.apache.maven.project.MavenProject;
|
||||||
|
import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
|
||||||
|
import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
|
||||||
|
import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
|
||||||
|
import org.codehaus.plexus.compiler.util.scan.mapping.SourceMapping;
|
||||||
|
import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Goal that picks up all the ANTLR grammars in a project and moves those that
|
||||||
|
* are required for generation of the compilable sources into the location
|
||||||
|
* that we use to compile them, such as target/generated-sources/antlr4 ...
|
||||||
|
*
|
||||||
|
* @goal antlr
|
||||||
|
*
|
||||||
|
* @phase process-sources
|
||||||
|
* @requiresDependencyResolution compile
|
||||||
|
* @requiresProject true
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jimi@temporal-wave.com">Jim Idle</a>
|
||||||
|
*/
|
||||||
|
public class Antlr4Mojo
|
||||||
|
extends AbstractMojo {
|
||||||
|
|
||||||
|
// First, let's deal with the options that the ANTLR tool itself
|
||||||
|
// can be configured by.
|
||||||
|
//
|
||||||
|
/**
|
||||||
|
* If set to true, then after the tool has processed an input grammar file
|
||||||
|
* it will report variaous statistics about the parser, such as information
|
||||||
|
* on cyclic DFAs, which rules may use backtracking, and so on.
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean report;
|
||||||
|
/**
|
||||||
|
* If set to true, then the ANTLR tool will print a version of the input
|
||||||
|
* grammar which is devoid of any actions that may be present in the input file.
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean printGrammar;
|
||||||
|
/**
|
||||||
|
* If set to true, then the code generated by the ANTLR code generator will
|
||||||
|
* be set to debug mode. This means that when run, the code will 'hang' and
|
||||||
|
* wait for a debug connection on a TCP port (49100 by default).
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean debug;
|
||||||
|
/**
|
||||||
|
* If set to true, then then the generated parser will compute and report on
|
||||||
|
* profile information at runtime.
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean profile;
|
||||||
|
/**
|
||||||
|
* If set to true then the ANTLR tool will generate a description of the atn
|
||||||
|
* for each rule in <a href="http://www.graphviz.org">Dot format</a>
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean atn;
|
||||||
|
/**
|
||||||
|
* If set to true, the generated parser code will log rule entry and exit points
|
||||||
|
* to stdout as an aid to debugging.
|
||||||
|
*
|
||||||
|
* @parameter default-value="false"
|
||||||
|
*/
|
||||||
|
protected boolean trace;
|
||||||
|
/**
|
||||||
|
* If this parameter is set, it indicates that any warning or error messages returned
|
||||||
|
* by ANLTR, shoould be formatted in the specified way. Currently, ANTLR suports the
|
||||||
|
* built-in formats of antlr, gnu and vs2005.
|
||||||
|
*
|
||||||
|
* @parameter default-value="antlr"
|
||||||
|
*/
|
||||||
|
protected String messageFormat;
|
||||||
|
/**
|
||||||
|
* If this parameter is set to true, then ANTLR will report all sorts of things
|
||||||
|
* about what it is doing such as the names of files and the version of ANTLR and so on.
|
||||||
|
*
|
||||||
|
* @parameter default-value="true"
|
||||||
|
*/
|
||||||
|
protected boolean verbose;
|
||||||
|
|
||||||
|
protected boolean verbose_dfa;
|
||||||
|
|
||||||
|
protected boolean force_atn;
|
||||||
|
|
||||||
|
protected boolean abstract_recognizer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of alts, beyond which ANTLR will not generate a switch statement
|
||||||
|
* for the DFA.
|
||||||
|
*
|
||||||
|
* @parameter default-value="300"
|
||||||
|
*/
|
||||||
|
private int maxSwitchCaseLabels;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of alts, below which ANTLR will not choose to generate a switch
|
||||||
|
* statement over an if statement.
|
||||||
|
*/
|
||||||
|
private int minSwitchAlts;
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------
|
||||||
|
* The following are Maven specific parameters, rather than specificlly
|
||||||
|
* options that the ANTLR tool can use.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Provides an explicit list of all the grammars that should
|
||||||
|
* be included in the generate phase of the plugin. Note that the plugin
|
||||||
|
* is smart enough to realize that imported grammars should be included but
|
||||||
|
* not acted upon directly by the ANTLR Tool.
|
||||||
|
*
|
||||||
|
* Unless otherwise specified, the include list scans for and includes all
|
||||||
|
* files that end in ".g" in any directory beneath src/main/antlr4. Note that
|
||||||
|
* this version of the plugin looks for the directory antlr4 and not the directory
|
||||||
|
* antlr, so as to avoid clashes and confusion for projects that use both v3 and v4 grammars
|
||||||
|
* such as ANTLR itself.
|
||||||
|
*
|
||||||
|
* @parameter
|
||||||
|
*/
|
||||||
|
protected Set<String> includes = new HashSet<String>();
|
||||||
|
/**
|
||||||
|
* Provides an explicit list of any grammars that should be excluded from
|
||||||
|
* the generate phase of the plugin. Files listed here will not be sent for
|
||||||
|
* processing by the ANTLR tool.
|
||||||
|
*
|
||||||
|
* @parameter
|
||||||
|
*/
|
||||||
|
protected Set<String> excludes = new HashSet<String>();
|
||||||
|
/**
|
||||||
|
* @parameter expression="${project}"
|
||||||
|
* @required
|
||||||
|
* @readonly
|
||||||
|
*/
|
||||||
|
protected MavenProject project;
|
||||||
|
/**
|
||||||
|
* Specifies the Antlr directory containing grammar files. For
|
||||||
|
* antlr version 4.x we default this to a directory in the tree
|
||||||
|
* called antlr4 because the antlr3 directory is occupied by version
|
||||||
|
* 3.x grammars.
|
||||||
|
*
|
||||||
|
* @parameter default-value="${basedir}/src/main/antlr4"
|
||||||
|
* @required
|
||||||
|
*/
|
||||||
|
private File sourceDirectory;
|
||||||
|
/**
|
||||||
|
* Location for generated Java files. For antlr version 4.x we default
|
||||||
|
* this to a directory in the tree called antlr4 because the antlr
|
||||||
|
* directory is occupied by version 2.x grammars.
|
||||||
|
*
|
||||||
|
* @parameter default-value="${project.build.directory}/generated-sources/antlr4"
|
||||||
|
* @required
|
||||||
|
*/
|
||||||
|
private File outputDirectory;
|
||||||
|
/**
|
||||||
|
* Location for imported token files, e.g. <code>.tokens</code> and imported grammars.
|
||||||
|
* Note that ANTLR will not try to process grammars that it finds to be imported
|
||||||
|
* into other grammars (in the same processing session).
|
||||||
|
*
|
||||||
|
* @parameter default-value="${basedir}/src/main/antlr4/imports"
|
||||||
|
*/
|
||||||
|
private File libDirectory;
|
||||||
|
|
||||||
|
public File getSourceDirectory() {
|
||||||
|
return sourceDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getOutputDirectory() {
|
||||||
|
return outputDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getLibDirectory() {
|
||||||
|
return libDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addSourceRoot(File outputDir) {
|
||||||
|
project.addCompileSourceRoot(outputDir.getPath());
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* An instance of the ANTLR tool build
|
||||||
|
*/
|
||||||
|
protected Tool tool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main entry point for this Mojo, it is responsible for converting
|
||||||
|
* ANTLR 4.x grammars into the target language specified by the grammar.
|
||||||
|
*
|
||||||
|
* @throws org.apache.maven.plugin.MojoExecutionException When something is disvocered such as a missing source
|
||||||
|
* @throws org.apache.maven.plugin.MojoFailureException When something really bad happesn such as not being able to create the ANTLR Tool
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void execute()
|
||||||
|
throws MojoExecutionException, MojoFailureException {
|
||||||
|
|
||||||
|
Log log = getLog();
|
||||||
|
|
||||||
|
// Check to see if the user asked for debug information, then dump all the
|
||||||
|
// parameters we have picked up if they did.
|
||||||
|
//
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
|
||||||
|
// Excludes
|
||||||
|
//
|
||||||
|
for (String e : excludes) {
|
||||||
|
log.debug("ANTLR: Exclude: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Includes
|
||||||
|
//
|
||||||
|
for (String e : includes) {
|
||||||
|
log.debug("ANTLR: Include: " + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output location
|
||||||
|
//
|
||||||
|
log.debug("ANTLR: Output: " + outputDirectory);
|
||||||
|
|
||||||
|
// Library directory
|
||||||
|
//
|
||||||
|
log.debug("ANTLR: Library: " + libDirectory);
|
||||||
|
|
||||||
|
// Flags
|
||||||
|
//
|
||||||
|
log.debug("ANTLR: report : " + report);
|
||||||
|
log.debug("ANTLR: printGrammar : " + printGrammar);
|
||||||
|
log.debug("ANTLR: debug : " + debug);
|
||||||
|
log.debug("ANTLR: profile : " + profile);
|
||||||
|
log.debug("ANTLR: atn : " + atn);
|
||||||
|
log.debug("ANTLR: trace : " + trace);
|
||||||
|
log.debug("ANTLR: messageFormat : " + messageFormat);
|
||||||
|
log.debug("ANTLR: maxSwitchCaseLabels : " + maxSwitchCaseLabels);
|
||||||
|
log.debug("ANTLR: minSwitchAlts : " + minSwitchAlts);
|
||||||
|
log.debug("ANTLR: verbose : " + verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the output directory path is all in tact so that
|
||||||
|
// ANTLR can just write into it.
|
||||||
|
//
|
||||||
|
File outputDir = getOutputDirectory();
|
||||||
|
|
||||||
|
if (!outputDir.exists()) {
|
||||||
|
outputDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> args = new ArrayList<String>();
|
||||||
|
|
||||||
|
if (getOutputDirectory() != null) {
|
||||||
|
args.add("-o");
|
||||||
|
args.add(outputDir.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Where do we want ANTLR to look for .tokens and import grammars?
|
||||||
|
//
|
||||||
|
if (getLibDirectory() != null && getLibDirectory().exists()) {
|
||||||
|
args.add("-lib");
|
||||||
|
args.add(libDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next we need to set the options given to us in the pom into the
|
||||||
|
// tool instance we have created.
|
||||||
|
//
|
||||||
|
if (debug) {
|
||||||
|
args.add("-debug");
|
||||||
|
}
|
||||||
|
if (atn) {
|
||||||
|
args.add("-atn");
|
||||||
|
}
|
||||||
|
if (profile) {
|
||||||
|
args.add("-profile");
|
||||||
|
}
|
||||||
|
if (report) {
|
||||||
|
args.add("-report");
|
||||||
|
}
|
||||||
|
if (printGrammar) {
|
||||||
|
args.add("-print");
|
||||||
|
}
|
||||||
|
if (verbose_dfa) {
|
||||||
|
args.add("-Xverbose-dfa");
|
||||||
|
}
|
||||||
|
if (messageFormat != null && !"".equals(messageFormat)) {
|
||||||
|
args.add("-message-format");
|
||||||
|
args.add(messageFormat);
|
||||||
|
}
|
||||||
|
if (force_atn) {
|
||||||
|
args.add("-Xforce-atn");
|
||||||
|
}
|
||||||
|
if (abstract_recognizer) {
|
||||||
|
args.add("-abstract");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// Now pick up all the files and process them with the Tool
|
||||||
|
//
|
||||||
|
processGrammarFiles(args, sourceDirectory, outputDirectory);
|
||||||
|
|
||||||
|
} catch (InclusionScanException ie) {
|
||||||
|
|
||||||
|
log.error(ie);
|
||||||
|
throw new MojoExecutionException("Fatal error occured while evaluating the names of the grammar files to analyze");
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
getLog().error(e);
|
||||||
|
throw new MojoExecutionException(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an instance of the ANTLR 4 build tool
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
tool = new Tool(args.toArray(new String[args.size()])) {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void process(Grammar g, boolean gencode) {
|
||||||
|
getLog().info("Processing grammar: " + g.fileName);
|
||||||
|
super.process(g, gencode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Writer getOutputFileWriter(Grammar g, String fileName) throws IOException {
|
||||||
|
if (outputDirectory == null) {
|
||||||
|
return new StringWriter();
|
||||||
|
}
|
||||||
|
// output directory is a function of where the grammar file lives
|
||||||
|
// for subdir/T.g4, you get subdir here. Well, depends on -o etc...
|
||||||
|
// But, if this is a .tokens file, then we force the output to
|
||||||
|
// be the base output directory (or current directory if there is not a -o)
|
||||||
|
//
|
||||||
|
File outputDir;
|
||||||
|
if ( fileName.endsWith(CodeGenerator.VOCAB_FILE_EXTENSION) ) {
|
||||||
|
outputDir = new File(outputDirectory);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outputDir = getOutputDirectory(g.fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
File outputFile = new File(outputDir, fileName);
|
||||||
|
if (!outputDir.exists()) {
|
||||||
|
outputDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
URI relativePath = project.getBasedir().toURI().relativize(outputFile.toURI());
|
||||||
|
getLog().info(" Writing file: " + relativePath);
|
||||||
|
FileWriter fw = new FileWriter(outputFile);
|
||||||
|
return new BufferedWriter(fw);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
tool.addListener(new Antlr4ErrorLog(log));
|
||||||
|
|
||||||
|
// we set some options directly
|
||||||
|
tool.trace = trace;
|
||||||
|
|
||||||
|
// Where do we want ANTLR to produce its output? (Base directory)
|
||||||
|
//
|
||||||
|
if (log.isDebugEnabled())
|
||||||
|
{
|
||||||
|
log.debug("Output directory base will be " + outputDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tell ANTLR that we always want the output files to be produced in the output directory
|
||||||
|
// using the same relative path as the input file was to the input directory.
|
||||||
|
//
|
||||||
|
// tool.setForceRelativeOutput(true);
|
||||||
|
|
||||||
|
// Set working directory for ANTLR to be the base source directory
|
||||||
|
//
|
||||||
|
tool.inputDirectory = sourceDirectory;
|
||||||
|
|
||||||
|
if (!sourceDirectory.exists()) {
|
||||||
|
if (log.isInfoEnabled()) {
|
||||||
|
log.info("No ANTLR 4 grammars to compile in " + sourceDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (log.isInfoEnabled()) {
|
||||||
|
log.info("ANTLR 4: Processing source directory " + sourceDirectory.getAbsolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("The attempt to create the ANTLR 4 build tool failed, see exception report for details", e);
|
||||||
|
|
||||||
|
throw new MojoFailureException("Jim failed you!");
|
||||||
|
}
|
||||||
|
|
||||||
|
tool.processGrammarsOnCommandLine();
|
||||||
|
|
||||||
|
// If any of the grammar files caused errors but did nto throw exceptions
|
||||||
|
// then we should have accumulated errors in the counts
|
||||||
|
//
|
||||||
|
if (tool.getNumErrors() > 0) {
|
||||||
|
throw new MojoExecutionException("ANTLR 4 caught " + tool.getNumErrors() + " build errors.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// All looks good, so we need to tel Maven about the sources that
|
||||||
|
// we just created.
|
||||||
|
//
|
||||||
|
if (project != null) {
|
||||||
|
// Tell Maven that there are some new source files underneath
|
||||||
|
// the output directory.
|
||||||
|
//
|
||||||
|
addSourceRoot(this.getOutputDirectory());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param sourceDirectory
|
||||||
|
* @param outputDirectory
|
||||||
|
* @throws antlr.TokenStreamException
|
||||||
|
* @throws antlr.RecognitionException
|
||||||
|
* @throws java.io.IOException
|
||||||
|
* @throws org.codehaus.plexus.compiler.util.scan.InclusionScanException
|
||||||
|
*/
|
||||||
|
private void processGrammarFiles(List<String> args, File sourceDirectory, File outputDirectory)
|
||||||
|
throws TokenStreamException, RecognitionException, IOException, InclusionScanException {
|
||||||
|
// Which files under the source set should we be looking for as grammar files
|
||||||
|
//
|
||||||
|
SourceMapping mapping = new SuffixMapping("g4", Collections.EMPTY_SET);
|
||||||
|
|
||||||
|
// What are the sets of includes (defaulted or otherwise).
|
||||||
|
//
|
||||||
|
Set<String> includes = getIncludesPatterns();
|
||||||
|
|
||||||
|
// Now, to the excludes, we need to add the imports directory
|
||||||
|
// as this is autoscanned for importd grammars and so is auto-excluded from the
|
||||||
|
// set of gramamr fiels we shuold be analyzing.
|
||||||
|
//
|
||||||
|
excludes.add("imports/**");
|
||||||
|
|
||||||
|
SourceInclusionScanner scan = new SimpleSourceInclusionScanner(includes, excludes);
|
||||||
|
|
||||||
|
scan.addSourceMapping(mapping);
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Set<File> grammarFiles = (Set<File>)scan.getIncludedSources(sourceDirectory, null);
|
||||||
|
|
||||||
|
if (grammarFiles.isEmpty()) {
|
||||||
|
if (getLog().isInfoEnabled()) {
|
||||||
|
getLog().info("No grammars to process");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Tell the ANTLR tool that we want sorted build mode
|
||||||
|
//
|
||||||
|
// tool.setMake(true);
|
||||||
|
|
||||||
|
// Iterate each grammar file we were given and add it into the tool's list of
|
||||||
|
// grammars to process.
|
||||||
|
//
|
||||||
|
for (File grammar : grammarFiles) {
|
||||||
|
|
||||||
|
if (getLog().isDebugEnabled()) {
|
||||||
|
getLog().debug("Grammar file '" + grammar.getPath() + "' detected.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
String relPath = findSourceSubdir(sourceDirectory, grammar.getPath()) + grammar.getName();
|
||||||
|
|
||||||
|
if (getLog().isDebugEnabled()) {
|
||||||
|
getLog().debug(" ... relative path is: " + relPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
args.add(relPath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getIncludesPatterns() {
|
||||||
|
if (includes == null || includes.isEmpty()) {
|
||||||
|
return Collections.singleton("**/*.g4");
|
||||||
|
}
|
||||||
|
return includes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given the source directory File object and the full PATH to a
|
||||||
|
* grammar, produce the path to the named grammar file in relative
|
||||||
|
* terms to the sourceDirectory. This will then allow ANTLR to
|
||||||
|
* produce output relative to the base of the output directory and
|
||||||
|
* reflect the input organization of the grammar files.
|
||||||
|
*
|
||||||
|
* @param sourceDirectory The source directory File object
|
||||||
|
* @param grammarFileName The full path to the input grammar file
|
||||||
|
* @return The path to the grammar file relative to the source directory
|
||||||
|
*/
|
||||||
|
private String findSourceSubdir(File sourceDirectory, String grammarFileName) {
|
||||||
|
String srcPath = sourceDirectory.getPath() + File.separator;
|
||||||
|
|
||||||
|
if (!grammarFileName.startsWith(srcPath)) {
|
||||||
|
throw new IllegalArgumentException("expected " + grammarFileName + " to be prefixed with " + sourceDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
File unprefixedGrammarFileName = new File(grammarFileName.substring(srcPath.length()));
|
||||||
|
|
||||||
|
return unprefixedGrammarFileName.getParent() + File.separator;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
Imported Grammar Files
|
||||||
|
|
||||||
|
In order to have the ANTLR plugin automatically locate and use grammars used
|
||||||
|
as imports in your main .g4 files, you need to place the imported grammar
|
||||||
|
files in the imports directory beneath the root directory of your grammar
|
||||||
|
files (which is <<<src/main/antlr4>>> by default of course).
|
||||||
|
|
||||||
|
For a default layout, place your import grammars in the directory: <<<src/main/antlr4/imports>>>
|
|
@ -0,0 +1,47 @@
|
||||||
|
Libraries
|
||||||
|
|
||||||
|
The introduction of the import directive in a grammar allows reuse of common grammar files
|
||||||
|
as well as the ability to divide up functional components of large grammars. However it has
|
||||||
|
caused some confusion in regard to the fact that generated vocab files (<<<xxx.tokens>>>) can also
|
||||||
|
be searched for with the <<<<libDirectory>>>> directive.
|
||||||
|
|
||||||
|
This has confused two separate functions and imposes a structure upon the layout of
|
||||||
|
your grammar files in certain cases. If you have grammars that both use the import
|
||||||
|
directive and also require the use of a vocab file then you will need to locate
|
||||||
|
the grammar that generates the .tokens file alongside the grammar that uses it. This
|
||||||
|
is because you will need to use the <<<<libDirectory>>>> directive to specify the
|
||||||
|
location of your imported grammars and ANTLR will not find any vocab files in
|
||||||
|
this directory.
|
||||||
|
|
||||||
|
The .tokens files for any grammars are generated within the same output directory structure
|
||||||
|
as the .java files. So, whereever the .java files are generated, you will also find the .tokens
|
||||||
|
files. ANTLR looks for .tokens files in both the <<<<libDirectory>>>> and the output directory
|
||||||
|
where it is placing the geenrated .java files. Hence when you locate the grammars that generate
|
||||||
|
.tokens files in the same source directory as the ones that use the .tokens files, then
|
||||||
|
the Maven plugin will find the expected .tokens files.
|
||||||
|
|
||||||
|
The <<<<libDirectory>>>> is specified like any other directory parameter in Maven. Here is an
|
||||||
|
example:
|
||||||
|
|
||||||
|
+--
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.antlr</groupId>
|
||||||
|
<artifactId>antlr4-maven-plugin</artifactId>
|
||||||
|
<version>4.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<executions>
|
||||||
|
|
||||||
|
<execution>
|
||||||
|
<configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>antlr</goal>
|
||||||
|
</goals>
|
||||||
|
<libDirectory>src/main/antlr4_imports</libDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
+--
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
Simple configuration
|
||||||
|
|
||||||
|
If your grammar files are organized into the default locations as described in the {{{../index.html}introduction}},
|
||||||
|
then configuring the pom.xml file for your project is as simple as adding this to it
|
||||||
|
|
||||||
|
+--
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.antlr</groupId>
|
||||||
|
<artifactId>antlr4-maven-plugin</artifactId>
|
||||||
|
<version>4.0-SNAPSHOT</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>antlr</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
...
|
||||||
|
</plugins>
|
||||||
|
+--
|
||||||
|
|
||||||
|
When the mvn command is executed all grammar files under <<<src/main/antlr4>>>, except any
|
||||||
|
import grammars under <<<src/main/antlr4/imports>>> will be analyzed and converted to
|
||||||
|
java source code in the output directory <<<target/generated-sources/antlr4>>>.
|
||||||
|
|
||||||
|
Your input files under <<<antlr4>>> should be stored in sub directories that
|
||||||
|
reflect the package structure of your java parsers. If your grammar file parser.g4 contains:
|
||||||
|
|
||||||
|
+---
|
||||||
|
@header {
|
||||||
|
package org.jimi.themuss;
|
||||||
|
}
|
||||||
|
+---
|
||||||
|
|
||||||
|
Then the .g4 file should be stored in: <<<src/main/antlr4/org/jimi/themuss/parser.g4>>>. THis way
|
||||||
|
the generated .java files will correctly reflect the package structure in which they will
|
||||||
|
finally rest as classes.
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
-------------
|
||||||
|
ANTLR v4 Maven Plugin
|
||||||
|
-------------
|
||||||
|
Jim Idle
|
||||||
|
-------------
|
||||||
|
March 2009
|
||||||
|
-------------
|
||||||
|
|
||||||
|
ANTLR v4 Maven plugin
|
||||||
|
|
||||||
|
The ANTLR v4 Maven plugin is completely re-written as of version 4.0; if you are familiar
|
||||||
|
with prior versions, you should note that there are some behavioral differences that make
|
||||||
|
it worthwhile reading this documentation.
|
||||||
|
|
||||||
|
The job of the plugin is essentially to tell the standard ANTLR parser generator where the
|
||||||
|
input grammar files are and where the output files should be generated. As with all Maven
|
||||||
|
plugins, there are defaults, which you are advised to comply to, but are not forced to
|
||||||
|
comply to.
|
||||||
|
|
||||||
|
This version of the plugin allows full control over ANTLR and allows configuration of all
|
||||||
|
options that are useful for a build system. The code required to calculate dependencies,
|
||||||
|
check the build order, and otherwise work with your grammar files is built into the ANTLR
|
||||||
|
tool as of version 4.0 of ANTLR and this plugin.
|
||||||
|
|
||||||
|
* Plugin Versioning
|
||||||
|
|
||||||
|
The plugin version tracks the version of the ANTLR tool that it controls. Hence if you
|
||||||
|
use version 4.0 of the plugin, you will build your grammars using version 4.0 of the
|
||||||
|
ANTLR tool, version 4.2 of the plugin will use version 4.2 of the ANTLR tool and so on.
|
||||||
|
|
||||||
|
You may also find that there are patch versions of the plugin suchas 4.0-1 4.0-2 and
|
||||||
|
so on. Use the latest patch release of the plugin.
|
||||||
|
|
||||||
|
The current version of the plugin is shown at the top of this page after the <<Last Deployed>> date.
|
||||||
|
|
||||||
|
|
||||||
|
* Default directories
|
||||||
|
|
||||||
|
As with all Maven plugins, this plugin will automatically default to standard locations
|
||||||
|
for your grammar and import files. Organizing your source code to reflect this standard
|
||||||
|
layout will greatly reduce the configuration effort required. The standard layout lookd
|
||||||
|
like this:
|
||||||
|
|
||||||
|
+--
|
||||||
|
src/main/
|
||||||
|
|
|
||||||
|
+--- antlr4/... .g4 files organized in the required package structure
|
||||||
|
|
|
||||||
|
+--- imports/ .g4 files that are imported by other grammars.
|
||||||
|
+--
|
||||||
|
|
||||||
|
If your grammar is intended to be part of a package called org.foo.bar then you would
|
||||||
|
place it in the directory <<<src/main/antlr4/org/foo/bar>>>. The plugin will then produce
|
||||||
|
.java and .tokens files in the output directory <<<target/generated-sources/antlr4/org/foo/bar>>>
|
||||||
|
When the Java files are compiled they will be in the correct location for the javac
|
||||||
|
compiler without any special configuration. The generated java files are automatically
|
||||||
|
submitted for compilation by the plugin.
|
||||||
|
|
||||||
|
The <<<src/main/antlr4/imports>>> directory is treated in a special way. It should contain
|
||||||
|
any grammar files that are imported by other grammar files (do not make subdirectories here.)
|
||||||
|
Such files are never built on their own, but the plugin will automatically tell the ANTLR
|
||||||
|
tool to look in this directory for library files.
|
||||||
|
|
|
@ -0,0 +1,193 @@
|
||||||
|
Usage
|
||||||
|
|
||||||
|
The Maven plugin for antlr is simple to use but is at its simplest when you use the default
|
||||||
|
layouts for your grammars, as so:
|
||||||
|
|
||||||
|
+--
|
||||||
|
src/main/
|
||||||
|
|
|
||||||
|
+--- antlr4/... .g4 files organized in the required package structure
|
||||||
|
|
|
||||||
|
+--- imports/ .g4 files that are imported by other grammars.
|
||||||
|
+--
|
||||||
|
|
||||||
|
However, if you are not able to use this structure for whatever reason, you
|
||||||
|
can configure the locations of the grammar files, where library/import files
|
||||||
|
are located and where the output files should be generated.
|
||||||
|
|
||||||
|
* Plugin Descriptor
|
||||||
|
|
||||||
|
The current version of the plugin is shown at the top of this page after the <<Last Deployed>> date.
|
||||||
|
|
||||||
|
The full layout of the descriptor (at least, those parts that are not standard Maven things),
|
||||||
|
showing the default values of the configuration options, is as follows:
|
||||||
|
|
||||||
|
+--
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.antlr</groupId>
|
||||||
|
<artifactId>antlr4-maven-plugin</artifactId>
|
||||||
|
<version>4.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<executions>
|
||||||
|
|
||||||
|
<execution>
|
||||||
|
<configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>antlr</goal>
|
||||||
|
</goals>
|
||||||
|
<conversionTimeout>10000</conversionTimeout>
|
||||||
|
<debug>false</debug>
|
||||||
|
<dfa>false</dfa>
|
||||||
|
<nfa>false</nfa>
|
||||||
|
<excludes><exclude/></excludes>
|
||||||
|
<includes><include/></includes>
|
||||||
|
<libDirectory>src/main/antlr4/imports</libDirectory>
|
||||||
|
<messageFormat>antlr</messageFormat>
|
||||||
|
<outputDirectory>target/generated-sources/antlr4</outputDirectory>
|
||||||
|
<printGrammar>false</printGrammar>
|
||||||
|
<profile>false</profile>
|
||||||
|
<report>false</report>
|
||||||
|
<sourceDirectory>src/main/antlr4</sourceDirectory>
|
||||||
|
<trace>false</trace>
|
||||||
|
<verbose>true</verbose>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
|
||||||
|
</plugin>
|
||||||
|
+--
|
||||||
|
|
||||||
|
Note that you can create multiple executions, and thus build some grammars with different
|
||||||
|
options to others (such as setting the debug option for instance).
|
||||||
|
|
||||||
|
** Configuration parameters
|
||||||
|
|
||||||
|
*** report
|
||||||
|
|
||||||
|
If set to true, then after the tool has processed an input grammar file
|
||||||
|
it will report variaous statistics about the parser, such as information
|
||||||
|
on cyclic DFAs, which rules may use backtracking, and so on.
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
*** printGrammar
|
||||||
|
|
||||||
|
If set to true, then the ANTLR tool will print a version of the input
|
||||||
|
grammar which is devoid of any actions that may be present in the input file.
|
||||||
|
|
||||||
|
default-value = "false"
|
||||||
|
|
||||||
|
*** debug
|
||||||
|
|
||||||
|
If set to true, then the code generated by the ANTLR code generator will
|
||||||
|
be set to debug mode. This means that when run, the code will 'hang' and
|
||||||
|
wait for a debug connection on a TCP port (49100 by default).
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
*** profile
|
||||||
|
|
||||||
|
If set to true, then then the generated parser will compute and report on
|
||||||
|
profile information at runtime.
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
*** nfa
|
||||||
|
|
||||||
|
If set to true then the ANTLR tool will generate a description of the nfa
|
||||||
|
for each rule in <a href="http://www.graphviz.org">Dot format</a>
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
protected boolean nfa;
|
||||||
|
|
||||||
|
*** dfa
|
||||||
|
|
||||||
|
If set to true then the ANTLR tool will generate a description of the DFA
|
||||||
|
for each decision in the grammar in <a href="http://www.graphviz.org">Dot format</a>
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
*** trace
|
||||||
|
|
||||||
|
If set to true, the generated parser code will log rule entry and exit points
|
||||||
|
to stdout as an aid to debugging.
|
||||||
|
|
||||||
|
default-value="false"
|
||||||
|
|
||||||
|
*** messageFormat
|
||||||
|
|
||||||
|
If this parameter is set, it indicates that any warning or error messages returned
|
||||||
|
by ANLTR, shoould be formatted in the specified way. Currently, ANTLR supports the
|
||||||
|
built-in formats of antlr, gnu and vs2005.
|
||||||
|
|
||||||
|
default-value="antlr"
|
||||||
|
|
||||||
|
*** verbose
|
||||||
|
|
||||||
|
If this parameter is set to true, then ANTLR will report all sorts of things
|
||||||
|
about what it is doing such as the names of files and the version of ANTLR and so on.
|
||||||
|
|
||||||
|
default-value="true"
|
||||||
|
|
||||||
|
*** conversionTimeout
|
||||||
|
|
||||||
|
The number of milliseconds ANTLR will wait for analysis of each
|
||||||
|
alternative in the grammar to complete before giving up. You may raise
|
||||||
|
this value if ANTLR gives up on a complicated alt and tells you that
|
||||||
|
there are lots of ambiguties, but you know that it just needed to spend
|
||||||
|
more time on it. Note that this is an absolute time and not CPU time.
|
||||||
|
|
||||||
|
default-value="10000"
|
||||||
|
|
||||||
|
*** includes
|
||||||
|
|
||||||
|
Provides an explicit list of all the grammars that should
|
||||||
|
be included in the generate phase of the plugin. Note that the plugin
|
||||||
|
is smart enough to realize that imported grammars should be included but
|
||||||
|
not acted upon directly by the ANTLR Tool.
|
||||||
|
|
||||||
|
Unless otherwise specified, the include list scans for and includes all
|
||||||
|
files that end in ".g4" in any directory beneath src/main/antlr4. Note that
|
||||||
|
this version of the plugin looks for the directory antlr4 and not the directory
|
||||||
|
antlr, so as to avoid clashes and confusion for projects that use both v3 and v4 grammars
|
||||||
|
such as ANTLR itself.
|
||||||
|
|
||||||
|
*** excludes
|
||||||
|
|
||||||
|
Provides an explicit list of any grammars that should be excluded from
|
||||||
|
the generate phase of the plugin. Files listed here will not be sent for
|
||||||
|
processing by the ANTLR tool.
|
||||||
|
|
||||||
|
*** sourceDirectory
|
||||||
|
|
||||||
|
Specifies the Antlr directory containing grammar files. For
|
||||||
|
antlr version 4.x we default this to a directory in the tree
|
||||||
|
called antlr4 because the antlr directory is occupied by version
|
||||||
|
2.x grammars.
|
||||||
|
|
||||||
|
<<NB>> Take careful note that the default location for antlr grammars
|
||||||
|
is now <<antlr4>> and NOT <<antlr>>
|
||||||
|
|
||||||
|
default-value="<<<${basedir}/src/main/antlr4>>>"
|
||||||
|
|
||||||
|
*** outputDirectory
|
||||||
|
|
||||||
|
Location for generated Java files. For antlr version 4.x we default
|
||||||
|
this to a directory in the tree called antlr4 because the antlr
|
||||||
|
directory is occupied by version 2.x grammars.
|
||||||
|
|
||||||
|
default-value="<<<${project.build.directory}/generated-sources/antlr4>>>"
|
||||||
|
|
||||||
|
*** libDirectory
|
||||||
|
|
||||||
|
Location for imported token files, e.g. <code>.tokens</code> and imported grammars.
|
||||||
|
Note that ANTLR will not try to process grammars that it finds in this directory, but
|
||||||
|
will include this directory in the search for .tokens files and import grammars.
|
||||||
|
|
||||||
|
<<NB>> If you change the lib directory from the default but the directory is
|
||||||
|
still under<<<${basedir}/src/main/antlr4>>>, then you will need to exclude
|
||||||
|
the grammars from processing specifically, using the <<<<excludes>>>> option.
|
||||||
|
|
||||||
|
default-value="<<<${basedir}/src/main/antlr4/imports>>>"
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<project name="ANTLR v4 Maven plugin">
|
||||||
|
|
||||||
|
<publishDate position="left"/>
|
||||||
|
<version position="left"/>
|
||||||
|
|
||||||
|
<poweredBy>
|
||||||
|
<logo name="ANTLR Web Site" href="http://antlr.org/"
|
||||||
|
img="http://www.antlr.org/wiki/download/attachments/292/ANTLR4"/>
|
||||||
|
</poweredBy>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<links>
|
||||||
|
<item name="Antlr Web Site" href="http://www.antlr.org/"/>
|
||||||
|
</links>
|
||||||
|
|
||||||
|
<menu name="Overview">
|
||||||
|
<item name="Introduction" href="index.html"/>
|
||||||
|
<item name="Usage" href="usage.html"/>
|
||||||
|
</menu>
|
||||||
|
|
||||||
|
<menu name="Examples">
|
||||||
|
<item name="Simple configurations" href="examples/simple.html"/>
|
||||||
|
<item name="Using library directories" href="examples/libraries.html"/>
|
||||||
|
<item name="Using imported grammars" href="examples/import.html"/>
|
||||||
|
</menu>
|
||||||
|
|
||||||
|
<menu ref="reports" />
|
||||||
|
<menu ref="modules" />
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</project>
|
|
@ -111,6 +111,7 @@ public class Tool {
|
||||||
|
|
||||||
// fields set by option manager
|
// fields set by option manager
|
||||||
|
|
||||||
|
public File inputDirectory;
|
||||||
public String outputDirectory;
|
public String outputDirectory;
|
||||||
public String libDirectory;
|
public String libDirectory;
|
||||||
public boolean report = false;
|
public boolean report = false;
|
||||||
|
@ -490,7 +491,12 @@ public class Tool {
|
||||||
|
|
||||||
public GrammarRootAST loadGrammar(String fileName) {
|
public GrammarRootAST loadGrammar(String fileName) {
|
||||||
try {
|
try {
|
||||||
ANTLRFileStream in = new ANTLRFileStream(fileName, grammarEncoding);
|
File file = new File(fileName);
|
||||||
|
if (!file.isAbsolute()) {
|
||||||
|
file = new File(inputDirectory, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
ANTLRFileStream in = new ANTLRFileStream(file.getAbsolutePath(), grammarEncoding);
|
||||||
GrammarRootAST t = load(in);
|
GrammarRootAST t = load(in);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -629,7 +635,7 @@ public class Tool {
|
||||||
}
|
}
|
||||||
|
|
||||||
public File getImportedGrammarFile(Grammar g, String fileName) {
|
public File getImportedGrammarFile(Grammar g, String fileName) {
|
||||||
File importedFile = new File(fileName);
|
File importedFile = new File(inputDirectory, fileName);
|
||||||
if ( !importedFile.exists() ) {
|
if ( !importedFile.exists() ) {
|
||||||
File gfile = new File(g.fileName);
|
File gfile = new File(g.fileName);
|
||||||
String parentDir = gfile.getParent();
|
String parentDir = gfile.getParent();
|
||||||
|
|
Loading…
Reference in New Issue