1 复制解析器工具类
将语法插件需要的GeneratedParserUtilBase类复制到你的源文件中。
2 定义单点登录类型
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();
}
}
3 定义元素类型
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);
}
}
4 定义语法
以/com/simpleplugin/Simple.bnf文件定义属性语言语法。
{
parserClass="com.simpleplugin.parser.SimpleParser"
stubParserClass="com.simpleplugin.parser.GeneratedParserUtilBase"
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
这样一个属性文件就可以包含属性、评论和换行了。
语法定义可以使语言支持变得简单,我们制定的属性有值也可能没有值。我们指定一个属性可能有也可能没有键和值。这让IDE仍然能够识别错误定义的属性,并提供相应的代码分析和快速修正。
5 生成分析器
当语法定义之后,用户就可以通过右键菜单的Generate Parser Code或者是通过Simple.bnf文件中的⌘⇧G快捷方式根据PSI类生成解析器。Grammar-Kit将在gen文件中生成一个的语法工具解析器和PSI元素。将这个文件夹作为源根,并确保编译没有错误。