add jflex

This commit is contained in:
Владимир Фёдоров 2024-04-03 01:33:41 +07:00
parent 29232018e5
commit df7b96b39d
24 changed files with 815 additions and 22 deletions

37
.run/Run Plugin.run.xml Normal file
View File

@ -0,0 +1,37 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Run Plugin" type="GradleRunConfiguration" factoryName="Gradle">
<log_file alias="idea.log" path="$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log" />
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="runIde" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<EXTENSION ID="com.intellij.execution.ExternalSystemRunConfigurationJavaExtension">
<extension name="net.ashald.envfile">
<option name="IS_ENABLED" value="false" />
<option name="IS_SUBST" value="false" />
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
<option name="IS_IGNORE_MISSING_FILES" value="false" />
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
<ENTRIES>
<ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
</ENTRIES>
</extension>
</EXTENSION>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
</component>

View File

@ -1,7 +1,7 @@
plugins { plugins {
id("java") id("java")
id("org.jetbrains.kotlin.jvm") version "1.9.21" id("org.jetbrains.kotlin.jvm") version "1.9.21"
id("org.jetbrains.intellij") version "1.16.1" id("org.jetbrains.intellij") version "1.17.3"
} }
group = "ru.crabs" group = "ru.crabs"
@ -14,7 +14,9 @@ repositories {
// Include the generated files in the source set // Include the generated files in the source set
sourceSets { sourceSets {
main { main {
kotlin.srcDirs("src/main/gen") java {
srcDirs("src/main/gen")
}
} }
} }
@ -24,17 +26,17 @@ intellij {
version.set("2023.1.5") version.set("2023.1.5")
type.set("IC") // Target IDE Platform type.set("IC") // Target IDE Platform
plugins.set(listOf(/* Plugin Dependencies */)) plugins.set(listOf("com.intellij.java"))
} }
tasks { tasks {
// Set the JVM compatibility versions // Set the JVM compatibility versions
withType<JavaCompile> { withType<JavaCompile> {
sourceCompatibility = "17" sourceCompatibility = "11"
targetCompatibility = "17" targetCompatibility = "11"
} }
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "17" kotlinOptions.jvmTarget = "11"
} }
patchPluginXml { patchPluginXml {
@ -42,12 +44,6 @@ tasks {
untilBuild.set("241.*") untilBuild.set("241.*")
} }
signPlugin {
certificateChain.set(System.getenv("CERTIFICATE_CHAIN"))
privateKey.set(System.getenv("PRIVATE_KEY"))
password.set(System.getenv("PRIVATE_KEY_PASSWORD"))
}
publishPlugin { publishPlugin {
token.set(System.getenv("PUBLISH_TOKEN")) token.set(System.getenv("PUBLISH_TOKEN"))
} }

View File

@ -0,0 +1,185 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.parser;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import static com.intellij.lang.parser.GeneratedParserUtilBase.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.lang.ASTNode;
import com.intellij.psi.tree.TokenSet;
import com.intellij.lang.PsiParser;
import com.intellij.lang.LightPsiParser;
@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class SJsonParser implements PsiParser, LightPsiParser {
public ASTNode parse(IElementType t, PsiBuilder b) {
parseLight(t, b);
return b.getTreeBuilt();
}
public void parseLight(IElementType t, PsiBuilder b) {
boolean r;
b = adapt_builder_(t, b, this, null);
Marker m = enter_section_(b, 0, _COLLAPSE_, null);
r = parse_root_(t, b);
exit_section_(b, 0, m, t, r, true, TRUE_CONDITION);
}
protected boolean parse_root_(IElementType t, PsiBuilder b) {
return parse_root_(t, b, 0);
}
static boolean parse_root_(IElementType t, PsiBuilder b, int l) {
return root(b, l + 1);
}
/* ********************************************************** */
// "[" (item ",")* item "]"
public static boolean array(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "array")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, ARRAY, "<array>");
r = consumeToken(b, "[");
r = r && array_1(b, l + 1);
r = r && item(b, l + 1);
r = r && consumeToken(b, "]");
exit_section_(b, l, m, r, false, null);
return r;
}
// (item ",")*
private static boolean array_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "array_1")) return false;
while (true) {
int c = current_position_(b);
if (!array_1_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "array_1", c)) break;
}
return true;
}
// item ","
private static boolean array_1_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "array_1_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = item(b, l + 1);
r = r && consumeToken(b, ",");
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// object | array | var | string | number
public static boolean item(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "item")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, ITEM, "<item>");
r = object(b, l + 1);
if (!r) r = array(b, l + 1);
if (!r) r = var(b, l + 1);
if (!r) r = consumeToken(b, STRING);
if (!r) r = consumeToken(b, NUMBER);
exit_section_(b, l, m, r, false, null);
return r;
}
/* ********************************************************** */
// var ":" item
public static boolean mixin(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "mixin")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, MIXIN, "<mixin>");
r = var(b, l + 1);
r = r && consumeToken(b, ":");
r = r && item(b, l + 1);
exit_section_(b, l, m, r, false, null);
return r;
}
/* ********************************************************** */
// "{" (prop ",")* prop "}"
public static boolean object(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "object")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, OBJECT, "<object>");
r = consumeToken(b, "{");
r = r && object_1(b, l + 1);
r = r && prop(b, l + 1);
r = r && consumeToken(b, "}");
exit_section_(b, l, m, r, false, null);
return r;
}
// (prop ",")*
private static boolean object_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "object_1")) return false;
while (true) {
int c = current_position_(b);
if (!object_1_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "object_1", c)) break;
}
return true;
}
// prop ","
private static boolean object_1_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "object_1_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = prop(b, l + 1);
r = r && consumeToken(b, ",");
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// string ":" item
public static boolean pair(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "pair")) return false;
if (!nextTokenIs(b, STRING)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, STRING);
r = r && consumeToken(b, ":");
r = r && item(b, l + 1);
exit_section_(b, m, PAIR, r);
return r;
}
/* ********************************************************** */
// pair | mixin
public static boolean prop(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "prop")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, PROP, "<prop>");
r = pair(b, l + 1);
if (!r) r = mixin(b, l + 1);
exit_section_(b, l, m, r, false, null);
return r;
}
/* ********************************************************** */
// object | COMMENT
static boolean root(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "root")) return false;
boolean r;
r = object(b, l + 1);
if (!r) r = consumeToken(b, COMMENT);
return r;
}
/* ********************************************************** */
// "regexp:\"$[^\"]*\""
public static boolean var(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "var")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, VAR, "<var>");
r = consumeToken(b, "regexp:\"$[^\"]*\"");
exit_section_(b, l, m, r, false, null);
return r;
}
}

