IntelliJ Platform Plugin SDK Help

3. Grammar and Parser

In order for the IntelliJ Platform to parse a Simple Language file, tokens and elements must be defined based on IElementType. The Simple Language grammar must also be defined to generate a parser.

Define a Token Type

Create SimpleTokenType in the org.intellij.sdk.language.psi package by subclassing IElementType.

public class SimpleTokenType extends IElementType { public SimpleTokenType(@NotNull @NonNls String debugName) { super(debugName, SimpleLanguage.INSTANCE); } @Override public String toString() { return "SimpleTokenType." + super.toString(); } }

Define an Element Type

Create the SimpleElementType in the org.intellij.sdk.language.psi package by subclassing IElementType.

public class SimpleElementType extends IElementType { public SimpleElementType(@NotNull @NonNls String debugName) { super(debugName, SimpleLanguage.INSTANCE); } }

Define the Grammar

Define a grammar for the Simple Language in the org/intellij/sdk/language/Simple.bnf file.

{ parserClass="org.intellij.sdk.language.parser.SimpleParser" extends="com.intellij.extapi.psi.ASTWrapperPsiElement" psiClassPrefix="Simple" psiImplClassSuffix="Impl" psiPackage="org.intellij.sdk.language.psi" psiImplPackage="org.intellij.sdk.language.psi.impl" elementTypeHolderClass="org.intellij.sdk.language.psi.SimpleTypes" elementTypeClass="org.intellij.sdk.language.psi.SimpleElementType" tokenTypeClass="org.intellij.sdk.language.psi.SimpleTokenType" } simpleFile ::= item_* private item_ ::= (property|COMMENT|CRLF) property ::= (KEY? SEPARATOR VALUE?) | KEY

Please see Grammar-Kit documentation for more details on BNF syntax.

The grammar defines the flexibility of the support for a language. The above grammar specifies that a property may have or may not have a key and value. This flexibility allows the IntelliJ Platform to recognize incorrectly defined properties and provide corresponding code analysis and quick fixes.

Note that the SimpleTypes class in the elementTypeHolderClass attribute above specifies the name of a class that gets generated from the grammar in the scope of the Generate Parser Code action (see Generate a Parser); it doesn't exist at this point.

Generate a Parser

Now that the grammar is defined, generate a parser with PSI classes via Generate Parser Code from the context menu on the Simple.bnf file. This step generates a parser and PSI elements in the /src/main/gen folder of the project.

Parser

Add Generated Sources Root

To include the sources generated into /src/main/gen, the project's sourceSets must be expanded by inserting the following line in the project's Gradle build script:

sourceSets["main"].java.srcDirs("src/main/gen")
sourceSets.main.java.srcDirs 'src/main/gen'

See build.gradle.kts for the reference.

Reload the Gradle project for changes to take effect and build the project.

Last modified: 07 December 2023