From 7133809a42a6ef1b0edd317f5d8ccf99f3a49771 Mon Sep 17 00:00:00 2001 From: Dirk Groot Date: Sat, 13 May 2023 16:35:51 +0200 Subject: [PATCH 01/11] Rework lexer and parser and added some features - The lexer is now a LOT simpler - The parser is a little bit more complicated - Syntax highlighting is now annotator based instead of lexer based - Matching curly braces are now highlighted in the editor - Code can now be commented with the "comment with line/block comment" commands --- build.gradle.kts | 1 + .../structurizr/dsl/StructurizrDSLParser.java | 612 ++++++++++-------- ...ckStatement.java => SDAnimationBlock.java} | 6 +- ...tContents.java => SDAnimationKeyword.java} | 2 +- .../structurizr/dsl/psi/SDBlock.java | 13 + .../dsl/psi/SDBlockCommentStatement.java | 10 + .../structurizr/dsl/psi/SDBlockStatement.java | 25 +- .../dsl/psi/SDExplicitRelationship.java | 10 +- ...ePair.java => SDIdentifierAssignment.java} | 7 +- .../dsl/psi/SDIdentifierReference.java | 10 + .../dsl/psi/SDIdentifierReferences.java | 4 +- .../dsl/psi/SDImplicitRelationship.java | 7 +- .../dsl/psi/SDLineCommentStatement.java | 10 + .../dsl/psi/SDPropertiesBlock.java | 13 + .../dsl/psi/SDPropertiesDefinition.java | 16 + .../dsl/psi/SDPropertiesKeyword.java | 10 + .../dsl/psi/SDPropertyDefinition.java | 16 + .../psi/{SDKey.java => SDPropertyKey.java} | 2 +- .../{SDValue.java => SDPropertyValue.java} | 2 +- .../dsl/psi/SDRelationshipDestination.java | 10 + .../dsl/psi/SDRelationshipKeyword.java | 10 + .../dsl/psi/SDRelationshipSource.java | 10 + .../structurizr/dsl/psi/SDScriptBlock.java | 6 - .../dsl/psi/SDScriptDefinition.java | 19 + ...entifierName.java => SDScriptKeyword.java} | 2 +- .../dsl/psi/SDSingleLineStatement.java | 5 +- ...ithPropertyBlock.java => SDStatement.java} | 5 +- .../structurizr/dsl/psi/SDTypes.java | 167 ++--- .../structurizr/dsl/psi/SDVisitor.java | 72 ++- .../dsl/psi/impl/SDAnimationBlockImpl.java | 42 ++ ...sImpl.java => SDAnimationKeywordImpl.java} | 6 +- .../psi/impl/SDBlockCommentStatementImpl.java | 30 + .../structurizr/dsl/psi/impl/SDBlockImpl.java | 36 ++ .../dsl/psi/impl/SDBlockStatementImpl.java | 50 +- .../psi/impl/SDExplicitRelationshipImpl.java | 20 +- .../psi/impl/SDIdentifierAssignmentImpl.java | 36 ++ .../psi/impl/SDIdentifierReferenceImpl.java | 30 + .../psi/impl/SDIdentifierReferencesImpl.java | 8 +- .../psi/impl/SDImplicitRelationshipImpl.java | 14 +- .../psi/impl/SDLineCommentStatementImpl.java | 30 + ...irImpl.java => SDPropertiesBlockImpl.java} | 16 +- .../psi/impl/SDPropertiesDefinitionImpl.java | 42 ++ .../dsl/psi/impl/SDPropertiesKeywordImpl.java | 30 + ...mpl.java => SDPropertyDefinitionImpl.java} | 14 +- ...{SDKeyImpl.java => SDPropertyKeyImpl.java} | 6 +- ...alueImpl.java => SDPropertyValueImpl.java} | 6 +- .../impl/SDRelationshipDestinationImpl.java | 30 + .../psi/impl/SDRelationshipKeywordImpl.java | 30 + .../psi/impl/SDRelationshipSourceImpl.java | 30 + .../dsl/psi/impl/SDScriptBlockImpl.java | 12 - .../dsl/psi/impl/SDScriptDefinitionImpl.java | 48 ++ ...NameImpl.java => SDScriptKeywordImpl.java} | 6 +- .../psi/impl/SDSingleLineStatementImpl.java | 10 +- ...rtyBlockImpl.java => SDStatementImpl.java} | 12 +- src/main/grammar/StructurizrDSL.bnf | 162 ++--- src/main/grammar/StructurizrDSL.flex | 139 +--- .../dirkgroot/structurizr/dsl/lang/SDBlock.kt | 60 +- .../structurizr/dsl/lang/SDBraceMatcher.kt | 15 + .../structurizr/dsl/lang/SDCommenter.kt | 15 + .../dsl/lang/SDFormattingModelBuilder.kt | 11 +- .../lang/StructurizrDSLParserDefinition.kt | 3 +- .../structurizr/dsl/syntax/SDAnnotator.kt | 30 + .../syntax/StructurizrDSLSyntaxHighlighter.kt | 90 +-- src/main/resources/META-INF/plugin.xml | 6 + .../dsl/editing/formatter/SpacingTest.kt | 2 +- .../structurizr/dsl/lexer/AllKeywords.kt | 136 ++-- .../dsl/lexer/CaseInsensitiveTest.kt | 4 +- .../structurizr/dsl/lexer/CommentsTest.kt | 8 +- .../dsl/lexer/HierarchicalIdentifiersTest.kt | 8 +- .../structurizr/dsl/lexer/IdentifierTest.kt | 6 +- .../structurizr/dsl/lexer/KeywordsTest.kt | 24 +- .../lexer/MeaningfulLineTerminatorsTest.kt | 6 +- .../structurizr/dsl/lexer/PropertiesTest.kt | 28 +- .../structurizr/dsl/lexer/RelationshipTest.kt | 10 +- .../structurizr/dsl/lexer/ScriptBlockTest.kt | 21 +- .../structurizr/dsl/lexer/TextTest.kt | 8 +- .../structurizr/dsl/parser/AnimationTest.kt | 65 ++ .../ElementsWithBlocksOfElementsTest.kt | 43 +- .../parser/ElementsWithPropertyBlocksTest.kt | 50 +- .../dsl/parser/IdentifierAssignmentTest.kt | 37 +- .../LineWithIdentifierReferencesTest.kt | 53 -- .../dsl/parser/NonCodeElementsTest.kt | 23 +- .../dsl/parser/RelationshipTest.kt | 16 +- .../structurizr/dsl/parser/ScriptBlockTest.kt | 15 +- 84 files changed, 1637 insertions(+), 1133 deletions(-) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDPropertyBlockStatement.java => SDAnimationBlock.java} (57%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDScriptContents.java => SDAnimationKeyword.java} (78%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDBlock.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDBlockCommentStatement.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDKeyValuePair.java => SDIdentifierAssignment.java} (65%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDIdentifierReference.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDLineCommentStatement.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDPropertiesBlock.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDPropertiesDefinition.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDPropertiesKeyword.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDPropertyDefinition.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDKey.java => SDPropertyKey.java} (79%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDValue.java => SDPropertyValue.java} (79%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDRelationshipDestination.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDRelationshipKeyword.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDRelationshipSource.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/SDScriptDefinition.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDIdentifierName.java => SDScriptKeyword.java} (78%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/{SDKeywordWithPropertyBlock.java => SDStatement.java} (69%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDAnimationBlockImpl.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDScriptContentsImpl.java => SDAnimationKeywordImpl.java} (79%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDBlockCommentStatementImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDBlockImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDIdentifierAssignmentImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDIdentifierReferenceImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDLineCommentStatementImpl.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDKeyValuePairImpl.java => SDPropertiesBlockImpl.java} (67%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDPropertiesDefinitionImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDPropertiesKeywordImpl.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDPropertyBlockStatementImpl.java => SDPropertyDefinitionImpl.java} (61%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDKeyImpl.java => SDPropertyKeyImpl.java} (80%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDValueImpl.java => SDPropertyValueImpl.java} (80%) create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDRelationshipDestinationImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDRelationshipKeywordImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDRelationshipSourceImpl.java create mode 100644 src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/SDScriptDefinitionImpl.java rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDIdentifierNameImpl.java => SDScriptKeywordImpl.java} (79%) rename src/main/gen/nl/dirkgroot/structurizr/dsl/psi/impl/{SDKeywordWithPropertyBlockImpl.java => SDStatementImpl.java} (71%) create mode 100644 src/main/kotlin/nl/dirkgroot/structurizr/dsl/lang/SDBraceMatcher.kt create mode 100644 src/main/kotlin/nl/dirkgroot/structurizr/dsl/lang/SDCommenter.kt create mode 100644 src/main/kotlin/nl/dirkgroot/structurizr/dsl/syntax/SDAnnotator.kt create mode 100644 src/test/kotlin/nl/dirkgroot/structurizr/dsl/parser/AnimationTest.kt delete mode 100644 src/test/kotlin/nl/dirkgroot/structurizr/dsl/parser/LineWithIdentifierReferencesTest.kt diff --git a/build.gradle.kts b/build.gradle.kts index 7165c0a..855535a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,6 +49,7 @@ koverReport { sourceSets["main"].java.srcDirs("src/main/gen") dependencies { + testImplementation(kotlin("test")) testImplementation("io.kotest:kotest-runner-junit5:5.6.2") testImplementation("io.kotest:kotest-assertions-core:5.6.2") testImplementation("com.willowtreeapps.assertk:assertk-jvm:0.25") diff --git a/src/main/gen/nl/dirkgroot/structurizr/dsl/StructurizrDSLParser.java b/src/main/gen/nl/dirkgroot/structurizr/dsl/StructurizrDSLParser.java index 5363ffd..8f0d453 100644 --- a/src/main/gen/nl/dirkgroot/structurizr/dsl/StructurizrDSLParser.java +++ b/src/main/gen/nl/dirkgroot/structurizr/dsl/StructurizrDSLParser.java @@ -21,7 +21,7 @@ public ASTNode parse(IElementType t, PsiBuilder b) { public void parseLight(IElementType t, PsiBuilder b) { boolean r; - b = adapt_builder_(t, b, this, null); + b = adapt_builder_(t, b, this, EXTENDS_SETS_); Marker m = enter_section_(b, 0, _COLLAPSE_, null); r = parse_root_(t, b); exit_section_(b, 0, m, t, r, true, TRUE_CONDITION); @@ -35,6 +35,59 @@ static boolean parse_root_(IElementType t, PsiBuilder b, int l) { return structurizrDSLFile(b, l + 1); } + public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] { + create_token_set_(ANIMATION_BLOCK, BLOCK_COMMENT_STATEMENT, BLOCK_STATEMENT, EXPLICIT_RELATIONSHIP, + IDENTIFIER_ASSIGNMENT, IDENTIFIER_REFERENCES, IMPLICIT_RELATIONSHIP, LINE_COMMENT_STATEMENT, + PROPERTIES_DEFINITION, SCRIPT_DEFINITION, SINGLE_LINE_STATEMENT), + }; + + /* ********************************************************** */ + // animationKeyword '{' CRLF (identifierReferences | lineCommentStatement | blockCommentStatement)* '}' lf_eof + public static boolean animationBlock(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "animationBlock")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ANIMATION_BLOCK, ""); + r = animationKeyword(b, l + 1); + r = r && consumeTokens(b, 0, BRACE1, CRLF); + r = r && animationBlock_3(b, l + 1); + r = r && consumeToken(b, BRACE2); + r = r && lf_eof(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + // (identifierReferences | lineCommentStatement | blockCommentStatement)* + private static boolean animationBlock_3(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "animationBlock_3")) return false; + while (true) { + int c = current_position_(b); + if (!animationBlock_3_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "animationBlock_3", c)) break; + } + return true; + } + + // identifierReferences | lineCommentStatement | blockCommentStatement + private static boolean animationBlock_3_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "animationBlock_3_0")) return false; + boolean r; + r = identifierReferences(b, l + 1); + if (!r) r = lineCommentStatement(b, l + 1); + if (!r) r = blockCommentStatement(b, l + 1); + return r; + } + + /* ********************************************************** */ + // 'animation' + public static boolean animationKeyword(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "animationKeyword")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ANIMATION_KEYWORD, ""); + r = consumeToken(b, "animation"); + exit_section_(b, l, m, r, false, null); + return r; + } + /* ********************************************************** */ // text public static boolean argument(PsiBuilder b, int l) { @@ -48,62 +101,101 @@ public static boolean argument(PsiBuilder b, int l) { } /* ********************************************************** */ - // identifierAssignment? keywordWithArguments '{' CRLF statement* '}' lf_eof - public static boolean blockStatement(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "blockStatement")) return false; + // '{' CRLF expr* '}' + public static boolean block(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "block")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, BLOCK, ""); + r = consumeTokens(b, 1, BRACE1, CRLF); + p = r; // pin = 1 + r = r && report_error_(b, block_2(b, l + 1)); + r = p && consumeToken(b, BRACE2) && r; + exit_section_(b, l, m, r, p, StructurizrDSLParser::blockRecover); + return r || p; + } + + // expr* + private static boolean block_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "block_2")) return false; + while (true) { + int c = current_position_(b); + if (!expr(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "block_2", c)) break; + } + return true; + } + + /* ********************************************************** */ + // BLOCK_COMMENT lf_eof + public static boolean blockCommentStatement(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "blockCommentStatement")) return false; + if (!nextTokenIs(b, BLOCK_COMMENT)) return false; boolean r; - Marker m = enter_section_(b, l, _NONE_, BLOCK_STATEMENT, ""); - r = blockStatement_0(b, l + 1); - r = r && keywordWithArguments(b, l + 1); - r = r && consumeTokens(b, 0, BRACE1, CRLF); - r = r && blockStatement_4(b, l + 1); - r = r && consumeToken(b, BRACE2); + Marker m = enter_section_(b); + r = consumeToken(b, BLOCK_COMMENT); r = r && lf_eof(b, l + 1); - exit_section_(b, l, m, r, false, null); + exit_section_(b, m, BLOCK_COMMENT_STATEMENT, r); return r; } - // identifierAssignment? - private static boolean blockStatement_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "blockStatement_0")) return false; - identifierAssignment(b, l + 1); - return true; + /* ********************************************************** */ + // !(text | lf_eof) + static boolean blockRecover(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "blockRecover")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_); + r = !blockRecover_0(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; } - // statement* - private static boolean blockStatement_4(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "blockStatement_4")) return false; - while (true) { - int c = current_position_(b); - if (!statement(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "blockStatement_4", c)) break; - } - return true; + // text | lf_eof + private static boolean blockRecover_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "blockRecover_0")) return false; + boolean r; + r = text(b, l + 1); + if (!r) r = lf_eof(b, l + 1); + return r; } /* ********************************************************** */ - // singleLineStatement | blockStatement | propertyBlockStatement | CRLF - static boolean elementDefinition(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "elementDefinition")) return false; + // keyword argument* block lf_eof + public static boolean blockStatement(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "blockStatement")) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; boolean r; - r = singleLineStatement(b, l + 1); - if (!r) r = blockStatement(b, l + 1); - if (!r) r = propertyBlockStatement(b, l + 1); - if (!r) r = consumeToken(b, CRLF); + Marker m = enter_section_(b); + r = keyword(b, l + 1); + r = r && blockStatement_1(b, l + 1); + r = r && block(b, l + 1); + r = r && lf_eof(b, l + 1); + exit_section_(b, m, BLOCK_STATEMENT, r); return r; } + // argument* + private static boolean blockStatement_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "blockStatement_1")) return false; + while (true) { + int c = current_position_(b); + if (!argument(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "blockStatement_1", c)) break; + } + return true; + } + /* ********************************************************** */ - // identifierName '->' identifierName argument* + // relationshipSource relationshipKeyword relationshipDestination argument* lf_eof public static boolean explicitRelationship(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "explicitRelationship")) return false; - if (!nextTokenIs(b, IDENTIFIER)) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; boolean r; Marker m = enter_section_(b); - r = identifierName(b, l + 1); - r = r && consumeToken(b, RELATIONSHIP_KEYWORD); - r = r && identifierName(b, l + 1); + r = relationshipSource(b, l + 1); + r = r && relationshipKeyword(b, l + 1); + r = r && relationshipDestination(b, l + 1); r = r && explicitRelationship_3(b, l + 1); + r = r && lf_eof(b, l + 1); exit_section_(b, m, EXPLICIT_RELATIONSHIP, r); return r; } @@ -120,68 +212,102 @@ private static boolean explicitRelationship_3(PsiBuilder b, int l) { } /* ********************************************************** */ - // identifierName '=' - static boolean identifierAssignment(PsiBuilder b, int l) { + // scriptDefinition + // | explicitRelationship + // | implicitRelationship + // | animationBlock + // | propertiesDefinition + // | identifierAssignment + // | blockStatement + // | singleLineStatement + // | lineCommentStatement + // | blockCommentStatement + static boolean expr(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "expr")) return false; + boolean r; + r = scriptDefinition(b, l + 1); + if (!r) r = explicitRelationship(b, l + 1); + if (!r) r = implicitRelationship(b, l + 1); + if (!r) r = animationBlock(b, l + 1); + if (!r) r = propertiesDefinition(b, l + 1); + if (!r) r = identifierAssignment(b, l + 1); + if (!r) r = blockStatement(b, l + 1); + if (!r) r = singleLineStatement(b, l + 1); + if (!r) r = lineCommentStatement(b, l + 1); + if (!r) r = blockCommentStatement(b, l + 1); + return r; + } + + /* ********************************************************** */ + // identifierReference '=' (blockStatement | singleLineStatement) + public static boolean identifierAssignment(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "identifierAssignment")) return false; - if (!nextTokenIs(b, IDENTIFIER)) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; boolean r; Marker m = enter_section_(b); - r = identifierName(b, l + 1); + r = identifierReference(b, l + 1); r = r && consumeToken(b, EQUALS); - exit_section_(b, m, null, r); + r = r && identifierAssignment_2(b, l + 1); + exit_section_(b, m, IDENTIFIER_ASSIGNMENT, r); + return r; + } + + // blockStatement | singleLineStatement + private static boolean identifierAssignment_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "identifierAssignment_2")) return false; + boolean r; + r = blockStatement(b, l + 1); + if (!r) r = singleLineStatement(b, l + 1); return r; } /* ********************************************************** */ - // IDENTIFIER - public static boolean identifierName(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "identifierName")) return false; - if (!nextTokenIs(b, IDENTIFIER)) return false; + // UNQUOTED_TEXT + public static boolean identifierReference(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "identifierReference")) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; boolean r; Marker m = enter_section_(b); - r = consumeToken(b, IDENTIFIER); - exit_section_(b, m, IDENTIFIER_NAME, r); + r = consumeToken(b, UNQUOTED_TEXT); + exit_section_(b, m, IDENTIFIER_REFERENCE, r); return r; } /* ********************************************************** */ - // identifierName+ lf_eof + // identifierReference* CRLF public static boolean identifierReferences(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "identifierReferences")) return false; - if (!nextTokenIs(b, IDENTIFIER)) return false; + if (!nextTokenIs(b, "", CRLF, UNQUOTED_TEXT)) return false; boolean r; - Marker m = enter_section_(b); + Marker m = enter_section_(b, l, _NONE_, IDENTIFIER_REFERENCES, ""); r = identifierReferences_0(b, l + 1); - r = r && lf_eof(b, l + 1); - exit_section_(b, m, IDENTIFIER_REFERENCES, r); + r = r && consumeToken(b, CRLF); + exit_section_(b, l, m, r, false, null); return r; } - // identifierName+ + // identifierReference* private static boolean identifierReferences_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "identifierReferences_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = identifierName(b, l + 1); - while (r) { + while (true) { int c = current_position_(b); - if (!identifierName(b, l + 1)) break; + if (!identifierReference(b, l + 1)) break; if (!empty_element_parsed_guard_(b, "identifierReferences_0", c)) break; } - exit_section_(b, m, null, r); - return r; + return true; } /* ********************************************************** */ - // '->' identifierName argument* + // relationshipKeyword relationshipDestination argument* lf_eof public static boolean implicitRelationship(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "implicitRelationship")) return false; - if (!nextTokenIs(b, RELATIONSHIP_KEYWORD)) return false; + if (!nextTokenIs(b, ARROW)) return false; boolean r; Marker m = enter_section_(b); - r = consumeToken(b, RELATIONSHIP_KEYWORD); - r = r && identifierName(b, l + 1); + r = relationshipKeyword(b, l + 1); + r = r && relationshipDestination(b, l + 1); r = r && implicitRelationship_2(b, l + 1); + r = r && lf_eof(b, l + 1); exit_section_(b, m, IMPLICIT_RELATIONSHIP, r); return r; } @@ -198,272 +324,246 @@ private static boolean implicitRelationship_2(PsiBuilder b, int l) { } /* ********************************************************** */ - // text - public static boolean key(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "key")) return false; - if (!nextTokenIs(b, "", QUOTED_TEXT, UNQUOTED_TEXT)) return false; + // UNQUOTED_TEXT + public static boolean keyword(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "keyword")) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; boolean r; - Marker m = enter_section_(b, l, _NONE_, KEY, ""); - r = text(b, l + 1); - exit_section_(b, l, m, r, false, null); + Marker m = enter_section_(b); + r = consumeToken(b, UNQUOTED_TEXT); + exit_section_(b, m, KEYWORD, r); return r; } /* ********************************************************** */ - // key value CRLF - public static boolean keyValuePair(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "keyValuePair")) return false; - if (!nextTokenIs(b, "", QUOTED_TEXT, UNQUOTED_TEXT)) return false; - boolean r; - Marker m = enter_section_(b, l, _NONE_, KEY_VALUE_PAIR, ""); - r = key(b, l + 1); - r = r && value(b, l + 1); - r = r && consumeToken(b, CRLF); - exit_section_(b, l, m, r, false, null); + // CRLF | <> + static boolean lf_eof(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "lf_eof")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, CRLF); + if (!r) r = eof(b, l + 1); + exit_section_(b, m, null, r); return r; } /* ********************************************************** */ - // '!adrs' | 'animation' | 'autoLayout' | 'background' | 'border' | 'color' | 'colour' | 'component' | - // '!constant' | 'containerInstance' | 'container' | 'custom' | 'deploymentEnvironment' | 'deploymentGroup' | - // 'deployment' | 'deploymentNode' | 'description' | '!docs' | 'dynamic' | 'element' | 'enterprise' | - // 'exclude' | 'extends' | 'filtered' | 'fontSize' | 'group' | 'healthCheck' | 'height' | 'icon' | - // '!identifiers' | '!impliedRelationships' | 'include' | '!include' | 'infrastructureNode' | 'instances' | - // 'metadata' | 'model' | 'opacity' | 'person' | 'perspectives' | '!plugin' | 'position' | '!ref' | '->' | - // 'routing' | '!script' | 'shape' | 'softwareSystemInstance' | 'softwareSystem' | 'stroke' | 'strokeWidth' | - // 'style' | 'styles' | 'systemContext' | 'systemLandscape' | 'tags' | 'technology' | 'theme' | 'thickness' | - // 'title' | 'url' | 'views' | 'width' | 'workspace' - public static boolean keyword(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "keyword")) return false; + // LINE_COMMENT lf_eof + public static boolean lineCommentStatement(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "lineCommentStatement")) return false; + if (!nextTokenIs(b, LINE_COMMENT)) return false; boolean r; - Marker m = enter_section_(b, l, _NONE_, KEYWORD, ""); - r = consumeToken(b, ADRS_KEYWORD); - if (!r) r = consumeToken(b, ANIMATION_KEYWORD); - if (!r) r = consumeToken(b, AUTO_LAYOUT_KEYWORD); - if (!r) r = consumeToken(b, BACKGROUND_KEYWORD); - if (!r) r = consumeToken(b, BORDER_KEYWORD); - if (!r) r = consumeToken(b, COLOR_KEYWORD); - if (!r) r = consumeToken(b, COLOUR_KEYWORD); - if (!r) r = consumeToken(b, COMPONENT_KEYWORD); - if (!r) r = consumeToken(b, CONSTANT_KEYWORD); - if (!r) r = consumeToken(b, CONTAINER_INSTANCE); - if (!r) r = consumeToken(b, CONTAINER_KEYWORD); - if (!r) r = consumeToken(b, CUSTOM_KEYWORD); - if (!r) r = consumeToken(b, DEPLOYMENT_ENVIRONMENT_KEYWORD); - if (!r) r = consumeToken(b, DEPLOYMENT_GROUP_KEYWORD); - if (!r) r = consumeToken(b, DEPLOYMENT_KEYWORD); - if (!r) r = consumeToken(b, DEPLOYMENT_NODE_KEYWORD); - if (!r) r = consumeToken(b, DESCRIPTION_KEYWORD); - if (!r) r = consumeToken(b, DOCS_KEYWORD); - if (!r) r = consumeToken(b, DYNAMIC_KEYWORD); - if (!r) r = consumeToken(b, ELEMENT_KEYWORD); - if (!r) r = consumeToken(b, ENTERPRISE_KEYWORD); - if (!r) r = consumeToken(b, EXCLUDE_ELEMENT_KEYWORD); - if (!r) r = consumeToken(b, EXTENDS_KEYWORD); - if (!r) r = consumeToken(b, FILTERED_KEYWORD); - if (!r) r = consumeToken(b, FONTSIZE_KEYWORD); - if (!r) r = consumeToken(b, GROUP_KEYWORD); - if (!r) r = consumeToken(b, HEALTH_CHECK_KEYWORD); - if (!r) r = consumeToken(b, HEIGHT_KEYWORD); - if (!r) r = consumeToken(b, ICON_KEYWORD); - if (!r) r = consumeToken(b, IDENTIFIERS_KEYWORD); - if (!r) r = consumeToken(b, IMPLIED_RELATIONSHIPS_KEYWORD); - if (!r) r = consumeToken(b, INCLUDE_ELEMENT_KEYWORD); - if (!r) r = consumeToken(b, INCLUDE_FILE_KEYWORD); - if (!r) r = consumeToken(b, INFRASTRUCTURE_NODE_KEYWORD); - if (!r) r = consumeToken(b, INSTANCES_KEYWORD); - if (!r) r = consumeToken(b, METADATA_KEYWORD); - if (!r) r = consumeToken(b, MODEL_KEYWORD); - if (!r) r = consumeToken(b, OPACITY_KEYWORD); - if (!r) r = consumeToken(b, PERSON_KEYWORD); - if (!r) r = consumeToken(b, PERSPECTIVES_KEYWORD); - if (!r) r = consumeToken(b, PLUGIN_KEYWORD); - if (!r) r = consumeToken(b, POSITION_KEYWORD); - if (!r) r = consumeToken(b, REF_KEYWORD); - if (!r) r = consumeToken(b, RELATIONSHIP_KEYWORD); - if (!r) r = consumeToken(b, ROUTING_KEYWORD); - if (!r) r = consumeToken(b, SCRIPT_KEYWORD); - if (!r) r = consumeToken(b, SHAPE_KEYWORD); - if (!r) r = consumeToken(b, SOFTWARE_SYSTEM_INSTANCE_KEYWORD); - if (!r) r = consumeToken(b, SOFTWARE_SYSTEM_KEYWORD); - if (!r) r = consumeToken(b, STROKE_KEYWORD); - if (!r) r = consumeToken(b, STROKEWIDTH_KEYWORD); - if (!r) r = consumeToken(b, STYLE_KEYWORD); - if (!r) r = consumeToken(b, STYLES_KEYWORD); - if (!r) r = consumeToken(b, SYSTEM_CONTEXT_KEYWORD); - if (!r) r = consumeToken(b, SYSTEM_LANDSCAPE_KEYWORD); - if (!r) r = consumeToken(b, TAGS_KEYWORD); - if (!r) r = consumeToken(b, TECHNOLOGY_KEYWORD); - if (!r) r = consumeToken(b, THEME_KEYWORD); - if (!r) r = consumeToken(b, THICKNESS_KEYWORD); - if (!r) r = consumeToken(b, TITLE_KEYWORD); - if (!r) r = consumeToken(b, URL_KEYWORD); - if (!r) r = consumeToken(b, VIEWS_KEYWORD); - if (!r) r = consumeToken(b, WIDTH_KEYWORD); - if (!r) r = consumeToken(b, WORKSPACE_KEYWORD); - exit_section_(b, l, m, r, false, null); + Marker m = enter_section_(b); + r = consumeToken(b, LINE_COMMENT); + r = r && lf_eof(b, l + 1); + exit_section_(b, m, LINE_COMMENT_STATEMENT, r); return r; } /* ********************************************************** */ - // keyword argument* - static boolean keywordWithArguments(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "keywordWithArguments")) return false; + // '{' CRLF propertyDefinition* '}' + public static boolean propertiesBlock(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertiesBlock")) return false; + if (!nextTokenIs(b, BRACE1)) return false; boolean r; Marker m = enter_section_(b); - r = keyword(b, l + 1); - r = r && keywordWithArguments_1(b, l + 1); - exit_section_(b, m, null, r); + r = consumeTokens(b, 0, BRACE1, CRLF); + r = r && propertiesBlock_2(b, l + 1); + r = r && consumeToken(b, BRACE2); + exit_section_(b, m, PROPERTIES_BLOCK, r); return r; } - // argument* - private static boolean keywordWithArguments_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "keywordWithArguments_1")) return false; + // propertyDefinition* + private static boolean propertiesBlock_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertiesBlock_2")) return false; while (true) { int c = current_position_(b); - if (!argument(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "keywordWithArguments_1", c)) break; + if (!propertyDefinition(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "propertiesBlock_2", c)) break; } return true; } /* ********************************************************** */ - // 'branding' | 'configuration' | 'properties' | 'terminology' | 'users' - public static boolean keywordWithPropertyBlock(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "keywordWithPropertyBlock")) return false; - boolean r; - Marker m = enter_section_(b, l, _NONE_, KEYWORD_WITH_PROPERTY_BLOCK, ""); - r = consumeToken(b, BRANDING_KEYWORD); - if (!r) r = consumeToken(b, CONFIGURATION_KEYWORD); - if (!r) r = consumeToken(b, PROPERTIES_KEYWORD); - if (!r) r = consumeToken(b, TERMINOLOGY_KEYWORD); - if (!r) r = consumeToken(b, USERS_KEYWORD); + // propertiesKeyword propertiesBlock lf_eof + public static boolean propertiesDefinition(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertiesDefinition")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, PROPERTIES_DEFINITION, ""); + r = propertiesKeyword(b, l + 1); + r = r && propertiesBlock(b, l + 1); + r = r && lf_eof(b, l + 1); exit_section_(b, l, m, r, false, null); return r; } /* ********************************************************** */ - // CRLF | <> - static boolean lf_eof(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "lf_eof")) return false; + // 'properties' | 'users' + public static boolean propertiesKeyword(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertiesKeyword")) return false; boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, CRLF); - if (!r) r = eof(b, l + 1); - exit_section_(b, m, null, r); + Marker m = enter_section_(b, l, _NONE_, PROPERTIES_KEYWORD, ""); + r = consumeToken(b, "properties"); + if (!r) r = consumeToken(b, "users"); + exit_section_(b, l, m, r, false, null); return r; } /* ********************************************************** */ - // keywordWithPropertyBlock '{' CRLF keyValuePair* '}' - public static boolean propertyBlockStatement(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "propertyBlockStatement")) return false; + // propertyKey propertyValue CRLF + public static boolean propertyDefinition(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertyDefinition")) return false; + if (!nextTokenIs(b, "", QUOTED_TEXT, UNQUOTED_TEXT)) return false; boolean r; - Marker m = enter_section_(b, l, _NONE_, PROPERTY_BLOCK_STATEMENT, ""); - r = keywordWithPropertyBlock(b, l + 1); - r = r && consumeTokens(b, 0, BRACE1, CRLF); - r = r && propertyBlockStatement_3(b, l + 1); - r = r && consumeToken(b, BRACE2); + Marker m = enter_section_(b, l, _NONE_, PROPERTY_DEFINITION, ""); + r = propertyKey(b, l + 1); + r = r && propertyValue(b, l + 1); + r = r && consumeToken(b, CRLF); exit_section_(b, l, m, r, false, null); return r; } - // keyValuePair* - private static boolean propertyBlockStatement_3(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "propertyBlockStatement_3")) return false; - while (true) { - int c = current_position_(b); - if (!keyValuePair(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "propertyBlockStatement_3", c)) break; - } - return true; + /* ********************************************************** */ + // text + public static boolean propertyKey(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertyKey")) return false; + if (!nextTokenIs(b, "", QUOTED_TEXT, UNQUOTED_TEXT)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, PROPERTY_KEY, ""); + r = text(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + /* ********************************************************** */ + // text + public static boolean propertyValue(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "propertyValue")) return false; + if (!nextTokenIs(b, "", QUOTED_TEXT, UNQUOTED_TEXT)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, PROPERTY_VALUE, ""); + r = text(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + /* ********************************************************** */ + // UNQUOTED_TEXT + public static boolean relationshipDestination(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "relationshipDestination")) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, UNQUOTED_TEXT); + exit_section_(b, m, RELATIONSHIP_DESTINATION, r); + return r; } /* ********************************************************** */ - // '!script' argument* '{' scriptContents '}' + // ARROW + public static boolean relationshipKeyword(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "relationshipKeyword")) return false; + if (!nextTokenIs(b, ARROW)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, ARROW); + exit_section_(b, m, RELATIONSHIP_KEYWORD, r); + return r; + } + + /* ********************************************************** */ + // UNQUOTED_TEXT + public static boolean relationshipSource(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "relationshipSource")) return false; + if (!nextTokenIs(b, UNQUOTED_TEXT)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, UNQUOTED_TEXT); + exit_section_(b, m, RELATIONSHIP_SOURCE, r); + return r; + } + + /* ********************************************************** */ + // '{' SCRIPT_TEXT '}' public static boolean scriptBlock(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "scriptBlock")) return false; - if (!nextTokenIs(b, SCRIPT_KEYWORD)) return false; + if (!nextTokenIs(b, BRACE1)) return false; boolean r; Marker m = enter_section_(b); - r = consumeToken(b, SCRIPT_KEYWORD); - r = r && scriptBlock_1(b, l + 1); - r = r && consumeToken(b, BRACE1); - r = r && scriptContents(b, l + 1); - r = r && consumeToken(b, BRACE2); + r = consumeTokens(b, 0, BRACE1, SCRIPT_TEXT, BRACE2); exit_section_(b, m, SCRIPT_BLOCK, r); return r; } + /* ********************************************************** */ + // scriptKeyword argument* scriptBlock lf_eof + public static boolean scriptDefinition(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "scriptDefinition")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, SCRIPT_DEFINITION, "