gradle-grammarkit-plugin
Important: This project requires Gradle 6.6 or newer, however it is recommended to use the latest Gradle available. Update it with:
./gradlew wrapper --gradle-version=VERSION
This Gradle plugin automates generating lexers and parsers to support custom language development in IntelliJ plugins when using Grammar-Kit.
NB: The plugin does not support two-pass generation. Therefore, it does not support method mixins.
Usage
Loading and applying the plugin
Groovy – build.gradle
plugins {
id "org.jetbrains.grammarkit" version "..."
}
Kotlin DSL – build.gradle.kts
plugins {
id("org.jetbrains.grammarkit") version "..."
}
Configuration
Global configuration allows you to select necessary JFlex and Grammar-Kit versions.
Groovy – build.gradle
grammarKit {
// Version of IntelliJ patched JFlex (see the link below), Default is 1.7.0-1
jflexRelease = "1.7.0-1"
// Release version, tag, or short commit hash of Grammar-Kit to use (see link below). By default, the latest available is used.
grammarKitRelease = "2021.1.1"
// Optionally provide an IntelliJ version to build the classpath for GenerateParser/GenerateLexer tasks
intellijRelease = "203.7717.81"
}
Kotlin DSL – build.gradle.kts
grammarKit {
// Version of IntelliJ patched JFlex (see the link below), Default is 1.7.0-1
jflexRelease.set("1.7.0-1")
// Release version, tag, or short commit hash of Grammar-Kit to use (see link below). Default is 2021.1.2
grammarKitRelease.set("2021.1.2")
// Optionally provide an IntelliJ version to build the classpath for GenerateParser/GenerateLexer tasks
intellijRelease.set("203.7717.81")
}
Tasks
Generating lexer
Groovy – build.gradle
generateLexer {
// source flex file
source = "grammar/Perl.flex"
// target directory for lexer
targetDir = "gen/com/perl5/lang/perl/lexer/"
// target classname, target file will be targetDir/targetClass.java
targetClass = "PerlLexer"
// optional, path to the task-specific skeleton file. Default: none
skeleton = "/some/specific/skeleton"
// if set, plugin will remove a lexer output file before generating new one. Default: false
purgeOldFiles = true
}
Kotlin DSL – build.gradle.kts
generateLexer {
// source flex file
source.set("grammar/Perl.flex")
// target directory for lexer
targetDir.set("gen/com/perl5/lang/perl/lexer/")
// target classname, target file will be targetDir/targetClass.java
targetClass.set("PerlLexer")
// optional, path to the task-specific skeleton file. Default: none
skeleton.set("/some/specific/skeleton")
// if set, plugin will remove a lexer output file before generating new one. Default: false
purgeOldFiles.set(true)
}
Generating parser
Groovy – build.gradle
generateParser {
// source bnf file
source = "grammar/Perl5.bnf"
// optional, task-specific root for the generated files. Default: none
targetRoot = "gen"
// path to a parser file, relative to the targetRoot
pathToParser = "/com/perl5/lang/perl/parser/PerlParserGenerated.java"
// path to a directory with generated psi files, relative to the targetRoot
pathToPsiRoot = "/com/perl5/lang/perl/psi"
// if set, the plugin will remove a parser output file and psi output directory before generating new ones. Default: false
purgeOldFiles = true
}
Kotlin DSL – build.gradle.kts
generateParser {
// source bnf file
source.set("grammar/Perl5.bnf")
// optional, task-specific root for the generated files. Default: none
targetRoot.set("gen")
// path to a parser file, relative to the targetRoot
pathToParser.set("/com/perl5/lang/perl/parser/PerlParserGenerated.java")
// path to a directory with generated psi files, relative to the targetRoot
pathToPsiRoot.set("/com/perl5/lang/perl/psi")
// if set, the plugin will remove a parser output file and psi output directory before generating new ones. Default: false
purgeOldFiles.set(true)
}