Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
{div:class=navigation}
{table:width=100%}
 {tr}
  {td} {align:left}[Previous|Language and File Type] {span:class=sep}\|{span} {span:class=text}Language and File Type{span}{align} {td}
  {td} {align:center}[Top|Custom Language Support] {span:class=sep}\|{span} {span:class=text}Custom Language Support{span}{align} {td}
  {td} {align:right}[Next|Lexer and Parser Definition] {span:class=sep}\|{span} {span:class=text}Lexer and Parser Definition{span}{align} {td}
 {tr}
{table}
{div}

1. Define a token type

Code Block

package com.simpleplugin.psi;

import com.intellij.psi.tree.IElementType;
import com.simpleplugin.SimpleLanguage;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

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

    @Override
    public String toString() {
        return "SimpleTokenType." + super.toString();
    }
}

2. Define an element type

Code Block

package com.simpleplugin.psi;

import com.intellij.psi.tree.IElementType;
import com.simpleplugin.SimpleLanguage;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;

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

3. Define grammar

Define a grammar for the properties language with

Wiki Markup
{span:class=id}/com/simpleplugin/Simple.bnf{span}
file.

Code Block

{
  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.

4. Generate a parser

Now when the grammar is defined we can generate a parser with PSI classes via

Wiki Markup
{span:class=shortcut}Generate Parser Code{span}
from the context menu or via
Wiki Markup
{span:class=shortcut}⌘⇧G{span}
shortcut on
Wiki Markup
{span:class=id}Simple.bnf{span}
file. The Grammar-Kit will generate a parser and PSI elements in
Wiki Markup
{span:class=id}gen{span}
folder. Mark this folder as a source root and make sure everything is compiled without errors.

Image Removed

Wiki Markup
{div:class=navigation}
{table:width=100%}
 {tr}
  {td} {align:left}[Previous|Language and File Type] {span:class=sep}\|{span} {span:class=text}Language and File Type{span}{align} {td}
  {td} {align:center}[Top|Custom Language Support] {span:class=sep}\|{span} {span:class=text}Custom Language Support{span}{align} {td}
  {td} {align:right}[Next|Lexer and Parser Definition] {span:class=sep}\|{span} {span:class=text}Lexer and Parser Definition{span}{align} {td}
 {tr}
{table}
{div}

Redirect
locationhttp://www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support/grammar_and_parser.html