View File

@ -0,0 +1,13 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonArray extends PsiElement {
@NotNull
List<SJsonItem> getItemList();
}

View File

@ -0,0 +1,25 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonItem extends PsiElement {
@Nullable
SJsonArray getArray();
@Nullable
SJsonObject getObject();
@Nullable
SJsonVar getVar();
@Nullable
PsiElement getNumber();
@Nullable
PsiElement getString();
}

View File

@ -0,0 +1,16 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonMixin extends PsiElement {
@NotNull
SJsonItem getItem();
@NotNull
SJsonVar getVar();
}

View File

@ -0,0 +1,13 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonObject extends PsiElement {
@NotNull
List<SJsonProp> getPropList();
}

View File

@ -0,0 +1,16 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonPair extends PsiElement {
@NotNull
SJsonItem getItem();
@NotNull
PsiElement getString();
}

View File

@ -0,0 +1,16 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonProp extends PsiElement {
@Nullable
SJsonMixin getMixin();
@Nullable
SJsonPair getPair();
}

View File

@ -0,0 +1,51 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.PsiElement;
import com.intellij.lang.ASTNode;
import ru.crabs.sdk.language.psi.impl.*;
public interface SJsonTypes {
IElementType ARRAY = new SJsonElementType("ARRAY");
IElementType ITEM = new SJsonElementType("ITEM");
IElementType MIXIN = new SJsonElementType("MIXIN");
IElementType OBJECT = new SJsonElementType("OBJECT");
IElementType PAIR = new SJsonElementType("PAIR");
IElementType PROP = new SJsonElementType("PROP");
IElementType VAR = new SJsonElementType("VAR");
IElementType COMMENT = new SJsonTokenType("COMMENT");
IElementType NUMBER = new SJsonTokenType("number");
IElementType STRING = new SJsonTokenType("string");
IElementType VARS_WORD = new SJsonTokenType("@vars");
class Factory {
public static PsiElement createElement(ASTNode node) {
IElementType type = node.getElementType();
if (type == ARRAY) {
return new SJsonArrayImpl(node);
}
else if (type == ITEM) {
return new SJsonItemImpl(node);
}
else if (type == MIXIN) {
return new SJsonMixinImpl(node);
}
else if (type == OBJECT) {
return new SJsonObjectImpl(node);
}
else if (type == PAIR) {
return new SJsonPairImpl(node);
}
else if (type == PROP) {
return new SJsonPropImpl(node);
}
else if (type == VAR) {
return new SJsonVarImpl(node);
}
throw new AssertionError("Unknown element type: " + type);
}
}
}

View File

@ -0,0 +1,10 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElement;
public interface SJsonVar extends PsiElement {
}

