3. Grammar and Parser
Edit pageLast modified: 14 May 2024Reference: Implementing Lexer, Implementing Parser and PSI
Code: SimpleTokenType
, SimpleElementType
tip
This page is part of multi-step Custom Language Support Tutorial. All previous steps must be executed in sequence for the code to work.
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
{
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
tip
Gradle Grammar-Kit Plugin can be used alternatively.

Add Generated Sources Root
To include the sources generated into 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.
Thanks for your feedback!