编辑

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