3. Grammar and Parser
3.1
定义令牌类型
在com.simpleplugin.psi
包中创建一个文件.
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.
定义元素类型
在com.simpleplugin.psi
包中创建一个文件.
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.
定义语法
使用*/com/simpleplugin/Simple.bnf *文件为属性语言定义语法.
{
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
如您所见,属性文件可以包含属性,注释和换行符.
语法定义了对语言的支持的灵活性.
我们指定某个属性可能具有或不具有密钥和值.
这使IDE仍然可以识别错误定义的属性,并提供相应的代码分析和快速修复.
请注意,上面elementTypeHolderClass
字段中的SimpleTypes
类指定了从语法生成的类的名称,此时它不存在.
3.4.
生成解析器
现在,当定义语法时,我们可以通过* Simple.bnf 文件中的上下文菜单中的 Generate Parser Code *生成带有PSI类的解析器.
这将在* gen *文件夹中生成解析器和PSI元素.
将此文件夹标记为* Generated Sources Root *并确保编译所有内容都没有错误.
Last modified: 8 May 2019