# Gradle Grammar-Kit Plugin
Gradle Grammar-Kit Plugin automates generating custom language lexers and parsers when using Grammar-Kit.
**Current Release**: %gradle-grammar-kit-plugin-version%
**GitHub**: [Releases & Changelog](https://github.com/JetBrains/gradle-grammar-kit-plugin/releases), [Issue Tracker](https://github.com/JetBrains/gradle-grammar-kit-plugin/issues)
The [Gradle Grammar-Kit Plugin](https://github.com/JetBrains/gradle-grammar-kit-plugin) automates generating lexers and parsers to support building [custom language](custom_language_support.md) plugins for IntelliJ-based IDEs when using [Grammar-Kit](https://github.com/JetBrains/Grammar-Kit).
> The plugin does not support two-pass generation. Therefore, it does not support method mixins.
>
{style="note" title="Known Limitations"}
> Please see [CONTRIBUTING](https://github.com/JetBrains/gradle-grammar-kit-plugin/blob/master/CONTRIBUTING.md) on how to submit feedback and contribute to this project.
>
> Before visiting the [Issue Tracker](https://github.com/JetBrains/gradle-grammar-kit-plugin/issues), update both plugin and Gradle to the latest versions.
## Usage
To enable this plugin in your Gradle-based project, register the plugin in the Gradle build script's `plugins` section:
```kotlin
plugins {
id("org.jetbrains.grammarkit") version "%gradle-grammar-kit-plugin-version%"
}
```
```groovy
plugins {
id "org.jetbrains.grammarkit" version "%gradle-grammar-kit-plugin-version%"
}
```
> This project requires Gradle 7.4 or newer, however, it is recommended to use the latest Gradle available.
> See [Gradle Installation](https://gradle.org/install/) guide.
>
{title="Minimum Gradle Version"}
## Configuration
See also [](#usage-examples) below.
### Grammar-Kit Extension
After the Gradle Grammar-Kit Plugin is applied, the `grammarKit` extension can be used to configure the plugin and common settings of the provided tasks.
> In most cases, explicit configuration can be omitted.
>
{style="tip"}
**Example:**
```kotlin
grammarKit {
jflexRelease.set("1.7.0-1")
grammarKitRelease.set("2021.1.2")
}
```
```groovy
grammarKit {
jflexRelease = "1.7.0-1"
grammarKitRelease = "2021.1.2"
}
```
#### grammarKitRelease
{#grammar-kit-extension-grammarkitrelease}
The release version of the [Grammar-Kit](https://github.com/JetBrains/Grammar-Kit) to use.
{type="narrow"}
Type
: `String`
Default value
: `2022.3.2`
#### jflexRelease
{#grammar-kit-extension-jflexrelease}
The version of the IntelliJ-patched JFlex, a [fork of JFlex](https://github.com/JetBrains/intellij-deps-jflex) lexer generator for IntelliJ Platform API.
{type="narrow"}
Type
: `String`
Default value
: `1.9.2`
#### intellijRelease
{#grammar-kit-extension-intellijrelease}
An optional IntelliJ IDEA version to build the classpath for [`GenerateParser`](#generateparser-task) and [`GenerateLexer`](#generatelexer-task) tasks.
If provided, [`grammarKitRelease`](#grammar-kit-extension-grammarkitrelease) and [`jflexRelease`](#grammar-kit-extension-jflexrelease) properties are ignored as both dependencies will be provided from the given IntelliJ IDEA release.
{type="narrow"}
Type
: `String`
Default value
: `null`
## Tasks
### generateLexer
{#generatelexer-task}
The `generateLexer` task generates a lexer for the given grammar.
The following sections describe task configuration options.
See also [](#grammar-kit-extension) for common configuration.
#### sourceFile
{#tasks-generatelexer-source}
The source .*flex file to generate the lexer from.
{type="narrow"}
Required
: yes
Type
: `String`
#### targetOutputDir
{#tasks-generatelexer-targetOutputDir}
The path to the target directory for the generated lexer.
{type="narrow"}
Required
: yes
Type
: `String`
#### skeleton
{#tasks-generatelexer-skeleton}
An optional path to the skeleton file to use for the generated lexer.
The path will be provided as `--skel` option.
By default, it uses the [idea-flex.skeleton](https://raw.github.com/JetBrains/intellij-community/master/tools/lexer/idea-flex.skeleton) skeleton file.
{type="narrow"}
Type
: `String`
Default
: `null`
#### purgeOldFiles
{#tasks-generatelexer-purgeoldfiles}
Purge old files from the target directory before generating the lexer.
{type="narrow"}
Type
: `Boolean`
Default
: `false`
### generateParser
{#generateparser-task}
The `generateParser` task generates a parser for the given grammar.
The following sections describe task configuration options.
See also [](#grammar-kit-extension) for common configuration.
#### sourceFile
{#tasks-generateparser-source}
The source .bnf file to generate the parser from.
{type="narrow"}
Required
: yes
Type
: `String`
#### targetRootOutputDir
{#tasks-generateparser-targetrootOutputDir}
The path to the target directory for the generated parser.
{type="narrow"}
Type
: `String`
Default
: `null`
#### pathToParser
{#tasks-generateparser-pathtoparser}
The location of the generated parser class, relative to the [`targetRootOutputDir`](#tasks-generateparser-targetrootOutputDir).
{type="narrow"}
Required
: yes
Type
: `String`
#### pathToPsiRoot
{#tasks-generateparser-pathtopsiroot}
The location of the generated PSI files, relative to the [`targetRootOutputDir`](#tasks-generateparser-targetrootOutputDir).
{type="narrow"}
Required
: yes
Type
: `String`
#### purgeOldFiles
{#tasks-generateparser-purgeoldfiles}
Purge old files from the target directory before generating the parser.
{type="narrow"}
Type
: `Boolean`
Default
: `false`
## Usage Examples
* [CSV Editor](https://github.com/SeeSharpSoft/intellij-csv-validator/blob/main/build.gradle.kts)
* [Perl5 plugin](https://github.com/Camelcade/Perl5-IDEA/blob/master/plugin/core/build.gradle.kts)
* [Bamboo Soy plugin](https://github.com/google/bamboo-soy/blob/master/build.gradle)
## Links
* [Grammar-Kit](https://github.com/JetBrains/Grammar-Kit)
* [IntelliJ-patched JFlex Sources](https://github.com/JetBrains/intellij-deps-jflex)
* [IntelliJ-patched JFlex](https://cache-redirector.jetbrains.com/intellij-dependencies/org/jetbrains/intellij/deps/jflex/jflex/)