View File

@ -0,0 +1,42 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi;
import org.jetbrains.annotations.*;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiElement;
public class SJsonVisitor extends PsiElementVisitor {
public void visitArray(@NotNull SJsonArray o) {
visitPsiElement(o);
}
public void visitItem(@NotNull SJsonItem o) {
visitPsiElement(o);
}
public void visitMixin(@NotNull SJsonMixin o) {
visitPsiElement(o);
}
public void visitObject(@NotNull SJsonObject o) {
visitPsiElement(o);
}
public void visitPair(@NotNull SJsonPair o) {
visitPsiElement(o);
}
public void visitProp(@NotNull SJsonProp o) {
visitPsiElement(o);
}
public void visitVar(@NotNull SJsonVar o) {
visitPsiElement(o);
}
public void visitPsiElement(@NotNull PsiElement o) {
visitElement(o);
}
}

View File

@ -0,0 +1,36 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonArrayImpl extends ASTWrapperPsiElement implements SJsonArray {
public SJsonArrayImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitArray(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@NotNull
public List<SJsonItem> getItemList() {
return PsiTreeUtil.getChildrenOfTypeAsList(this, SJsonItem.class);
}
}

View File

@ -0,0 +1,60 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonItemImpl extends ASTWrapperPsiElement implements SJsonItem {
public SJsonItemImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitItem(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@Nullable
public SJsonArray getArray() {
return findChildByClass(SJsonArray.class);
}
@Override
@Nullable
public SJsonObject getObject() {
return findChildByClass(SJsonObject.class);
}
@Override
@Nullable
public SJsonVar getVar() {
return findChildByClass(SJsonVar.class);
}
@Override
@Nullable
public PsiElement getNumber() {
return findChildByType(NUMBER);
}
@Override
@Nullable
public PsiElement getString() {
return findChildByType(STRING);
}
}

View File

@ -0,0 +1,42 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonMixinImpl extends ASTWrapperPsiElement implements SJsonMixin {
public SJsonMixinImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitMixin(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@NotNull
public SJsonItem getItem() {
return findNotNullChildByClass(SJsonItem.class);
}
@Override
@NotNull
public SJsonVar getVar() {
return findNotNullChildByClass(SJsonVar.class);
}
}

View File

@ -0,0 +1,36 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonObjectImpl extends ASTWrapperPsiElement implements SJsonObject {
public SJsonObjectImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitObject(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@NotNull
public List<SJsonProp> getPropList() {
return PsiTreeUtil.getChildrenOfTypeAsList(this, SJsonProp.class);
}
}

View File

@ -0,0 +1,42 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonPairImpl extends ASTWrapperPsiElement implements SJsonPair {
public SJsonPairImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitPair(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@NotNull
public SJsonItem getItem() {
return findNotNullChildByClass(SJsonItem.class);
}
@Override
@NotNull
public PsiElement getString() {
return findNotNullChildByType(STRING);
}
}

View File

@ -0,0 +1,42 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonPropImpl extends ASTWrapperPsiElement implements SJsonProp {
public SJsonPropImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitProp(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
@Override
@Nullable
public SJsonMixin getMixin() {
return findChildByClass(SJsonMixin.class);
}
@Override
@Nullable
public SJsonPair getPair() {
return findChildByClass(SJsonPair.class);
}
}

View File

@ -0,0 +1,30 @@
// This is a generated file. Not intended for manual editing.
package ru.crabs.sdk.language.psi.impl;
import java.util.List;
import org.jetbrains.annotations.*;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import static ru.crabs.sdk.language.psi.SJsonTypes.*;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import ru.crabs.sdk.language.psi.*;
public class SJsonVarImpl extends ASTWrapperPsiElement implements SJsonVar {
public SJsonVarImpl(@NotNull ASTNode node) {
super(node);
}
public void accept(@NotNull SJsonVisitor visitor) {
visitor.visitVar(this);
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof SJsonVisitor) accept((SJsonVisitor)visitor);
else super.accept(visitor);
}
}

View File

@ -1,6 +1,7 @@
package ru.crabs.sjson package ru.crabs.sdk.language.psi
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import ru.crabs.sjson.SJsonLanguage
class SJsonTokenType(debugName: String) : IElementType(debugName, SJsonLanguage.INSTANCE) { class SJsonTokenType(debugName: String) : IElementType(debugName, SJsonLanguage.INSTANCE) {

View File

@ -1,16 +1,19 @@
{ {
parserClass="ru.crabs.sjson.parser.SJsonParser" parserClass="ru.crabs.sdk.language.parser.SJsonParser"
// parserUtilClass="com.intellij.lang.parser.GeneratedParserUtilBase"
extends="com.intellij.extapi.psi.ASTWrapperPsiElement" extends="com.intellij.extapi.psi.ASTWrapperPsiElement"
psiClassPrefix="SJson" psiClassPrefix="SJson"
psiImplClassSuffix="Impl" psiImplClassSuffix="Impl"
psiPackage="ru.crabs.sjson" psiPackage="ru.crabs.sdk.language.psi"
psiImplPackage="ru.crabs.sjson.impl" psiImplPackage="ru.crabs.sdk.language.psi.impl"
elementTypeHolderClass="ru.crabs.sjson.SJsonTypes" elementTypeHolderClass="ru.crabs.sdk.language.psi.SJsonTypes"
elementTypeClass="ru.crabs.sjson.SJsonElementType" elementTypeClass="ru.crabs.sdk.language.psi.SJsonElementType"
tokenTypeClass="ru.crabs.sjson.SJsonTokenType" tokenTypeClass="ru.crabs.sdk.language.psi.SJsonTokenType"
psiImplUtilClass="ru.crabs.sdk.language.psi.impl.SJsonPsiImplUtil"
tokens = [ tokens = [
space = 'regexp:\s+' space = 'regexp:\s+'
@ -21,7 +24,7 @@
] ]
} }
root ::= object root ::= object | COMMENT // COMMENT = какой-то костыль и тут не нужен
object ::= "{" (prop ",")* prop "}" object ::= "{" (prop ",")* prop "}"
array ::= "[" (item ",")* item "]" array ::= "[" (item ",")* item "]"
@ -31,4 +34,4 @@ pair ::= string ":" item
mixin ::= var ":" item mixin ::= var ":" item
item ::= (object | array | var | string | number) item ::= (object | array | var | string | number)
var ::= "regexp:\"\$[^\"]*\"" var ::= "regexp:\"$[^\"]*\""

View File

@ -2,7 +2,7 @@ package ru.crabs.sjson.language;
import com.intellij.lexer.FlexLexer; import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IElementType;
import ru.crabs.sjson.SJsonTypes; import ru.crabs.sdk.language.psi.SJsonTypes;
import com.intellij.psi.TokenType; import com.intellij.psi.TokenType;
%% %%

View File

@ -0,0 +1,78 @@
package ru.crabs.sjson.language
import com.intellij.extapi.psi.PsiFileBase
import com.intellij.lang.ASTNode
import com.intellij.lang.ParserDefinition
import com.intellij.lang.PsiParser
import com.intellij.lexer.FlexAdapter
import com.intellij.lexer.Lexer
import com.intellij.openapi.fileTypes.FileType
import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.TokenSet
import ru.crabs.sdk.language.parser.SJsonParser
import ru.crabs.sdk.language.psi.SJsonTypes
import ru.crabs.sjson.SJsonFileType
import ru.crabs.sjson.SJsonLanguage
class SJsonLexerAdapter : FlexAdapter(SJsonLexer(null))
class SJsonFile(viewProvider: FileViewProvider) :
PsiFileBase(viewProvider, SJsonLanguage.INSTANCE) {
override fun getFileType(): FileType {
return SJsonFileType.INSTANCE
}
override fun toString(): String {
return "SJson File"
}
}
interface SJsonTokenSets {
companion object {
val VARS_WORD: TokenSet = TokenSet.create(SJsonTypes.VARS_WORD)
var COMMENTS: TokenSet = TokenSet.create(SJsonTypes.COMMENT)
}
}
internal class SJsonParserDefinition : ParserDefinition {
override fun createLexer(project: Project?): Lexer {
return SJsonLexerAdapter()
}
override fun getCommentTokens(): TokenSet {
return SJsonTokenSets.COMMENTS
}
override fun getStringLiteralElements(): TokenSet {
return TokenSet.EMPTY
}
override fun createParser(project: Project?): PsiParser {
return SJsonParser()
}
override fun getFileNodeType(): IFileElementType {
return FILE
}
override fun createFile(viewProvider: FileViewProvider): PsiFile {
return SJsonFile(viewProvider)
}
override fun createElement(node: ASTNode?): PsiElement {
return SJsonTypes.Factory.createElement(node)
}
companion object {
val FILE: IFileElementType = IFileElementType(SJsonLanguage.INSTANCE)
}
}

View File

@ -29,5 +29,8 @@
fieldName="INSTANCE" fieldName="INSTANCE"
language="SJson" language="SJson"
extensions="sjson"/> extensions="sjson"/>
<lang.parserDefinition
language="SJson"
implementationClass="ru.crabs.sjson.language.SJsonParserDefinition"/>
</extensions> </extensions>
</idea-plugin> </idea-plugin>