IntelliJ Platform SDK DevGuide

Edit page

3. Grammar and Parser

3.1. Define a token type

Create a file in the com.simpleplugin.psi package.

package com.simpleplugin.psi; import com.intellij.psi.tree.IElementType; import com.simpleplugin.SimpleLanguage; import org.jetbrains.annotations.*; public class SimpleTokenType extends IElementType { public SimpleTokenType(@NotNull @NonNls String debugName) { super(debugName, SimpleLanguage.INSTANCE); } @Override public String toString() { return "SimpleTokenType." + super.toString(); } }

3.2. Define an element type

Create a file in the com.simpleplugin.psi package.

package com.simpleplugin.psi; import com.intellij.psi.tree.IElementType; import com.simpleplugin.SimpleLanguage; import org.jetbrains.annotations.*; public class SimpleElementType extends IElementType { public SimpleElementType(@NotNull @NonNls String debugName) { super(debugName, SimpleLanguage.INSTANCE); } }

3.3. Define grammar

Define a grammar for the properties language with /com/simpleplugin/Simple.bnf file.

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

As you see a properties file can contain properties, comments and line breaks.

The grammar defines how flexible the support for a language can be. We specified that a property may have or may not have key and value. This lets the IDE still recognise incorrectly defined properties and provide corresponding code analysis and quick-fixes.

Note that the SimpleTypes class in the elementTypeHolderClass field above specifies the name of a class that gets generated from the grammar, it doesn’t exist at this point.

3.4. Generate a parser

Now when the grammar is defined we can generate a parser with PSI classes via Generate Parser Code from the context menu on Simple.bnf file. This will generate a parser and PSI elements in gen folder. Mark this folder as Generated Sources Root and make sure everything is compiled without errors.

Parser

Last modified: 12 October 2017