2020-02-10 09:40:22 -08:00

2.7 KiB

title
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 in order to generate a parser.

  • bullet item {:toc}

3.1. Define a Token Type

Create SimpleTokenType in the com.intellij.sdk.language.psi package (see the simple_language code sample) by subclassing IElementType.

{% include /code_samples/simple_language/src/main/java/com/intellij/sdk/language/psi/SimpleTokenType.java %}

3.2. Define an Element Type

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

{% include /code_samples/simple_language/src/main/java/com/intellij/sdk/language/psi/SimpleElementType.java %}

3.3. Define the Grammar

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

{
  parserClass="com.intellij.sdk.language.parser.SimpleParser"

  extends="com.intellij.extapi.psi.ASTWrapperPsiElement"

  psiClassPrefix="Simple"
  psiImplClassSuffix="Impl"
  psiPackage="com.intellij.sdk.language.psi"
  psiImplPackage="com.intellij.sdk.language.psi.impl"

  elementTypeHolderClass="com.intellij.sdk.language.psi.SimpleTypes"
  elementTypeClass="com.intellij.sdk.language.psi.SimpleElementType"
  tokenTypeClass="com.intellij.sdk.language.psi.SimpleTokenType"

  psiImplUtilClass="com.intellij.sdk.language.psi.impl.SimplePsiImplUtil"
}

simpleFile ::= item_*

private item_ ::= (property|COMMENT|CRLF)

property ::= (KEY? SEPARATOR VALUE?) | KEY

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

The grammar defines the flexibility of the support for a language. The above grammar specifies that a property may have or may not have key and value. This allows the IntelliJ Platform to 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 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 will generate a parser and PSI elements in the /src/main/gen folder of the project. Mark this folder as Generated Sources Root and make sure everything is compiled without errors.

Parser{:width="800px"}