From 98f33a4ccf5da8933fd90601b9e2a99c5c389bbf Mon Sep 17 00:00:00 2001 From: se-cibuild <39725287+se-cibuild@users.noreply.github.com> Date: Sun, 6 Aug 2023 03:16:38 +0000 Subject: [PATCH] Deploy contents of GitHub pages to gh-pages branch --- 00.org/Explanations/CHANGELOG/index.html | 1833 +++++ 00.org/Explanations/FAQ/index.html | 755 ++ .../Explanations/StatusOfGrammars/index.html | 768 ++ 00.org/Licenses/LICENSE-BSD3CLAUSE/index.html | 725 ++ 00.org/Licenses/LICENSE-LGPL/index.html | 841 +++ .../LICENSE-MONTICORE-3-LEVEL/index.html | 913 +++ 404.html | 682 ++ MontiCoreHandbook2021.gif | Bin 0 -> 12777 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.220ee61c.min.js | 29 + assets/javascripts/bundle.220ee61c.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.74e28a9f.min.js | 42 + .../workers/search.74e28a9f.min.js.map | 8 + assets/stylesheets/main.eebd395e.min.css | 1 + assets/stylesheets/main.eebd395e.min.css.map | 1 + assets/stylesheets/palette.ecc896b0.min.css | 1 + .../stylesheets/palette.ecc896b0.min.css.map | 1 + ...ing-and-Testing--Usage-of-UML-Diagrams.png | Bin 0 -> 83346 bytes docs/BestPractices-CLI/index.html | 842 +++ docs/BestPractices-Errors/index.html | 735 ++ docs/BestPractices-Language-Design/index.html | 928 +++ docs/BestPractices-Symbols-Scopes/index.html | 818 ++ docs/BestPractices-Syntax-Design/index.html | 1021 +++ docs/BestPractices/index.html | 789 ++ docs/Bild6.png | Bin 0 -> 33446 bytes docs/BuildMontiCore/index.html | 777 ++ docs/DevelopedLanguages/index.html | 962 +++ docs/Download/index.html | 869 +++ docs/Eclipse.png | Bin 0 -> 161388 bytes docs/GenAutomataAST.png | Bin 0 -> 16128 bytes docs/GenAutomataParser.png | Bin 0 -> 15411 bytes docs/GenAutomataScopes.png | Bin 0 -> 22163 bytes docs/GenAutomataSymbols.png | Bin 0 -> 17103 bytes docs/GenAutomataVisitors.png | Bin 0 -> 47701 bytes docs/GettingStarted/index.html | 2183 ++++++ docs/IntelliJ-IDEA.png | Bin 0 -> 169826 bytes docs/Languages/index.html | 1512 ++++ docs/MontiCore--Selected-Languages.png | Bin 0 -> 161466 bytes docs/Notational-Conventions.png | Bin 0 -> 17521 bytes docs/Publications/index.html | 714 ++ docs/further_docs/Impressum/index.html | 807 ++ docs/small_bulb.png | Bin 0 -> 23180 bytes img/favicon.ico | Bin 0 -> 3358 bytes index.html | 943 +++ mc-logo.png | Bin 0 -> 104101 bytes monticore-grammar/build.gradle | 470 ++ .../src/main/examples/MCHexNumbers.mc4 | 67 + .../src/main/examples/MCNumbers.mc4 | 88 + .../src/main/examples/StringLiterals.mc4 | 99 + .../grammars/de/monticore/Cardinality.mc4 | 53 + .../grammars/de/monticore/Cardinality.mlc | 25 + .../grammars/de/monticore/Completeness.mc4 | 39 + .../grammars/de/monticore/Completeness.mlc | 46 + .../grammars/de/monticore/Grammars/index.html | 1596 ++++ .../main/grammars/de/monticore/JavaLight.mc4 | 106 + .../main/grammars/de/monticore/JavaLight.mlc | 30 + .../de/monticore/JavaLight/index.html | 839 +++ .../main/grammars/de/monticore/MCBasics.mc4 | 52 + .../main/grammars/de/monticore/MCBasics.mlc | 49 + .../main/grammars/de/monticore/MCCommon.mc4 | 21 + .../main/grammars/de/monticore/MCCommon.mlc | 23 + .../grammars/de/monticore/UMLModifier.mc4 | 57 + .../grammars/de/monticore/UMLModifier.mlc | 26 + .../grammars/de/monticore/UMLStereotype.mc4 | 93 + .../grammars/de/monticore/UMLStereotype.mlc | 25 + .../expressions/AssignmentExpressions.mc4 | 58 + .../expressions/AssignmentExpressions.mlc | 25 + .../monticore/expressions/BitExpressions.mc4 | 82 + .../monticore/expressions/BitExpressions.mlc | 25 + .../expressions/CommonExpressions.mc4 | 145 + .../expressions/CommonExpressions.mlc | 27 + .../expressions/Expressions/index.html | 825 ++ .../expressions/ExpressionsBasis.mc4 | 72 + .../expressions/ExpressionsBasis.mlc | 26 + .../expressions/JavaClassExpressions.mc4 | 131 + .../expressions/JavaClassExpressions.mlc | 25 + .../expressions/LambdaExpressions.mc4 | 72 + .../expressions/LambdaExpressions.mlc | 28 + .../expressions/StreamExpressions.mc4 | 76 + .../expressions/StreamExpressions.mlc | 23 + .../grammars/de/monticore/grammar/Grammar.mc4 | 687 ++ .../grammars/de/monticore/grammar/Grammar.mlc | 40 + .../grammar/Grammar_WithConcepts.mc4 | 41 + .../grammar/Grammar_WithConcepts.mlc | 36 + .../grammar/concepts/antlr/Antlr.mc4 | 38 + .../grammar/concepts/antlr/Antlr.mlc | 23 + .../de/monticore/literals/Literals/index.html | 806 ++ .../monticore/literals/MCCommonLiterals.mc4 | 297 + .../monticore/literals/MCCommonLiterals.mlc | 24 + .../de/monticore/literals/MCJavaLiterals.mc4 | 243 + .../de/monticore/literals/MCJavaLiterals.mlc | 23 + .../de/monticore/literals/MCLiteralsBasis.mc4 | 22 + .../de/monticore/literals/MCLiteralsBasis.mlc | 20 + .../statements/MCArrayStatements.mc4 | 40 + .../statements/MCArrayStatements.mlc | 24 + .../statements/MCAssertStatements.mc4 | 39 + .../statements/MCAssertStatements.mlc | 25 + .../statements/MCCommonStatements.mc4 | 117 + .../statements/MCCommonStatements.mlc | 27 + .../statements/MCExceptionStatements.mc4 | 65 + .../statements/MCExceptionStatements.mlc | 24 + .../statements/MCFullJavaStatements.mc4 | 39 + .../statements/MCFullJavaStatements.mlc | 24 + .../statements/MCLowLevelStatements.mc4 | 44 + .../statements/MCLowLevelStatements.mlc | 24 + .../statements/MCReturnStatements.mc4 | 36 + .../statements/MCReturnStatements.mlc | 25 + .../statements/MCStatementsBasis.mc4 | 57 + .../statements/MCStatementsBasis.mlc | 19 + .../statements/MCSynchronizedStatements.mc4 | 37 + .../statements/MCSynchronizedStatements.mlc | 24 + .../statements/MCVarDeclarationStatements.mc4 | 60 + .../statements/MCVarDeclarationStatements.mlc | 33 + .../de/monticore/symbols/BasicSymbols.mc4 | 95 + .../de/monticore/symbols/BasicSymbols.mlc | 29 + .../de/monticore/symbols/CompSymbols.mc4 | 31 + .../de/monticore/symbols/CompSymbols.mlc | 27 + .../de/monticore/symbols/OOSymbols.mc4 | 103 + .../de/monticore/symbols/OOSymbols.mlc | 29 + .../de/monticore/tf/ODRuleGeneration.mc4 | 124 + .../de/monticore/tf/ODRuleGeneration.mlc | 24 + .../main/grammars/de/monticore/tf/ODRules.mc4 | 121 + .../main/grammars/de/monticore/tf/ODRules.mlc | 43 + .../grammars/de/monticore/tf/TFBasisExts.mc4 | 16 + .../grammars/de/monticore/tf/TFBasisExts.mlc | 22 + .../grammars/de/monticore/tf/TFCommons.mc4 | 109 + .../grammars/de/monticore/tf/TFCommons.mlc | 20 + .../de/monticore/types/MCArrayTypes.mc4 | 34 + .../de/monticore/types/MCArrayTypes.mlc | 29 + .../de/monticore/types/MCBasicTypes.mc4 | 105 + .../de/monticore/types/MCBasicTypes.mlc | 33 + .../de/monticore/types/MCCollectionTypes.mc4 | 80 + .../de/monticore/types/MCCollectionTypes.mlc | 29 + .../de/monticore/types/MCFullGenericTypes.mc4 | 57 + .../de/monticore/types/MCFullGenericTypes.mlc | 29 + .../de/monticore/types/MCFunctionTypes.mc4 | 41 + .../de/monticore/types/MCFunctionTypes.mlc | 28 + .../monticore/types/MCSimpleGenericTypes.mc4 | 56 + .../monticore/types/MCSimpleGenericTypes.mlc | 29 + .../de/monticore/types/Types/index.html | 847 +++ .../literals/tr/MCCommonLiteralsTRHC.mc4 | 216 + .../CompletenessPrettyPrinter.java | 34 + ...entExpressionsOnlyAssignToLValuesCoCo.java | 78 + .../AssignmentExpressionsTypeVisitor.java | 299 + .../types3/BitExpressionsTypeVisitor.java | 185 + .../expressions/cocos/ExpressionValid.java | 39 + .../_ast/ASTCallExpression.java | 19 + .../_ast/ASTFieldAccessExpression.java | 19 + .../types3/CommonExpressionsTypeVisitor.java | 1078 +++ .../CommonExpressionsLValueRelations.java | 32 + .../_ast/ASTNameExpression.java | 19 + .../types3/ExpressionBasisTypeVisitor.java | 74 + .../AssignmentExpressionsFullJavaPrinter.java | 33 + .../AssignmentExpressionsJavaPrinter.java | 19 + .../BitExpressionsFullJavaPrinter.java | 39 + .../exptojava/BitExpressionsJavaPrinter.java | 18 + .../CommonExpressionsFullJavaPrinter.java | 33 + .../CommonExpressionsJavaPrinter.java | 43 + .../ExpressionsBasisFullJavaPrinter.java | 47 + .../ExpressionsBasisJavaPrinter.java | 18 + .../JavaClassExpressionsFullJavaPrinter.java | 66 + .../JavaClassExpressionsJavaPrinter.java | 18 + .../LambdaExpressionsFullJavaPrinter.java | 41 + .../LambdaExpressionsJavaPrinter.java | 18 + .../LegacyCommonExpressionsJavaPrinter.java | 53 + .../LambdaExpressionsSTCompleteTypes.java | 39 + .../LambdaExpressionsSTCompleteTypes2.java | 56 + .../types3/LambdaExpressionsTypeVisitor.java | 56 + ...ssignmentExpressionsFullPrettyPrinter.java | 37 + .../AssignmentExpressionsPrettyPrinter.java | 131 + .../BitExpressionsFullPrettyPrinter.java | 36 + .../BitExpressionsPrettyPrinter.java | 89 + .../CommonExpressionsFullPrettyPrinter.java | 36 + .../CommonExpressionsPrettyPrinter.java | 239 + .../ExpressionsBasisFullPrettyPrinter.java | 54 + .../ExpressionsBasisPrettyPrinter.java | 74 + ...JavaClassExpressionsFullPrettyPrinter.java | 45 + .../JavaClassExpressionsPrettyPrinter.java | 250 + .../LambdaExpressionsFullPrettyPrinter.java | 61 + .../LambdaExpressionsPrettyPrinter.java | 94 + .../monticore/grammar/ComponentCollector.java | 56 + .../grammar/DirectLeftRecursionDetector.java | 75 + .../java/de/monticore/grammar/LexNamer.java | 172 + .../grammar/MCGrammarSymbolTableHelper.java | 314 + .../de/monticore/grammar/Multiplicity.java | 222 + .../grammar/MultiplicityVisitor.java | 138 + .../de/monticore/grammar/PredicatePair.java | 38 + .../de/monticore/grammar/RegExpBuilder.java | 163 + ...ASTRuleAndNTUseSameAttrNameForDiffNTs.java | 100 + ...ractNTNotExtendInterfaceOrExternalNTs.java | 45 + ...tractNTOnlyExtendOrAstextendNTOrClass.java | 27 + .../AbstractNTOnlyExtendsOneNTOrClass.java | 32 + .../AbstractNTOnlyImplementInterfaceNTs.java | 42 + ...ithoutExtensionOnlyInComponentGrammar.java | 100 + .../grammar/cocos/AttributeNameLowerCase.java | 32 + .../cocos/ConservativeExtensionCheck.java | 74 + .../cocos/DerivedAndManualListName.java | 63 + .../grammar/cocos/DuplicatedEnumConstant.java | 36 + .../DuplicatedSymbolDefinitionInProd.java | 33 + .../grammar/cocos/ExternalNTNoASTRule.java | 25 + .../ExternalNTOnlyInComponentGrammar.java | 77 + .../monticore/grammar/cocos/GrammarCoCos.java | 113 + .../grammar/cocos/GrammarExtensionOnce.java | 31 + .../cocos/GrammarInheritanceCycle.java | 35 + .../grammar/cocos/GrammarNameUpperCase.java | 28 + .../grammar/cocos/InheritedModiOverwrite.java | 43 + .../grammar/cocos/InheritedScopeProperty.java | 35 + .../cocos/InheritedSymbolProperty.java | 39 + .../InterfaceNTOnlyExtendInterfaceNTs.java | 46 + ...tImplementationOnlyInComponentGrammar.java | 123 + .../grammar/cocos/KeyConstantInvalid.java | 24 + .../grammar/cocos/KeyRuleWithoutName.java | 48 + .../grammar/cocos/KeywordAlternativeName.java | 31 + .../grammar/cocos/KeywordInvalidName.java | 36 + .../grammar/cocos/KeywordRuleInvalid.java | 24 + .../cocos/LeftRecursiveRulesInBlock.java | 47 + .../grammar/cocos/LexNTsNotEmpty.java | 64 + .../grammar/cocos/LexNTsOnlyUseLexNTs.java | 41 + .../cocos/LexProdModeNameUpperCase.java | 26 + .../grammar/cocos/MultipleASTRules.java | 38 + .../grammar/cocos/NTAndASTRuleExtendType.java | 52 + .../cocos/NTDefinedByAtmostOneProduction.java | 44 + .../grammar/cocos/NTForASTRuleExists.java | 46 + .../NTNotExtendInterfaceOrExternalNTs.java | 47 + .../NTOnlyExtendOrAstextendNTOrClass.java | 27 + .../cocos/NTOnlyExtendsOneNTOrClass.java | 32 + .../cocos/NTOnlyImplementInterfaceNTs.java | 43 + .../grammar/cocos/NTUniqueIgnoreCase.java | 47 + .../grammar/cocos/NoASTExtendsForClasses.java | 72 + .../grammar/cocos/NoASTRuleForEnumNTs.java | 37 + ...NoExtensionOfSymbolThatOnlySpansScope.java | 70 + .../grammar/cocos/NoForbiddenGrammarName.java | 30 + .../cocos/NoForbiddenProdAndSymbolName.java | 49 + .../grammar/cocos/NoForbiddenProdName.java | 46 + .../cocos/NoForbiddenProdNameAddon.java | 47 + .../grammar/cocos/NoForbiddenSymbolName.java | 42 + .../cocos/NoForbiddenSymbolNameAddon.java | 66 + .../grammar/cocos/NoMultipleSymbolRule.java | 33 + .../grammar/cocos/NoNTInheritanceCycle.java | 34 + ...oNestedGenericsInAdditionalAttributes.java | 126 + .../cocos/NoOverridingNTHasAnnotation.java | 36 + .../NoReplaceKeywordRuleOnConstantGroup.java | 50 + ...placeKeywordRuleOnUsageNamedAttribute.java | 51 + .../grammar/cocos/NoTokenDefined.java | 52 + .../grammar/cocos/NoTokenDefinedVisitor.java | 56 + .../cocos/NoTokenModeInComponentGrammar.java | 25 + .../grammar/cocos/OverridingAbstractNTs.java | 58 + ...OverridingAbstractNTsHaveNoSuperRules.java | 52 + .../cocos/OverridingAdditionalAttributes.java | 39 + .../grammar/cocos/OverridingEnumNTs.java | 46 + .../grammar/cocos/OverridingInterfaceNTs.java | 49 + .../grammar/cocos/OverridingLexNTs.java | 47 + .../cocos/OverridingNTHasNoAnnotation.java | 44 + .../grammar/cocos/OverridingNTs.java | 61 + .../cocos/OverridingNTsHaveNoSuperRules.java | 53 + .../grammar/cocos/PackageNameLowerCase.java | 33 + ...ExtendedProdUseSameAttrNameForDiffNTs.java | 101 + ...erriddenProdUseSameAttrNameForDiffNTs.java | 80 + .../cocos/ProdExtendsNotExistingProd.java | 34 + .../grammar/cocos/ProdStartsWithCapital.java | 24 + .../grammar/cocos/ProdWithDoubleAnnos.java | 34 + .../ProdWithExtensionMustNotBeOverridden.java | 59 + .../grammar/cocos/ReferenceSymbolNotName.java | 22 + .../cocos/ReferenceSymbolSameAttribute.java | 32 + .../ReferenceSymbolSameAttributeVisitor.java | 29 + .../grammar/cocos/ReferencedNTNotDefined.java | 78 + .../grammar/cocos/ReferencedSymbolExists.java | 33 + .../cocos/RuleComponentsCompatible.java | 79 + .../cocos/ScopeProdOverwrittenByScope.java | 48 + .../grammar/cocos/SplitRuleInvalid.java | 26 + .../cocos/SubrulesUseInterfaceNTs.java | 111 + .../cocos/SymbolProdOverwrittenBySymbol.java | 48 + .../grammar/cocos/SymbolRuleHasName.java | 23 + .../cocos/SymbolRuleWithoutSymbolRef.java | 27 + .../grammar/cocos/SymbolWithManyNames.java | 36 + .../grammar/cocos/TerminalCritical.java | 27 + .../grammar/cocos/TerminalEmptyString.java | 26 + .../grammar/cocos/TokenConstantInvalid.java | 21 + .../cocos/UniqueProdNameInGrammar.java | 41 + .../cocos/UnnamedTerminalInInterface.java | 40 + .../grammar/cocos/UsedLexNTNotDefined.java | 39 + .../grammar/cocos/UsedNTNotDefined.java | 38 + .../grammar/grammar/_ast/ASTConstant.java | 52 + .../grammar/grammar/_ast/ASTKeyTerminal.java | 10 + .../grammar/grammar/_ast/ASTParserProd.java | 9 + .../grammar/grammar/_ast/ASTProd.java | 16 + .../grammar/_ast/ASTRuleComponent.java | 12 + .../grammar/_ast/ASTTokenTerminal.java | 10 + .../_prettyprint/GrammarPrettyPrinter.java | 315 + .../_symboltable/GrammarSTCompleteTypes.java | 339 + .../_symboltable/GrammarScopesGenitor.java | 369 + .../grammar/_symboltable/IGrammarScope.java | 116 + .../grammar/_symboltable/MCGrammarSymbol.java | 324 + .../_symboltable/MCGrammarSymbolBuilder.java | 23 + .../grammar/_symboltable/ProdSymbol.java | 90 + .../_symboltable/ProdSymbolSurrogate.java | 25 + .../_symboltable/RuleComponentSymbol.java | 28 + .../FullSynthesizeFromMCSGT4Grammar.java | 40 + .../SynthesizeFromMCBT4Grammar.java | 22 + .../SynthesizeFromMCSGT4Grammar.java | 22 + .../_parser/GrammarTransformer.java | 140 + .../_parser/Grammar_WithConceptsParser.java | 74 + .../_parser/RuleComponentListFinder.java | 34 + .../Grammar_WithConceptsGlobalScope.java | 71 + .../Grammar_WithConceptsPhasedSTC.java | 41 + .../Grammar_WithConceptsScopesGenitor.java | 38 + ...ar_WithConceptsScopesGenitorDelegator.java | 27 + .../prettyprint/AntlrPrettyPrinter.java | 75 + .../prettyprint/GrammarPrettyPrinter.java | 1193 +++ ...Grammar_WithConceptsFullPrettyPrinter.java | 195 + .../Grammar_WithConceptsPrettyPrinter.java | 135 + .../JavaLightSTCompleteTypes.java | 137 + .../_symboltable/JavaMethodSymbolDeSer.java | 42 + ...structorFormalParametersDifferentName.java | 38 + .../cocos/ConstructorModifiersValid.java | 23 + .../ConstructorNoAccessModifierPair.java | 32 + .../cocos/ConstructorNoDuplicateModifier.java | 54 + .../MethodAbstractAndOtherModifiers.java | 31 + .../javalight/cocos/MethodBodyAbsence.java | 26 + .../javalight/cocos/MethodBodyPresence.java | 25 + .../cocos/MethodExceptionThrows.java | 31 + .../MethodFormalParametersDifferentName.java | 42 + .../cocos/MethodNoDuplicateModifier.java | 55 + .../cocos/MethodNoNativeAndStrictfp.java | 26 + .../cocos/ReturnTypeAssignmentIsValid.java | 91 + .../monticore/literals/MCLiteralsDecoder.java | 219 + .../MCCommonLiteralsPrettyPrinter.java | 38 + .../cocos/BasicDoubleLiteralRangeCoCo.java | 37 + .../cocos/BasicFloatLiteralRangeCoCo.java | 37 + .../cocos/BasicLongLiteralRangeCoCo.java | 37 + .../cocos/NatLiteralRangeCoCo.java | 37 + .../SignedBasicDoubleLiteralRangeCoCo.java | 37 + .../SignedBasicFloatLiteralRangeCoCo.java | 37 + .../SignedBasicLongLiteralRangeCoCo.java | 37 + .../cocos/SignedNatLiteralRangeCoCo.java | 37 + .../types3/MCCommonLiteralsTypeVisitor.java | 144 + .../cocos/DoubleLiteralRangeCoCo.java | 37 + .../cocos/FloatLiteralRangeCoCo.java | 37 + .../cocos/IntLiteralRangeCoCo.java | 51 + .../cocos/LongLiteralRangeCoCo.java | 51 + .../types3/MCJavaLiteralsTypeVisitor.java | 39 + .../MCCommonLiteralsFullPrettyPrinter.java | 49 + .../MCCommonLiteralsPrettyPrinter.java | 153 + .../MCJavaLiteralsFullPrettyPrinter.java | 38 + .../MCJavaLiteralsPrettyPrinter.java | 82 + .../CardinalityFullPrettyPrinter.java | 50 + .../prettyprint/CardinalityPrettyPrinter.java | 56 + .../CompletenessFullPrettyPrinter.java | 41 + .../CompletenessPrettyPrinter.java | 51 + .../JavaLightFullPrettyPrinter.java | 83 + .../prettyprint/JavaLightPrettyPrinter.java | 214 + .../prettyprint/MCBasicsPrettyPrinter.java | 32 + .../UMLModifierFullPrettyPrinter.java | 53 + .../prettyprint/UMLModifierPrettyPrinter.java | 71 + .../UMLStereotypeFullPrettyPrinter.java | 50 + .../UMLStereotypePrettyPrinter.java | 56 + ...entsPhasedSymbolTableCreatorDelegator.java | 34 + .../MCCommonStatementsSTCompleteTypes.java | 31 + .../cocos/AssertIsValid.java | 45 + .../cocos/CatchIsValid.java | 41 + .../cocos/DoWhileConditionHasBooleanType.java | 33 + .../cocos/ExpressionStatementIsValid.java | 28 + .../cocos/ForConditionHasBooleanType.java | 34 + .../cocos/ForEachIsValid.java | 37 + .../cocos/IfConditionHasBooleanType.java | 33 + .../ResourceInTryStatementCloseable.java | 36 + .../cocos/SwitchStatementValid.java | 35 + .../cocos/SynchronizedArgIsReftype.java | 31 + .../cocos/ThrowIsValid.java | 35 + .../cocos/WhileConditionHasBooleanType.java | 32 + ...clarationInitializationHasCorrectType.java | 77 + ...entsPhasedSymbolTableCreatorDelegator.java | 34 + ...rDeclarationStatementsSTCompleteTypes.java | 50 + .../MCArrayStatementsFullPrettyPrinter.java | 48 + .../MCArrayStatementsPrettyPrinter.java | 65 + .../MCAssertStatementsFullPrettyPrinter.java | 55 + .../MCAssertStatementsPrettyPrinter.java | 50 + .../MCCommonStatementsFullPrettyPrinter.java | 67 + .../MCCommonStatementsPrettyPrinter.java | 276 + ...CExceptionStatementsFullPrettyPrinter.java | 59 + .../MCExceptionStatementsPrettyPrinter.java | 154 + ...MCLowLevelStatementsFullPrettyPrinter.java | 55 + .../MCLowLevelStatementsPrettyPrinter.java | 70 + .../MCReturnStatementsFullPrettyPrinter.java | 57 + .../MCReturnStatementsPrettyPrinter.java | 48 + ...nchronizedStatementsFullPrettyPrinter.java | 59 + ...MCSynchronizedStatementsPrettyPrinter.java | 51 + ...eclarationStatementsFullPrettyPrinter.java | 60 + ...VarDeclarationStatementsPrettyPrinter.java | 83 + .../basicsymbols/BasicSymbolsMill.java | 74 + .../_symboltable/FunctionSymbol.java | 112 + .../_symboltable/FunctionSymbolDeSer.java | 20 + .../_symboltable/IBasicSymbolsScope.java | 78 + .../basicsymbols/_symboltable/TypeSymbol.java | 109 + .../_symboltable/TypeSymbolDeSer.java | 23 + .../_symboltable/TypeSymbolSurrogate.java | 45 + .../_symboltable/TypeVarSymbol.java | 41 + .../_symboltable/TypeVarSymbolDeSer.java | 23 + .../_symboltable/VariableSymbol.java | 60 + .../_symboltable/VariableSymbolDeSer.java | 20 + .../_symboltable/ComponentSymbol.java | 295 + .../_symboltable/ComponentSymbolDeSer.java | 206 + .../compsymbols/_symboltable/PortSymbol.java | 83 + .../_symboltable/PortSymbolDeSer.java | 41 + .../_symboltable/SubcomponentSymbolDeSer.java | 38 + .../compsymbols/_symboltable/Timing.java | 43 + .../monticore/symbols/library/StreamType.java | 241 + .../oosymbols/_symboltable/FieldSymbol.java | 66 + .../_symboltable/FieldSymbolDeSer.java | 20 + .../_symboltable/IOOSymbolsScope.java | 128 + .../oosymbols/_symboltable/MethodSymbol.java | 69 + .../_symboltable/MethodSymbolDeSer.java | 20 + .../oosymbols/_symboltable/OOTypeSymbol.java | 139 + .../_symboltable/OOTypeSymbolDeSer.java | 23 + .../_symboltable/OOTypeSymbolSurrogate.java | 31 + .../CollectCoCoInformationState.java | 75 + .../_ast/ASTDeleteOperation.java | 63 + .../_ast/ASTDeleteOperationBuilder.java | 19 + .../_ast/ASTTransformationStructure.java | 74 + .../ASTTransformationStructureBuilder.java | 78 + .../AddAffixesToAssignmentsVisitor.java | 149 + .../tf/odrules/ChangeOperationFactory.java | 626 ++ .../tf/odrules/DifferenceFinder.java | 324 + .../tf/odrules/GenerateConditionsVisitor.java | 486 ++ .../GenerateLinkConditionsVisitor.java | 88 + .../monticore/tf/odrules/HierarchyHelper.java | 745 ++ .../de/monticore/tf/odrules/ODBuildOrder.java | 103 + .../tf/odrules/ODRuleCodeGenerator.java | 770 ++ .../de/monticore/tf/odrules/ODRulesCLI.java | 144 + .../tf/odrules/_ast/ASTODAttribute.java | 99 + .../monticore/tf/odrules/_ast/ASTODLink.java | 145 + .../tf/odrules/_ast/ASTODObject.java | 131 + .../odrules/_symboltable/IODRulesScope.java | 28 + .../AddSuffixToOptionalsVisitor.java | 154 + .../CalculateContextVisitor.java | 59 + .../CheckIfContainsTargetVisitor.java | 33 + .../DeleteMatchAccessVisitor.java | 115 + .../subConstraints/FindDependVarsVisitor.java | 39 + .../subConstraints/FindOptionalsVisitor.java | 47 + .../FindSubExpressionVisitor.java | 35 + .../InsertIsPresentChecksVisitor.java | 255 + .../subConstraints/ODSubConstraint.java | 55 + .../ReplaceIdentifierVisitor.java | 178 + .../tf/odrules/util/NameASTPair.java | 27 + .../tf/odrules/util/ODRuleStereotypes.java | 11 + .../tf/odrules/util/ODRulesPrettyPrinter.java | 337 + .../util/TFExpressionFullPrettyPrinter.java | 148 + .../de/monticore/tf/odrules/util/Util.java | 324 + .../ruletranslation/ODRuleNameGenerator.java | 96 + .../tf/ruletranslation/Position.java | 7 + .../tf/ruletranslation/Rule2ODState.java | 132 + .../tf/ruletranslation/Rule2ODVisitor.java | 446 ++ .../types/MCArrayTypesNodeIdentHelper.java | 16 + .../monticore/types/MCBasicTypesHelper.java | 72 + .../types/MCBasicTypesNodeIdentHelper.java | 43 + .../MCCollectionTypesNodeIdentHelper.java | 61 + .../MCFullGenericTypesNodeIdentHelper.java | 16 + .../MCSimpleGenericTypesNodeIdentHelper.java | 28 + .../java/de/monticore/types/MCTypeFacade.java | 277 + .../monticore/types/check/AbstractDerive.java | 39 + .../check/AbstractDeriveFromExpression.java | 135 + .../types/check/AbstractSynthesize.java | 49 + .../check/AbstractSynthesizeFromType.java | 55 + .../types/check/CompKindExprDeSer.java | 21 + .../types/check/CompKindExpression.java | 158 + .../DeriveSymTypeOfAssignmentExpressions.java | 312 + .../DeriveSymTypeOfBSCommonExpressions.java | 1252 +++ .../check/DeriveSymTypeOfBitExpressions.java | 216 + .../DeriveSymTypeOfCommonExpressions.java | 52 + .../check/DeriveSymTypeOfExpression.java | 91 + .../DeriveSymTypeOfJavaClassExpressions.java | 728 ++ .../DeriveSymTypeOfLambdaExpressions.java | 83 + .../types/check/DeriveSymTypeOfLiterals.java | 60 + .../DeriveSymTypeOfMCCommonLiterals.java | 121 + .../check/DeriveSymTypeOfMCJavaLiterals.java | 43 + .../types/check/FullCompKindExprDeSer.java | 73 + .../check/FullSynthesizeFromMCArrayTypes.java | 34 + .../check/FullSynthesizeFromMCBasicTypes.java | 30 + .../FullSynthesizeFromMCCollectionTypes.java | 31 + .../FullSynthesizeFromMCFullGenericTypes.java | 41 + .../FullSynthesizeFromMCFunctionTypes.java | 29 + ...ullSynthesizeFromMCSimpleGenericTypes.java | 38 + .../de/monticore/types/check/IDerive.java | 16 + .../de/monticore/types/check/ISynthesize.java | 19 + .../types/check/ISynthesizeComponent.java | 18 + .../monticore/types/check/ITypeRelations.java | 82 + .../types/check/KindOfComponent.java | 59 + .../types/check/KindOfComponentDeSer.java | 53 + .../types/check/KindOfGenericComponent.java | 201 + .../check/KindOfGenericComponentDeSer.java | 60 + .../monticore/types/check/SymTypeArray.java | 165 + .../types/check/SymTypeArrayDeSer.java | 48 + .../types/check/SymTypeExpression.java | 513 ++ .../types/check/SymTypeExpressionDeSer.java | 224 + .../types/check/SymTypeExpressionFactory.java | 415 + .../monticore/types/check/SymTypeObscure.java | 86 + .../types/check/SymTypeOfFunction.java | 413 + .../types/check/SymTypeOfFunctionDeSer.java | 54 + .../types/check/SymTypeOfGenerics.java | 425 ++ .../types/check/SymTypeOfGenericsDeSer.java | 52 + .../types/check/SymTypeOfIntersection.java | 179 + .../check/SymTypeOfIntersectionDeSer.java | 52 + .../monticore/types/check/SymTypeOfNull.java | 55 + .../types/check/SymTypeOfObject.java | 102 + .../types/check/SymTypeOfObjectDeSer.java | 39 + .../monticore/types/check/SymTypeOfUnion.java | 187 + .../types/check/SymTypeOfUnionDeSer.java | 52 + .../types/check/SymTypeOfWildcard.java | 141 + .../types/check/SymTypeOfWildcardDeSer.java | 43 + .../types/check/SymTypePrimitive.java | 216 + .../types/check/SymTypePrimitiveDeSer.java | 37 + .../types/check/SymTypeVariable.java | 250 + .../types/check/SymTypeVariableDeSer.java | 40 + .../de/monticore/types/check/SymTypeVoid.java | 45 + .../types/check/SynthComp4MCBasicTypes.java | 70 + .../check/SynthComp4MCSimpleGenericTypes.java | 104 + .../types/check/SynthCompResult.java | 32 + .../SynthesizeSymTypeFromMCArrayTypes.java | 61 + .../SynthesizeSymTypeFromMCBasicTypes.java | 163 + ...ynthesizeSymTypeFromMCCollectionTypes.java | 150 + ...nthesizeSymTypeFromMCFullGenericTypes.java | 75 + .../SynthesizeSymTypeFromMCFunctionTypes.java | 79 + ...hesizeSymTypeFromMCSimpleGenericTypes.java | 103 + .../monticore/types/check/TypeCalculator.java | 266 + .../de/monticore/types/check/TypeCheck.java | 88 + .../types/check/TypeCheck/index.html | 826 ++ .../types/check/TypeCheckResult.java | 91 + .../monticore/types/check/TypeRelations.java | 300 + .../check/helpers/DefiningSymbolHandler.java | 85 + .../check/helpers/DefiningSymbolSetter.java | 14 + ...efiningSymbolSetter4CommonExpressions.java | 36 + .../types/check/helpers/ExprToNamePair.java | 28 + .../check/helpers/ExprToOptNamePair.java | 30 + .../helpers/SubExprNameExtractionResult.java | 105 + .../helpers/SubExprNameExtractionVisitor.java | 68 + .../check/helpers/SubExprNameExtractor.java | 21 + ...ubExprNameExtractor4CommonExpressions.java | 49 + .../types3wrapper/TypeCheck3AsIDerive.java | 63 + .../TypeCheck3AsISynthesize.java | 65 + .../TypeCheck3AsTypeCalculator.java | 54 + .../types/mcarraytypes/MCArrayTypesMill.java | 48 + .../mcarraytypes/_ast/ASTMCArrayType.java | 25 + .../MCArrayTypesPrettyPrinter.java | 29 + .../types3/MCArrayTypesTypeVisitor.java | 32 + .../CalculatePotentialQNames.java | 38 + .../types/mcbasictypes/MCBasicTypesMill.java | 53 + .../_ast/ASTMCImportStatement.java | 24 + .../mcbasictypes/_ast/ASTMCPrimitiveType.java | 57 + .../mcbasictypes/_ast/ASTMCQualifiedName.java | 27 + .../mcbasictypes/_ast/ASTMCQualifiedType.java | 26 + .../mcbasictypes/_ast/ASTMCReturnType.java | 26 + .../types/mcbasictypes/_ast/ASTMCType.java | 31 + .../types3/MCBasicTypesTypeVisitor.java | 190 + .../MCCollectionTypesMill.java | 53 + .../_ast/ASTMCBasicTypeArgument.java | 22 + .../_ast/ASTMCGenericType.java | 161 + .../mccollectiontypes/_ast/ASTMCListType.java | 43 + .../mccollectiontypes/_ast/ASTMCMapType.java | 50 + .../_ast/ASTMCMapTypeBuilder.java | 38 + .../_ast/ASTMCOptionalType.java | 41 + .../_ast/ASTMCPrimitiveTypeArgument.java | 17 + .../mccollectiontypes/_ast/ASTMCSetType.java | 44 + .../_ast/ASTMCTypeArgument.java | 28 + .../types3/IMCCollectionTypeRelations.java | 33 + .../types3/MCCollectionTypesTypeVisitor.java | 95 + .../util/MCCollectionSymTypeFactory.java | 62 + .../util/MCCollectionTypeRelations.java | 92 + .../MCFullGenericTypesMill.java | 53 + .../_ast/ASTMCMultipleGenericType.java | 45 + .../_ast/ASTMCWildcardTypeArgument.java | 21 + .../types3/MCFullGenericTypesTypeVisitor.java | 67 + .../_ast/ASTMCFunctionType.java | 21 + .../types3/MCFunctionTypesTypeVisitor.java | 59 + .../MCSimpleGenericTypesMill.java | 54 + .../_ast/ASTMCBasicGenericType.java | 21 + .../_ast/ASTMCCustomTypeArgument.java | 22 + .../MCSimpleGenericTypesTypeVisitor.java | 126 + .../MCArrayTypesFullPrettyPrinter.java | 37 + .../MCArrayTypesPrettyPrinter.java | 47 + .../MCBasicTypesFullPrettyPrinter.java | 57 + .../MCBasicTypesPrettyPrinter.java | 107 + .../MCCollectionTypesFullPrettyPrinter.java | 51 + .../MCCollectionTypesPrettyPrinter.java | 67 + .../MCFullGenericTypesFullPrettyPrinter.java | 47 + .../MCFullGenericTypesPrettyPrinter.java | 80 + .../MCFunctionTypesFullPrettyPrinter.java | 38 + .../MCFunctionTypesPrettyPrinter.java | 66 + ...MCSimpleGenericTypesFullPrettyPrinter.java | 42 + .../MCSimpleGenericTypesPrettyPrinter.java | 80 + .../monticore/types3/AbstractTypeVisitor.java | 53 + .../monticore/types3/ISymTypeRelations.java | 139 + .../de/monticore/types3/ISymTypeVisitor.java | 55 + .../de/monticore/types3/SymTypeRelations.java | 16 + .../java/de/monticore/types3/Type4Ast.java | 480 ++ .../types3/util/BuiltInTypeRelations.java | 168 + .../types3/util/FunctionRelations.java | 124 + .../types3/util/ILValueRelations.java | 23 + .../util/NameExpressionTypeCalculator.java | 231 + .../util/NominalSuperTypeCalculator.java | 148 + .../util/OONameExpressionTypeCalculator.java | 41 + .../OOWithinTypeBasicSymbolsResolver.java | 90 + .../types3/util/SymTypeBoxingVisitor.java | 151 + .../util/SymTypeCompatibilityCalculator.java | 533 ++ .../types3/util/SymTypeDeepCloneVisitor.java | 228 + .../types3/util/SymTypeLubCalculator.java | 237 + .../types3/util/SymTypeNormalizeVisitor.java | 381 + .../types3/util/SymTypeRelations.java | 164 + .../types3/util/SymTypeUnboxingVisitor.java | 143 + .../util/SymTypeVariableReplaceVisitor.java | 61 + .../types3/util/TypeContextCalculator.java | 118 + .../util/WithinTypeBasicSymbolsResolver.java | 422 ++ .../umlmodifier/_ast/ASTModifierBuilder.java | 66 + .../UMLModifierPrettyPrinter.java | 75 + .../umlstereotype/_ast/ASTStereoValue.java | 23 + .../grammars/de/monticore/TestCardinality.mc4 | 7 + .../de/monticore/TestCompleteness.mc4 | 9 + .../grammars/de/monticore/TestJavaLight.mc4 | 15 + .../grammars/de/monticore/TestMCCommon.mc4 | 7 + .../de/monticore/TestMCHexNumbers.mc4 | 7 + .../de/monticore/TestMCLiteralsV2.mc4 | 26 + .../de/monticore/TestMCLiteralsV3.mc4 | 20 + .../grammars/de/monticore/TestMCNumbers.mc4 | 7 + .../de/monticore/TestStringLiterals.mc4 | 10 + .../grammars/de/monticore/TestUMLModifier.mc4 | 9 + .../de/monticore/TestUMLStereotype.mc4 | 10 + .../de/monticore/aggregation/Blah.mc4 | 13 + .../grammars/de/monticore/aggregation/Foo.mc4 | 10 + .../expressions/AbstractTypeCheckTest.mc4 | 11 + .../CombineExpressionsWithLiterals.mc4 | 30 + .../expressions/TestAssignmentExpressions.mc4 | 9 + .../expressions/TestBitExpressions.mc4 | 6 + .../expressions/TestCommonExpressions.mc4 | 11 + .../expressions/TestJavaClassExpressions.mc4 | 18 + .../expressions/TestLambdaExpressions.mc4 | 11 + .../expressions/TestStreamExpressions.mc4 | 9 + .../literals/TestMCCommonLiterals.mc4 | 7 + .../monticore/literals/TestMCJavaLiterals.mc4 | 7 + .../statements/TestMCArrayStatements.mc4 | 10 + .../statements/TestMCAssertStatements.mc4 | 8 + .../statements/TestMCCommonStatements.mc4 | 9 + .../statements/TestMCExceptionStatements.mc4 | 8 + .../statements/TestMCFullJavaStatements.mc4 | 7 + .../statements/TestMCLowLevelStatements.mc4 | 8 + .../statements/TestMCReturnStatements.mc4 | 7 + .../TestMCSynchronizedStatements.mc4 | 8 + .../TestMCVarDeclarationStatements.mc4 | 12 + .../testsymtabmill/TestSymTabMill.mc4 | 9 + .../de/monticore/typepersistence/Variable.mc4 | 10 + .../de/monticore/types/GenericTypesTest.mc4 | 8 + .../de/monticore/types/MCArrayTypesTest.mc4 | 9 + .../de/monticore/types/MCBasicTypesTest.mc4 | 8 + .../monticore/types/MCCollectionTypesTest.mc4 | 8 + ...MCCollectionTypesWithoutPrimitivesTest.mc4 | 9 + .../types/MCFullGenericTypesTest.mc4 | 8 + .../monticore/types/MCFunctionTypesTest.mc4 | 7 + .../types/MCSimpleGenericTypesTest.mc4 | 8 + .../java/de/monticore/MCCommonUnitTest.java | 293 + .../java/de/monticore/SymbolImportTest.java | 92 + .../aggregation/AggregationTest.java | 118 + .../aggregation/blah/Bar2DummySymbol.java | 21 + .../foo/_symboltable/FooGlobalScope.java | 61 + ...xpressionsOnlyAssignToLValuesCoCoTest.java | 200 + .../cocos/ExpressionValidTest.java | 74 + ...ineExpressionsWithLiteralsCoCoChecker.java | 11 + .../_cocos/NoClassExpressionForGenerics.java | 40 + .../TestNoClassExpressionForGenerics.java | 75 + .../AssignmentExpressionsJavaPrinterTest.java | 345 + .../BitExpressionsJavaPrinterTest.java | 150 + .../CommonExpressionsJavaPrinterTest.java | 473 ++ .../JavaClassExpressionsJavaPrinterTest.java | 199 + ...ssignmentExpressionsPrettyPrinterTest.java | 345 + .../BitExpressionsPrettyPrinterTest.java | 153 + .../CommonExpressionsPrettyPrinterTest.java | 464 ++ ...JavaClassExpressionsPrettyPrinterTest.java | 290 + .../LambdaExpressionsPrettyPrinterTest.java | 140 + .../StreamExpressionsPrettyPrinterTest.java | 113 + .../GrammarGlobalScopeTestFactory.java | 25 + .../grammar/MCGrammarParserTest.java | 223 + .../grammar/MCGrammarPrettyPrinterTest.java | 164 + ...uleAndNTUseSameAttrNameForDiffNTsTest.java | 30 + ...NTNotExtendInterfaceOrExternalNTsTest.java | 37 + ...AbstractNTOnlyExtendsOneNTOrClassTest.java | 35 + ...TOnlyExtendsOrAstextendsNTOrClassTest.java | 31 + ...stractNTOnlyImplementInterfaceNTsTest.java | 52 + ...utExtensionOnlyInComponentGrammarTest.java | 46 + .../cocos/AttributeNameLowerCaseTest.java | 32 + .../de/monticore/grammar/cocos/CocoTest.java | 88 + .../cocos/ConservativeExtensionCheckTest.java | 64 + .../cocos/DerivedAndManualListNameTest.java | 45 + .../cocos/DuplicatedEnumConstantTest.java | 32 + .../DuplicatedSymbolDefinitionInProdTest.java | 30 + .../cocos/ExternalNTNoASTRuleTest.java | 28 + .../ExternalNTOnlyInComponentGrammarTest.java | 39 + .../cocos/GrammarExtensionOnceTest.java | 33 + .../cocos/GrammarInheritanceCycleTest.java | 55 + .../cocos/GrammarNameEqualsFileNameTest.java | 47 + .../cocos/GrammarNameUpperCaseTest.java | 31 + .../cocos/InheritedModiOverwriteTest.java | 24 + .../cocos/InheritedScopePropertyTest.java | 49 + .../cocos/InheritedSymbolPropertyTest.java | 40 + ...InterfaceNTOnlyExtendInterfaceNTsTest.java | 49 + ...lementationOnlyInComponentGrammarTest.java | 107 + .../grammar/cocos/KeyConstantInvalidTest.java | 30 + .../grammar/cocos/KeyRuleWithoutNameTest.java | 33 + .../cocos/KeywordAlternativeNameTest.java | 48 + .../grammar/cocos/KeywordInvalidNameTest.java | 32 + .../grammar/cocos/KeywordRuleInvalidTest.java | 29 + .../cocos/LeftRecursiveRulesInBlockTest.java | 35 + .../grammar/cocos/LexNTsNotEmptyTest.java | 42 + .../cocos/LexNTsOnlyUseLexNTsTest.java | 33 + .../cocos/LexProdModeNameUpperCaseTest.java | 27 + .../grammar/cocos/MultipleASTRulesTest.java | 31 + .../cocos/NTAndASTRuleExtendTypeTest.java | 32 + .../NTDefinedByAtmostOneProductionTest.java | 34 + .../grammar/cocos/NTForASTRuleExistsTest.java | 31 + ...NTNotExtendInterfaceOrExternalNTsTest.java | 37 + .../cocos/NTOnlyExtendsOneNTOrClassTest.java | 41 + ...TOnlyExtendsOrAstextendsNTOrClassTest.java | 30 + .../NTOnlyImplementInterfaceNTsTest.java | 46 + .../grammar/cocos/NTUniqueIgnoreCaseTest.java | 37 + .../cocos/NoASTExtendsForClassesTest.java | 36 + .../cocos/NoASTRuleForEnumNTsTest.java | 31 + ...tensionOfSymbolThatOnlySpansScopeTest.java | 46 + .../cocos/NoForbiddenGrammarNameTest.java | 29 + .../NoForbiddenProdAndSymbolNameTest.java | 30 + .../cocos/NoForbiddenProdNameAddonTest.java | 29 + .../cocos/NoForbiddenProdNameTest.java | 72 + .../cocos/NoForbiddenSymbolNameAddonTest.java | 37 + .../cocos/NoForbiddenSymbolNameTest.java | 29 + .../cocos/NoMultipleSymbolRuleTest.java | 24 + .../cocos/NoNTInheritanceCycleTest.java | 56 + ...tedGenericsInAdditionalAttributesTest.java | 87 + .../NoOverridingNTHasAnnotationTest.java | 29 + ...ReplaceKeywordRuleOnConstantGroupTest.java | 28 + ...eKeywordRuleOnUsageNamedAttributeTest.java | 28 + .../grammar/cocos/NoTokenDefinedTest.java | 28 + .../NoTokenModeInComponentGrammarTest.java | 28 + ...ridingAbstractNTsHaveNoSuperRulesTest.java | 32 + .../cocos/OverridingAbstractNTsTest.java | 50 + .../OverridingAdditionalAttriutesTest.java | 46 + .../grammar/cocos/OverridingEnumNTsTest.java | 30 + .../cocos/OverridingInterfaceNTsTest.java | 31 + .../grammar/cocos/OverridingLexNTsTest.java | 32 + .../OverridingNTHasNoAnnotationTest.java | 29 + .../OverridingNTsHaveNoSuperRulesTest.java | 32 + .../grammar/cocos/OverridingNTsTest.java | 60 + .../cocos/PackageNameLowerCaseTest.java | 32 + ...ndedProdUseSameAttrNameForDiffNTsTest.java | 122 + ...ddenProdUseSameAttrNameForDiffNTsTest.java | 125 + .../cocos/ProdExtendsNotExistingProdTest.java | 35 + .../cocos/ProdStartsWithCapitalTest.java | 49 + .../cocos/ProdWithDoubleAnnosTest.java | 33 + ...dWithExtensionMustNotBeOverriddenTest.java | 41 + .../cocos/ReferenceSymbolNotNameTest.java | 29 + .../ReferenceSymbolSameAttributeTest.java | 28 + .../cocos/ReferencedNTNotDefinedTest.java | 61 + .../cocos/ReferencedSymbolExistsTest.java | 28 + .../cocos/RuleComponentsCompatibleTest.java | 88 + .../ScopeProdOverwrittenByScopeTest.java | 27 + .../grammar/cocos/SplitRuleInvalidTest.java | 35 + .../cocos/SubrulesUseInterfaceNTsTest.java | 72 + .../SymbolProdOverwrittenBySymbolTest.java | 27 + .../grammar/cocos/SymbolRuleHasNameTest.java | 28 + .../cocos/SymbolRuleWithoutSymbolRefTest.java | 36 + .../cocos/SymbolWithManyNamesTest.java | 33 + .../grammar/cocos/TerminalCriticalTest.java | 28 + .../cocos/TerminalEmptyStringTest.java | 38 + .../cocos/TokenConstantInvalidTest.java | 34 + .../cocos/UniqueProdNameInGrammarTest.java | 44 + .../cocos/UnnamedTerminalInInterfaceTest.java | 35 + .../cocos/UsedLexNTNotDefinedTest.java | 33 + .../grammar/cocos/UsedNTNotDefinedTest.java | 42 + .../symboltable/IGrammarScopeTest.java | 179 + ...ontiCoreGrammarSymbolTableCreatorTest.java | 478 ++ ...ctorFormalParametersDifferentNameTest.java | 39 + .../cocos/ConstructorModifiersValidTest.java | 35 + .../ConstructorNoAccessModifierPairTest.java | 33 + .../ConstructorNoDuplicateModifierTest.java | 32 + .../javalight/cocos/JavaLightCocoTest.java | 116 + ...ightPhasedSymbolTableCreatorDelegator.java | 36 + .../JavaLightSTCompleteTypesDelegator.java | 30 + .../MethodAbstractAndOtherModifiersTest.java | 36 + .../cocos/MethodBodyAbsenceTest.java | 37 + .../cocos/MethodBodyPresenceTest.java | 37 + .../cocos/MethodExceptionThrowsTest.java | 44 + ...thodFormalParametersDifferentNameTest.java | 39 + .../cocos/MethodNoNativeAndStrictfpTest.java | 32 + .../ReturnTypeAssignmentIsValidTest.java | 95 + .../DoubleCommonLiteralsTest.java | 75 + .../FloatCommonLiteralsTest.java | 110 + .../IntCommonLiteralsTest.java | 139 + .../LongCommonLiteralsTest.java | 81 + .../mccommonliterals/RangeCoCosTest.java | 206 + .../DoubleJavaLiteralsTest.java | 90 + .../mcjavaliterals/FloatJavaLiteralsTest.java | 90 + .../mcjavaliterals/IntJavaLiteralsTest.java | 65 + .../mcjavaliterals/LongJavaLiteralsTest.java | 66 + .../MCJavaLiteralsTestHelper.java | 56 + .../mcjavaliterals/RangeCoCosTest.java | 194 + .../mcliterals/CharLiteralsTest.java | 63 + .../mcliterals/MCLiteralsTestHelper.java | 72 + .../mcliterals/MCLiteralsUnitTest.java | 279 + .../monticore/mcliterals/NatLiteralsTest.java | 68 + .../NullAndBooleanLiteralsTest.java | 61 + .../mcliterals/SignedNatLiteralsTest.java | 77 + .../mcliterals/StringLiteralsTest.java | 65 + .../CardinalityPrettyPrinterTest.java | 90 + .../CompletenessPrettyPrinterTest.java | 110 + .../prettyprint/GrammarPrettyPrinterTest.java | 82 + .../JavaLightPrettyPrinterTest.java | 306 + .../MCCommonLiteralsPrettyPrinterTest.java | 252 + .../MCHexNumbersPrettyPrinterTest.java | 93 + .../MCJavaLiteralsPrettyPrinterTest.java | 111 + .../MCNumbersPrettyPrinterTest.java | 111 + .../StringLiteralsPrettyPrinterTest.java | 96 + .../UMLModifierPrettyPrinterTest.java | 73 + .../UMLStereotypePrettyPrinterTest.java | 77 + .../statements/cocos/AssertIsValidTest.java | 79 + .../statements/cocos/CatchIsValidTest.java | 90 + .../DoWhileConditionHasBooleanTypeTest.java | 78 + .../cocos/ExpressionStatementIsValidTest.java | 97 + .../cocos/ForConditionHasBooleanTypeTest.java | 76 + .../statements/cocos/ForEachIsValidTest.java | 115 + .../cocos/IfConditionHasBooleanTypeTest.java | 78 + .../ResourceInTryStatementCloseableTest.java | 100 + .../cocos/SwitchStatementValidTest.java | 77 + .../cocos/SynchronizedArgIsReftypeTest.java | 85 + .../statements/cocos/ThrowIsValidTest.java | 87 + ...ationInitializationHasCorrectTypeTest.java | 126 + .../WhileConditionHasBooleanTypeTest.java | 72 + .../MCArrayStatementsPrettyPrinterTest.java | 74 + .../MCAssertStatementsPrettyPrinterTest.java | 53 + .../MCCommonStatementsPrettyPrinterTest.java | 418 + ...CExceptionStatementsPrettyPrinterTest.java | 168 + ...MCLowLevelStatementsPrettyPrinterTest.java | 91 + .../MCReturnStatementsPrettyPrinterTest.java | 53 + ...nchronizedStatementsPrettyPrinterTest.java | 54 + ...eclarationStatementsPrettyPrinterTest.java | 55 + .../BasicSymbolsSymbols2JsonTest.java | 173 + .../symbols/library/StreamTypeTest.java | 107 + .../oosymbols/_symboltable/ModifierTest.java | 166 + .../OOSymbolsSymbols2JsonTest.java | 164 + .../de/monticore/testsymtabmill/MillTest.java | 45 + .../TestSymTabMillArtifactScope.java | 23 + .../TestSymTabMillGlobalScope.java | 24 + .../_symboltable/TestSymTabMillScope.java | 14 + .../TestSymTabMillScopesGenitor.java | 9 + .../TestSymTabMillScopesGenitorDelegator.java | 10 + .../typepersistence/TypePersistenceTest.java | 58 + .../monticore/types/AlwaysTheSameASTTest.java | 532 ++ .../de/monticore/types/MCBasicTypesTest.java | 125 + .../types/MCCollectionTypesTest.java | 270 + .../types/MCFullGenericTypesTest.java | 43 + .../monticore/types/MCFunctionTypesTest.java | 123 + .../monticore/types/MCGenericsTypesTest.java | 198 + .../types/MCSimpleGenericsTypesTest.java | 207 + .../de/monticore/types/MCTypeFacadeTest.java | 525 ++ .../MCollectionTypesCorrectStateTest.java | 212 + .../java/de/monticore/types/TestGenerics.java | 12 + .../de/monticore/types/TestGenericsTest.java | 11 + .../types/check/AbstractDeriveTest.java | 180 + .../types/check/DefiningSymbolsTest.java | 184 + .../monticore/types/check/DefsTypeBasic.java | 511 ++ .../check/DeriveSymTypeAbstractTest.java | 212 + ...riveSymTypeOfAssignmentExpressionTest.java | 483 ++ .../DeriveSymTypeOfBitExpressionsTest.java | 202 + .../DeriveSymTypeOfCombineExpressions.java | 86 + .../DeriveSymTypeOfCommonExpressionTest.java | 1735 +++++ .../check/DeriveSymTypeOfExpressionTest.java | 160 + ...riveSymTypeOfJavaClassExpressionsTest.java | 1212 +++ .../DeriveSymTypeOfLambdaExpressionsTest.java | 130 + .../check/DeriveSymTypeOfLiteralsTest.java | 54 + .../DeriveSymTypeOfMCCommonLiteralsTest.java | 122 + .../check/FlatExpressionScopeSetter.java | 433 ++ ...iveFromCombineExpressionsWithLiterals.java | 90 + ...ombineExpressionsWithLiteralsAbstract.java | 53 + ...izeFromCombineExpressionsWithLiterals.java | 35 + .../check/SymTypeExpressionDeSerTest.java | 483 ++ .../types/check/SymTypeExpressionTest.java | 1068 +++ ...SynthesizeSymTypeFromMCArrayTypesTest.java | 162 + ...SynthesizeSymTypeFromMCBasicTypesTest.java | 140 + ...esizeSymTypeFromMCCollectionTypesTest.java | 241 + ...sizeSymTypeFromMCFullGenericTypesTest.java | 250 + ...zeSymTypeFromMCSimpleGenericTypesTest.java | 236 + ...hesizeSymTypeFromMCcFunctionTypesTest.java | 113 + .../types/check/TypeCalculatorTest.java | 372 + ...ingSymbolSetter4CommonExpressionsTest.java | 108 + .../SubExprNameExtractionResultTest.java | 450 ++ ...prNameExtractor4CommonExpressionsTest.java | 108 + .../MCArrayTypesNodeIdentHelperTest.java | 47 + .../types/helper/MCBasicTypesHelperTest.java | 41 + .../MCBasicTypesNodeIdentHelperTest.java | 58 + .../MCCollectionTypesNodeIdentHelperTest.java | 58 + ...MCFullGenericTypesNodeIdentHelperTest.java | 44 + ...SimpleGenericTypesNodeIdentHelperTest.java | 56 + .../helper/MCType2SymTypeExpressionTest.java | 427 ++ .../util/MCCollectionSymTypeFactoryTest.java | 140 + .../util/MCCollectionTypeRelationsTest.java | 207 + .../MCArrayTypesPrettyPrinterTest.java | 52 + .../MCBasicTypesPrettyPrinterTest.java | 210 + .../MCCollectionTypesPrettyPrinterTest.java | 131 + .../MCFullGenericTypesPrettyPrinterTest.java | 83 + .../MCFunctionTypesPrettyPrinterTest.java | 91 + ...MCSimpleGenericTypesPrettyPrinterTest.java | 106 + .../PrintTypeAstExtensionTests.java | 289 + .../types/printer/BasicTypesPrinterTest.java | 56 + .../printer/CollectionTypesPrinterTest.java | 56 + .../printer/FullGenericTypesPrinterTest.java | 57 + .../SimpleGenericTypesPrinterTest.java | 44 + .../de/monticore/types3/AbstractTypeTest.java | 29 + .../types3/AbstractTypeVisitorTest.java | 314 + .../AssignmentExpressionTypeVisitorTest.java | 894 +++ .../types3/BitExpressionsTypeVisitorTest.java | 123 + .../CommonExpressionTypeVisitorTest.java | 2760 +++++++ .../types3/CommonLiteralsTypeVisitorTest.java | 144 + .../ExpressionBasisTypeVisitorTest.java | 61 + .../LambdaExpressionsTypeVisitorTest.java | 45 + .../types3/MCArrayTypesTypeVisitorTest.java | 26 + .../types3/MCBasicTypesTypeVisitorTest.java | 93 + .../MCCollectionTypesTypeVisitorTest.java | 186 + .../MCFullGenericTypesTypeVisitorTest.java | 16 + .../MCFunctionTypesTypeVisitorTest.java | 45 + .../MCSimpleGenericTypesTypeVisitorTest.java | 89 + .../types3/ResolveWithinOOTypeTest.java | 199 + .../types3/ResolveWithinTypeTest.java | 335 + .../types3/SymTypeBoxingVisitorTest.java | 111 + .../types3/SymTypeCompatibilityTest.java | 678 ++ .../types3/SymTypeLeastUpperBoundTest.java | 67 + .../types3/SymTypeNormalizeVisitorTest.java | 190 + .../types3/SymTypeUnboxingVisitorTest.java | 110 + ...sionsWithLiteralsTypeTraverserFactory.java | 171 + ...ionsWithLiteralsTypeTraverserProvider.java | 142 + ...ineExpressionsWithLiteralsTypeVisitor.java | 33 + .../types3/util/DefsTypesForTests.java | 755 ++ .../types3/util/DefsVariablesForTests.java | 222 + .../umlmodifier/ModifierBuilderTest.java | 35 + .../umlmodifier/ModifierPrettyPrintTest.java | 47 + .../MCHexNumbersFullPrettyPrinter.java | 39 + .../MCHexNumbersPrettyPrinter.java | 55 + .../MCNumbersFullPrettyPrinter.java | 50 + .../prettyprint/MCNumbersPrettyPrinter.java | 56 + .../StringLiteralsFullPrettyPrinter.java | 49 + .../StringLiteralsPrettyPrinter.java | 53 + .../StringLiteralsPrettyPrinter.java | 25 + .../src/test/resources/Automaton.mc4 | 41 + .../resources/de/monticore/Annotations.mc4 | 19 + .../de/monticore/CombiningGrammar.mc4 | 6 + .../resources/de/monticore/KeyAndNext.mc4 | 28 + .../test/resources/de/monticore/Keywords.mc4 | 15 + .../de/monticore/LexicalsWithMode.mc4 | 16 + .../src/test/resources/de/monticore/Modes.mc4 | 17 + .../de/monticore/NonTerminalsWithSameName.mc4 | 11 + .../de/monticore/RuleWithSymbolReference.mc4 | 20 + .../resources/de/monticore/Statechart.mc4 | 38 + .../resources/de/monticore/SubStatechart.mc4 | 10 + .../resources/de/monticore/TestGrammar.mc4 | 552 ++ .../resources/de/monticore/TypeReferences.mc4 | 17 + .../resources/de/monticore/WrongPackage.mc4 | 11 + .../monticore/aggregation/models/FooModel.mc4 | 0 .../aggregation/models/blahmodel.mc4 | 0 .../de/monticore/common/TestLexicals.mc4 | 57 + .../de/monticore/common/TestLiterals.mc4 | 416 + .../de/monticore/common/TestTypes.mc4 | 253 + .../de/monticore/grammar/SamePackage.mc4 | 7 + .../grammar/TestFullyQualifiedGrammar.mc4 | 7 + .../TestFullyQualifiedGrammarSamePackage.mc4 | 7 + .../grammar/TestQualifiedImportGrammar.mc4 | 10 + .../grammar/TestStarImportGrammar.mc4 | 10 + .../grammar/cocos/invalid/A0112/A0112.mc4 | 13 + .../grammar/cocos/invalid/A0112/A0112a.mc4 | 13 + .../grammar/cocos/invalid/A0112/A0112b.mc4 | 13 + .../grammar/cocos/invalid/A0112/A0112c.mc4 | 13 + .../grammar/cocos/invalid/A0113/A0113.mc4 | 8 + .../grammar/cocos/invalid/A0113/A0113a.mc4 | 8 + .../grammar/cocos/invalid/A0117/A0117.mc4 | 12 + .../grammar/cocos/invalid/A0117/A0117a.mc4 | 12 + .../grammar/cocos/invalid/A0118/A0118.mc4 | 10 + .../grammar/cocos/invalid/A0120/A0120.mc4 | 13 + .../grammar/cocos/invalid/A0120/A0120b.mc4 | 13 + .../grammar/cocos/invalid/A0125/A0125.mc4 | 13 + .../grammar/cocos/invalid/A0125/A0125a.mc4 | 15 + .../grammar/cocos/invalid/A0135/A0135.mc4 | 13 + .../grammar/cocos/invalid/A0135/A0135a.mc4 | 15 + .../grammar/cocos/invalid/A0135/A0135b.mc4 | 11 + .../grammar/cocos/invalid/A0142/A0142.mc4 | 9 + .../grammar/cocos/invalid/A0142/A0142a.mc4 | 11 + .../grammar/cocos/invalid/A0274/A0274Sub.mc4 | 9 + .../cocos/invalid/A0274/A0274Super.mc4 | 9 + .../grammar/cocos/invalid/A0275/A0275Sub.mc4 | 9 + .../cocos/invalid/A0275/A0275Super.mc4 | 9 + .../grammar/cocos/invalid/A0276/A0276.mc4 | 11 + .../grammar/cocos/invalid/A0276/A0276a.mc4 | 9 + .../grammar/cocos/invalid/A0276/A0276b.mc4 | 9 + .../grammar/cocos/invalid/A0277/A0277.mc4 | 11 + .../grammar/cocos/invalid/A0277/A0277a.mc4 | 9 + .../grammar/cocos/invalid/A0277/A0277b.mc4 | 8 + .../grammar/cocos/invalid/A0277/A0277c.mc4 | 10 + .../grammar/cocos/invalid/A0278/A0278.mc4 | 11 + .../grammar/cocos/invalid/A0278/A0278a.mc4 | 9 + .../grammar/cocos/invalid/A0278/A0278b.mc4 | 8 + .../grammar/cocos/invalid/A0278/A0278c.mc4 | 10 + .../grammar/cocos/invalid/A0278/A0278d.mc4 | 11 + .../grammar/cocos/invalid/A0278/A0278e.mc4 | 12 + .../grammar/cocos/invalid/A0279/A0279.mc4 | 11 + .../grammar/cocos/invalid/A0279/A0279a.mc4 | 11 + .../grammar/cocos/invalid/A0810/A0810a.mc4 | 10 + .../grammar/cocos/invalid/A0810/A0810b.mc4 | 10 + .../grammar/cocos/invalid/A0810/A0810c.mc4 | 12 + .../grammar/cocos/invalid/A2007/A2007Sup1.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup2.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup3.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup4.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup5.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup6.mc4 | 9 + .../grammar/cocos/invalid/A2007/A2007Sup7.mc4 | 9 + .../cocos/invalid/A2007/A2007Super.mc4 | 17 + .../grammar/cocos/invalid/A2008/A2008a.mc4 | 10 + .../grammar/cocos/invalid/A2008/A2008b.mc4 | 10 + .../grammar/cocos/invalid/A2008/A2008c.mc4 | 9 + .../grammar/cocos/invalid/A2025/A2025.mc4 | 33 + .../grammar/cocos/invalid/A2026/A2026.mc4 | 11 + .../grammar/cocos/invalid/A2030/A2030a.mc4 | 9 + .../grammar/cocos/invalid/A2030/A2030b.mc4 | 9 + .../grammar/cocos/invalid/A2030/A2030c.mc4 | 9 + .../grammar/cocos/invalid/A2030/A2030d.mc4 | 9 + .../grammar/cocos/invalid/A2030/A2030e.mc4 | 9 + .../grammar/cocos/invalid/A2031/A2031.mc4 | 9 + .../grammar/cocos/invalid/A2102/A2102a.mc4 | 11 + .../grammar/cocos/invalid/A2102/A2102b.mc4 | 11 + .../grammar/cocos/invalid/A2102/A2102c.mc4 | 11 + .../grammar/cocos/invalid/A2102/A2102d.mc4 | 11 + .../grammar/cocos/invalid/A2103/A2103a.mc4 | 10 + .../grammar/cocos/invalid/A2103/A2103b.mc4 | 10 + .../grammar/cocos/invalid/A2106/A2106a.mc4 | 11 + .../grammar/cocos/invalid/A2106/A2106b.mc4 | 11 + .../grammar/cocos/invalid/A2106/A2106c.mc4 | 11 + .../grammar/cocos/invalid/A2106/A2106d.mc4 | 11 + .../grammar/cocos/invalid/A2107/A2107a.mc4 | 10 + .../grammar/cocos/invalid/A2107/A2107b.mc4 | 10 + .../grammar/cocos/invalid/A2116/A2116a.mc4 | 10 + .../grammar/cocos/invalid/A2116/A2116b.mc4 | 10 + .../grammar/cocos/invalid/A2116/A2116c.mc4 | 10 + .../grammar/cocos/invalid/A2116/A2116d.mc4 | 12 + .../grammar/cocos/invalid/A4001/A4001.mc4 | 9 + .../grammar/cocos/invalid/A4002/A4002.mc4 | 9 + .../grammar/cocos/invalid/A4003/A4003.mc4 | 9 + .../grammar/cocos/invalid/A4004/A4004.mc4 | 9 + .../grammar/cocos/invalid/A4005/A4005.mc4 | 10 + .../grammar/cocos/invalid/A4006/A4006.mc4 | 8 + .../grammar/cocos/invalid/A4007/A4007.mc4 | 9 + .../grammar/cocos/invalid/A4007/A4007a.mc4 | 9 + .../grammar/cocos/invalid/A4008/A4008.mc4 | 9 + .../grammar/cocos/invalid/A4008/A4008a.mc4 | 9 + .../grammar/cocos/invalid/A4008/A4008b.mc4 | 9 + .../grammar/cocos/invalid/A4008/A4008c.mc4 | 9 + .../grammar/cocos/invalid/A4008/A4008d.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009a.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009b.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009c.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009d.mc4 | 9 + .../grammar/cocos/invalid/A4009/A4009e.mc4 | 9 + .../grammar/cocos/invalid/A4010/A4010.mc4 | 8 + .../grammar/cocos/invalid/A4011/A4011a.mc4 | 12 + .../grammar/cocos/invalid/A4011/A4011b.mc4 | 9 + .../grammar/cocos/invalid/A4012/A4012a.mc4 | 12 + .../grammar/cocos/invalid/A4012/A4012b.mc4 | 9 + .../grammar/cocos/invalid/A4013/A4013.mc4 | 14 + .../grammar/cocos/invalid/A4014/A4014.mc4 | 8 + .../grammar/cocos/invalid/A4015/A4015.mc4 | 9 + .../grammar/cocos/invalid/A4016/A4016.mc4 | 9 + .../grammar/cocos/invalid/A4017/A4017.mc4 | 10 + .../grammar/cocos/invalid/A4018/A4018.mc4 | 9 + .../grammar/cocos/invalid/A4019/A4019.mc4 | 8 + .../grammar/cocos/invalid/A4020/A4020.mc4 | 14 + .../grammar/cocos/invalid/A4021/A4021.mc4 | 11 + .../grammar/cocos/invalid/A4022/A4022.mc4 | 9 + .../grammar/cocos/invalid/A4022/A4022b.mc4 | 11 + .../grammar/cocos/invalid/A4023/A4023.mc4 | 9 + .../grammar/cocos/invalid/A4023/A4023b.mc4 | 9 + .../grammar/cocos/invalid/A4023/A4023c.mc4 | 9 + .../grammar/cocos/invalid/A4024/A4024.mc4 | 14 + .../grammar/cocos/invalid/A4024/A4024_b.mc4 | 14 + .../grammar/cocos/invalid/A4024/A4024_c.mc4 | 12 + .../grammar/cocos/invalid/A4024/A4024_d.mc4 | 12 + .../grammar/cocos/invalid/A4024/A4024_e.mc4 | 12 + .../grammar/cocos/invalid/A4024/A4024_f.mc4 | 12 + .../grammar/cocos/invalid/A4024/A4024_g.mc4 | 14 + .../grammar/cocos/invalid/A4024/A4024_h.mc4 | 15 + .../grammar/cocos/invalid/A4024/A4024_i.mc4 | 15 + .../grammar/cocos/invalid/A4025/A4025.mc4 | 9 + .../cocos/invalid/A4025/A4025_sub_b.mc4 | 11 + .../cocos/invalid/A4025/A4025_sub_c.mc4 | 11 + .../cocos/invalid/A4025/A4025_sub_d.mc4 | 11 + .../cocos/invalid/A4025/A4025_sub_e.mc4 | 11 + .../cocos/invalid/A4025/A4025_sub_f.mc4 | 11 + .../cocos/invalid/A4025/A4025_sub_g.mc4 | 11 + .../cocos/invalid/A4025/A4025_super_b.mc4 | 11 + .../cocos/invalid/A4025/A4025_super_c.mc4 | 9 + .../cocos/invalid/A4025/A4025_super_d.mc4 | 9 + .../cocos/invalid/A4025/A4025_super_e.mc4 | 9 + .../cocos/invalid/A4025/A4025_super_f.mc4 | 11 + .../cocos/invalid/A4025/A4025_super_g.mc4 | 9 + .../grammar/cocos/invalid/A4026/A4026.mc4 | 14 + .../grammar/cocos/invalid/A4026/A4026b.mc4 | 14 + .../grammar/cocos/invalid/A4027/A4027.mc4 | 8 + .../grammar/cocos/invalid/A4028/A4028.mc4 | 16 + .../grammar/cocos/invalid/A4029/A4029.mc4 | 10 + .../grammar/cocos/invalid/A4030/A4030.mc4 | 10 + .../grammar/cocos/invalid/A4031/A4031a.mc4 | 8 + .../grammar/cocos/invalid/A4031/A4031b.mc4 | 8 + .../grammar/cocos/invalid/A4031/A4031c.mc4 | 8 + .../grammar/cocos/invalid/A4031/A4031d.mc4 | 8 + .../grammar/cocos/invalid/A4031/A4031e.mc4 | 8 + .../grammar/cocos/invalid/A4032/A4032.mc4 | 11 + .../grammar/cocos/invalid/A4033/a4033.mc4 | 8 + .../grammar/cocos/invalid/A4035/A4035.mc4 | 12 + .../grammar/cocos/invalid/A4035/A4035a.mc4 | 12 + .../grammar/cocos/invalid/A4035/A4035b.mc4 | 16 + .../grammar/cocos/invalid/A4036/I.mc4 | 7 + .../grammar/cocos/invalid/A4037/A4037.mc4 | 12 + .../grammar/cocos/invalid/A4038/A4038.mc4 | 12 + .../grammar/cocos/invalid/A4039/A4039.mc4 | 13 + .../grammar/cocos/invalid/A4041/A4041.mc4 | 9 + .../grammar/cocos/invalid/A4047/A4047a.mc4 | 14 + .../grammar/cocos/invalid/A4047/A4047b.mc4 | 12 + .../grammar/cocos/invalid/A4047/A4047c.mc4 | 18 + .../grammar/cocos/invalid/A4047/A4047d.mc4 | 10 + .../grammar/cocos/invalid/A4047/A4047e.mc4 | 13 + .../grammar/cocos/invalid/A4047/A4047f.mc4 | 13 + .../grammar/cocos/invalid/A4047/A4047g.mc4 | 12 + .../grammar/cocos/invalid/A4047/A4047h.mc4 | 8 + .../grammar/cocos/invalid/A4047/A4047i.mc4 | 10 + .../grammar/cocos/invalid/A4054/A4054.mc4 | 9 + .../grammar/cocos/invalid/A4056/A4056.mc4 | 9 + .../grammar/cocos/invalid/A4056/A4056a.mc4 | 13 + .../grammar/cocos/invalid/A4058/A4058.mc4 | 9 + .../grammar/cocos/invalid/A4059/A4059a.mc4 | 9 + .../grammar/cocos/invalid/A4059/A4059b.mc4 | 9 + .../grammar/cocos/invalid/A4062/A4062a.mc4 | 11 + .../grammar/cocos/invalid/A4062/A4062b.mc4 | 11 + .../grammar/cocos/invalid/A4063/A4063.mc4 | 9 + .../grammar/cocos/invalid/A4064/A4064.mc4 | 10 + .../grammar/cocos/invalid/A4068/A4068.mc4 | 12 + .../grammar/cocos/invalid/A4069/A4069Sub.mc4 | 7 + .../cocos/invalid/A4069/A4069Super.mc4 | 11 + .../grammar/cocos/invalid/A4090/A4090a.mc4 | 10 + .../grammar/cocos/invalid/A4090/A4090b.mc4 | 9 + .../grammar/cocos/invalid/A4090/A4090c.mc4 | 10 + .../grammar/cocos/invalid/A4090/A4090d.mc4 | 10 + .../grammar/cocos/invalid/A4090/A4090e.mc4 | 9 + .../grammar/cocos/invalid/A4090/A4090f.mc4 | 10 + .../grammar/cocos/invalid/A4090/A4090g.mc4 | 10 + .../grammar/cocos/invalid/A4090/A4090h.mc4 | 12 + .../grammar/cocos/invalid/A4090/A4090i.mc4 | 11 + .../grammar/cocos/invalid/A4090/A4090j.mc4 | 11 + .../grammar/cocos/invalid/A4090/A4090k.mc4 | 10 + .../grammar/cocos/invalid/A4094/A4094.mc4 | 10 + .../cocos/invalid/A4094/A4094Super.mc4 | 9 + .../grammar/cocos/invalid/A4096/A4096a.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096b.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096c.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096d.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096e.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096f.mc4 | 8 + .../grammar/cocos/invalid/A4096/A4096g.mc4 | 8 + .../grammar/cocos/invalid/A4097/A4097a.mc4 | 7 + .../grammar/cocos/invalid/A4097/A4097b.mc4 | 8 + .../grammar/cocos/invalid/A4098/A4098.mc4 | 9 + .../cocos/invalid/A4098/A4098Super.mc4 | 9 + .../cocos/invalid/A4099/A4099Symbol.mc4 | 8 + .../grammar/cocos/invalid/A4100/A4100.mc4 | 13 + .../grammar/cocos/invalid/A4101/A4101.mc4 | 15 + .../grammar/cocos/invalid/A4102/A4102a.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102b.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102c.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102d.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102e.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102f.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102g.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102h.mc4 | 12 + .../grammar/cocos/invalid/A4102/A4102i.mc4 | 12 + .../grammar/cocos/invalid/A4118/A4118.mc4 | 10 + .../grammar/cocos/invalid/A4119/A4119.mc4 | 11 + .../grammar/cocos/invalid/A4119/A4119a.mc4 | 11 + .../grammar/cocos/invalid/A4120/A4120.mc4 | 10 + .../grammar/cocos/invalid/A4121/A4121a.mc4 | 10 + .../grammar/cocos/invalid/A4121/A4121b.mc4 | 10 + .../grammar/cocos/invalid/A4122/A4122.mc4 | 10 + .../grammar/cocos/invalid/A4150/A4150.mc4 | 9 + .../grammar/cocos/invalid/A4151/A4151.mc4 | 11 + .../grammar/cocos/invalid/A4161/A4161.mc4 | 14 + .../grammar/cocos/invalid/A4162/A4162.mc4 | 14 + .../grammar/cocos/valid/ASTRules.mc4 | 39 + .../grammar/cocos/valid/Attributes.mc4 | 64 + .../grammar/cocos/valid/Component.mc4 | 13 + .../cocos/valid/ConservativeExtensionSup.mc4 | 23 + .../valid/ConservativeExtensionSuper.mc4 | 14 + .../cocos/valid/CorrectSymbolInheritance.mc4 | 21 + .../de/monticore/grammar/cocos/valid/Enum.mc4 | 9 + .../grammar/cocos/valid/ExtendNTs.mc4 | 33 + .../cocos/valid/ImplementInterfaceNTs.mc4 | 38 + .../valid/InterfaceWithoutImplementation.mc4 | 12 + .../valid/InterfaceWithoutImplementation2.mc4 | 12 + .../valid/InterfaceWithoutImplementation3.mc4 | 12 + .../grammar/cocos/valid/Overriding.mc4 | 21 + .../grammar/cocos/valid/Overriding2.mc4 | 17 + ...dExtendedProdUseSameAttrNameForDiffNTs.mc4 | 36 + ...iddenProdUseSameAttrNameForDiffNTs_sub.mc4 | 22 + ...denProdUseSameAttrNameForDiffNTs_super.mc4 | 22 + .../valid/ProdExtendsNotExistingProd.mc4 | 14 + .../grammar/cocos/valid/ReferencedSymbol.mc4 | 16 + .../grammar/cocos/valid/ReplaceKeyword.mc4 | 13 + .../grammar/cocos/valid/ScopeRule.mc4 | 15 + .../cocos/valid/SubGrammarWithSymbol.mc4 | 12 + .../cocos/valid/SymbolAndScopeOverwriting.mc4 | 12 + .../grammar/cocos/valid/SymbolRules.mc4 | 40 + .../grammar/cocos/valid/enum/Enum.mc4 | 9 + .../grammar/pack/DifferentPackage.mc4 | 7 + .../de/monticore/inherited/Subgrammar.mc4 | 24 + .../de/monticore/inherited/Subsubgrammar.mc4 | 16 + .../de/monticore/inherited/Supergrammar.mc4 | 18 + .../javalight/cocos/invalid/A0802/A0802.java | 2 + .../javalight/cocos/invalid/A0803/A0803.java | 2 + .../javalight/cocos/invalid/A0803/A0803a.java | 2 + .../javalight/cocos/invalid/A0804/A0804.java | 2 + .../javalight/cocos/invalid/A0804/A0804a.java | 2 + .../javalight/cocos/invalid/A0808/A0808.java | 2 + .../javalight/cocos/invalid/A0809/A0809.java | 2 + .../javalight/cocos/invalid/A0811/A0811.java | 2 + .../javalight/cocos/invalid/A0812/A0812.java | 2 + .../javalight/cocos/invalid/A0812/A0812a.java | 2 + .../javalight/cocos/invalid/A0819/A0819.java | 2 + .../javalight/cocos/invalid/A0820/A0820.java | 2 + .../javalight/cocos/invalid/A0821/A0821.java | 2 + .../javalight/cocos/invalid/A0821/A0821a.java | 2 + .../javalight/cocos/valid/A0802.java | 2 + .../javalight/cocos/valid/A0803.java | 2 + .../javalight/cocos/valid/A0804.java | 2 + .../javalight/cocos/valid/A0808.java | 2 + .../javalight/cocos/valid/A0809.java | 2 + .../javalight/cocos/valid/A0819.java | 2 + .../javalight/cocos/valid/A0820.java | 2 + .../javalight/cocos/valid/A0821.java | 2 + .../javalight/cocos/valid/MethodDecl.java | 2 + .../point.in.packagename/PackagePathTest.mc4 | 9 + .../de/monticore/script/AutomatonV1.mc4 | 7 + .../de/monticore/script/AutomatonV2.mc4 | 7 + .../de/monticore/script/AutomatonV3.mc4 | 11 + .../de/monticore/script/AutomatonWithInvs.mc4 | 6 + .../script/AutomatonWithInvsAndStartRule.mc4 | 9 + .../script/AutomatonWithInvsComp.mc4 | 9 + .../script/HierarchicalAutomaton.mc4 | 8 + .../de/monticore/script/ScriptExample.mc4 | 161 + .../de/monticore/types/check/Iterator.cesym | 20 + .../de/monticore/types/check/Pair.cesym | 20 + .../de/monticore/types/check/Pair2.cesym | 20 + .../de/monticore/types/check/PairA.cesym | 20 + .../de/monticore/types/check/PairB.cesym | 20 + .../de/monticore/types/check/PairC.cesym | 20 + .../de/monticore/types/check/PersonKey.cesym | 20 + .../monticore/types/check/PersonValue.cesym | 20 + .../de/monticore/types/check/Personaz.cesym | 20 + .../de/monticore/types/check/Persondemc.cesym | 20 + .../de/monticore/types/check/Persondex.cesym | 20 + .../de/monticore/types/check/Personjl.cesym | 20 + .../de/monticore/types/check/Personju.cesym | 20 + .../de/monticore/types/check/String.cesym | 20 + .../src/test/resources/logback.groovy | 26 + monticore-runtime/build.gradle | 44 + .../java/de/monticore/AmbiguityException.java | 34 + .../java/de/monticore/MontiCoreConstants.java | 22 + .../de/monticore/antlr4/MCConcreteParser.java | 65 + .../de/monticore/antlr4/MCErrorListener.java | 47 + .../java/de/monticore/antlr4/MCLexer.java | 17 + .../java/de/monticore/antlr4/MCParser.java | 284 + .../main/java/de/monticore/ast/ASTCNode.java | 433 ++ .../main/java/de/monticore/ast/ASTNode.java | 680 ++ .../java/de/monticore/ast/ASTNodeBuilder.java | 405 + .../main/java/de/monticore/ast/Comment.java | 76 + .../java/de/monticore/ast/CommentBuilder.java | 61 + .../ast/CompareNotSupportedException.java | 11 + .../monticore/generating/GeneratorEngine.java | 192 + .../monticore/generating/GeneratorSetup.java | 336 + .../templateengine/CodeHookPoint.java | 15 + .../GlobalExtensionManagement.java | 659 ++ .../generating/templateengine/HookPoint.java | 28 + .../templateengine/ObjectFactory.java | 107 + .../templateengine/StringHookPoint.java | 48 + .../templateengine/TemplateController.java | 696 ++ .../templateengine/TemplateHookPoint.java | 83 + .../TemplateStringHookPoint.java | 39 + .../freemarker/FreeMarkerTemplateEngine.java | 115 + .../MontiCoreFileTemplateLoader.java | 57 + .../MontiCoreFreeMarkerException.java | 54 + .../MontiCoreTemplateExceptionHandler.java | 117 + .../freemarker/MontiCoreTemplateLoader.java | 71 + .../freemarker/SimpleHashFactory.java | 55 + .../freemarker/alias/AddToGlobalVarAlias.java | 8 + .../freemarker/alias/Alias.java | 69 + .../freemarker/alias/BindHookPointAlias.java | 8 + .../alias/ChangeGlobalVarAlias.java | 8 + .../freemarker/alias/DebugAlias.java | 8 + .../alias/DefineGlobalVarAlias.java | 8 + .../alias/DefineHookPointAlias.java | 27 + .../DefineHookPointWithDefault3Alias.java | 23 + .../DefineHookPointWithDefaultAlias.java | 23 + .../freemarker/alias/ErrorAlias.java | 8 + .../alias/ExistsHookPointAlias.java | 8 + .../freemarker/alias/GetGlobalVarAlias.java | 8 + .../freemarker/alias/GlexAlias.java | 23 + .../freemarker/alias/Include2Alias.java | 8 + .../freemarker/alias/IncludeAlias.java | 8 + .../freemarker/alias/IncludeArgsAlias.java | 23 + .../freemarker/alias/InfoAlias.java | 8 + .../alias/RequiredGlobalVarAlias.java | 8 + .../alias/RequiredGlobalVarsAlias.java | 18 + .../freemarker/alias/SignatureAlias.java | 18 + .../freemarker/alias/SimpleGlexAlias.java | 21 + .../freemarker/alias/SimpleTcAlias.java | 21 + .../freemarker/alias/TcAlias.java | 23 + .../freemarker/alias/TraceAlias.java | 8 + .../freemarker/alias/WarnAlias.java | 8 + .../templateengine/reporting/Reporting.java | 915 +++ .../reporting/artifacts/ArtifactReporter.java | 219 + .../artifacts/ReportingNameHelper.java | 117 + .../artifacts/formatter/AFormatter.java | 27 + .../artifacts/formatter/GMLFormatter.java | 261 + .../artifacts/formatter/GVFormatter.java | 121 + .../reporting/artifacts/model/APkg.java | 127 + .../reporting/artifacts/model/Element.java | 170 + .../artifacts/model/ElementFactory.java | 33 + .../artifacts/model/ElementType.java | 21 + .../reporting/artifacts/model/Pkg.java | 46 + .../reporting/artifacts/model/RootPkg.java | 39 + .../reporting/commons/AReporter.java | 91 + .../reporting/commons/ASTNodeIdentHelper.java | 20 + .../commons/DefaultReportEventHandler.java | 304 + .../commons/IASTNodeIdentHelper.java | 55 + .../commons/IReportEventHandler.java | 262 + .../reporting/commons/Layouter.java | 170 + .../reporting/commons/MapUtil.java | 107 + .../reporting/commons/ObjectCountVisitor.java | 97 + .../reporting/commons/ReportCreator.java | 135 + .../reporting/commons/ReportManager.java | 481 ++ .../reporting/commons/ReportingConstants.java | 25 + .../reporting/commons/ReportingHelper.java | 87 + .../commons/ReportingRepository.java | 492 ++ .../reporting/commons/StatisticsHandler.java | 52 + .../reporting/commons/TreePrintVisitor.java | 125 + .../reporter/ArtifactGVReporter.java | 22 + .../reporter/ArtifactGmlReporter.java | 21 + .../reporting/reporter/DetailedReporter.java | 280 + .../reporter/GeneratedFilesReporter.java | 80 + .../reporter/HandWrittenCodeReporter.java | 88 + .../reporting/reporter/HookPointReporter.java | 439 ++ .../reporter/IncGenGradleReporter.java | 115 + .../reporting/reporter/IncGenReporter.java | 145 + .../reporter/InputOutputFilesReporter.java | 343 + .../reporter/InstantiationsReporter.java | 76 + .../reporter/InvolvedFilesReporter.java | 182 + .../reporter/NodeTreeDecoratedReporter.java | 275 + .../reporting/reporter/NodeTreeReporter.java | 214 + .../reporting/reporter/NodeTypesReporter.java | 169 + .../reporter/StatisticsReporter.java | 96 + .../reporter/SuccessfulReporter.java | 45 + .../reporting/reporter/SummaryReporter.java | 588 ++ .../reporter/TemplateTreeReporter.java | 249 + .../reporting/reporter/TemplatesReporter.java | 149 + .../reporter/TransformationReporter.java | 129 + .../reporting/reporter/VariablesReporter.java | 110 + .../de/monticore/io/FileReaderWriter.java | 279 + .../de/monticore/io/MontiCoreClassLoader.java | 30 + .../io/paths/GlobExpressionEvaluator.java | 76 + .../java/de/monticore/io/paths/MCPath.java | 258 + .../java/de/monticore/parser/Placeholder.java | 13 + .../prettyprint/AstPrettyPrinter.java | 10 + .../prettyprint/CommentPrettyPrinter.java | 56 + .../monticore/prettyprint/IndentPrinter.java | 398 + .../monticore/symboltable/IArtifactScope.java | 85 + .../monticore/symboltable/IGlobalScope.java | 67 + .../java/de/monticore/symboltable/IScope.java | 184 + .../symboltable/IScopeSpanningSymbol.java | 12 + .../de/monticore/symboltable/ISymbol.java | 88 + .../symboltable/ISymbolPredicate.java | 12 + .../symboltable/ImportStatement.java | 35 + .../SymbolWithScopeOfUnknownKind.java | 180 + .../SymbolWithScopeOfUnknownKindBuilder.java | 117 + .../SymbolWithScopeOfUnknownKindDeSer.java | 66 + .../symboltable/Symboltable/index.html | 911 +++ .../symboltable/modifiers/AccessModifier.java | 45 + .../modifiers/BasicAccessModifier.java | 104 + .../modifiers/CompoundAccessModifier.java | 52 + ...IncludesAccessModifierSymbolPredicate.java | 26 + .../symboltable/modifiers/Modifier.java | 7 + .../modifiers/NoAccessModifier.java | 28 + .../modifiers/ReadableAccessModifier.java | 42 + .../modifiers/StaticAccessModifier.java | 53 + .../modifiers/WritableAccessModifier.java | 43 + .../symboltable/resolving/ISymbolAdapter.java | 15 + ...olvedSeveralEntriesForSymbolException.java | 32 + .../symboltable/serialization/IDeSer.java | 94 + .../serialization/ISymbolDeSer.java | 43 + .../symboltable/serialization/JsonDeSers.java | 115 + .../symboltable/serialization/JsonLexer.java | 251 + .../symboltable/serialization/JsonParser.java | 290 + .../serialization/JsonPrinter.java | 599 ++ .../symboltable/serialization/JsonToken.java | 85 + .../serialization/JsonTokenKind.java | 46 + .../serialization/NumberLexer.java | 285 + .../serialization/json/JsonArray.java | 178 + .../serialization/json/JsonBoolean.java | 70 + .../serialization/json/JsonElement.java | 110 + .../json/JsonElementFactory.java | 74 + .../serialization/json/JsonNull.java | 42 + .../serialization/json/JsonNumber.java | 107 + .../serialization/json/JsonObject.java | 494 ++ .../serialization/json/JsonString.java | 66 + .../json/TraceableJsonObject.java | 60 + .../serialization/json/UserJsonString.java | 19 + .../monticore/tf/ast/IAttributeNegation.java | 11 + .../monticore/tf/ast/IAttributeOptional.java | 11 + .../monticore/tf/ast/IAttributePattern.java | 15 + .../tf/ast/IAttributeReplacement.java | 23 + .../main/java/de/monticore/tf/ast/IList.java | 10 + .../java/de/monticore/tf/ast/INegation.java | 11 + .../java/de/monticore/tf/ast/IOptional.java | 11 + .../java/de/monticore/tf/ast/IPattern.java | 14 + .../de/monticore/tf/ast/IReplacement.java | 25 + .../tf/ast/IReplacementOperator.java | 22 + .../de/monticore/tf/ast/ITFAttribute.java | 11 + .../java/de/monticore/tf/ast/ITFElement.java | 15 + .../java/de/monticore/tf/ast/ITFObject.java | 36 + .../tf/rule2od/Variable2AttributeMap.java | 99 + .../java/de/monticore/tf/runtime/ODRule.java | 51 + .../tf/runtime/SuccessfulReporter.java | 52 + .../monticore/tf/runtime/ValueComparator.java | 22 + .../tf/runtime/matching/ModelTraversal.java | 49 + .../matching/ModelTraversalFactory.java | 33 + .../matching/ModelTraversalVisitor.java | 38 + .../main/java/de/monticore/utils/Link.java | 109 + .../java/de/monticore/visitor/IHandler.java | 54 + .../java/de/monticore/visitor/ITraverser.java | 125 + .../java/de/monticore/visitor/IVisitor.java | 35 + .../monticore/tf/odrules/CheckConditions.ftl | 38 + .../monticore/tf/odrules/CheckConstraints.ftl | 18 + .../tf/odrules/CheckSubConstraints.ftl | 38 + .../de/monticore/tf/odrules/ClassMatch.ftl | 56 + .../monticore/tf/odrules/ClassMatchList.ftl | 57 + .../de/monticore/tf/odrules/ConstantCode.ftl | 69 + .../de/monticore/tf/odrules/Constructor.ftl | 54 + .../tf/odrules/DoPatternMatching.ftl | 94 + .../tf/odrules/DoPatternMatchingList.ftl | 300 + .../tf/odrules/DoPatternMatchingOptional.ftl | 43 + .../de/monticore/tf/odrules/DoReplacement.ftl | 28 + .../tf/odrules/FindActualCandidates.ftl | 12 + .../monticore/tf/odrules/FindCandidates.ftl | 42 + .../monticore/tf/odrules/FindSearchPlan.ftl | 95 + .../tf/odrules/HostGraphElementGetters.ftl | 124 + .../de/monticore/tf/odrules/MatchStates.ftl | 66 + .../monticore/tf/odrules/ParameterSetters.ftl | 35 + .../monticore/tf/odrules/SplitSearchplan.ftl | 21 + .../tf/odrules/TransformationClass.ftl | 43 + .../tf/odrules/TransformationUnit.ftl | 27 + .../monticore/tf/odrules/UndoReplacement.ftl | 29 + .../constantcode/HandleChangeObject.ftl | 34 + .../constantcode/HandleDeleteObject.ftl | 21 + .../constantcode/HandleMatchObject.ftl | 12 + .../dopatternmatching/HandleListObject.ftl | 45 + .../dopatternmatching/HandleNormalObject.ftl | 51 + .../dopatternmatching/HandleNotObject.ftl | 63 + .../dopatternmatching/HandleOptObject.ftl | 46 + .../ChangeAttributeValueList.ftl | 85 + ...ngeAttributeValueSingleCompositeInList.ftl | 56 + ...AttributeValueSingleCompositeNotInList.ftl | 88 + .../ChangeAttributeValueSinglePrimitive.ftl | 36 + .../doreplacement/ChangeAttributeValues.ftl | 44 + .../odrules/doreplacement/CreateObjects.ftl | 63 + .../ChangeAttributeValueList.ftl | 81 + ...ngeAttributeValueSingleCompositeInList.ftl | 52 + ...AttributeValueSingleCompositeNotInList.ftl | 76 + .../ChangeAttributeValueSinglePrimitive.ftl | 35 + .../undoreplacement/ChangeAttributeValues.ftl | 22 + .../java/de/monticore/ast/ASTCNodeMock.java | 38 + .../java/de/monticore/ast/ASTNodeMock.java | 487 ++ .../de/monticore/ast/CommentBuilderTest.java | 33 + .../de/monticore/cocos/helper/Assert.java | 75 + .../generating/GeneratorEngineMock.java | 31 + .../generating/GeneratorEngineTest.java | 111 + .../templateengine/CodeHookPointMock.java | 49 + .../templateengine/DefaultImpl.java | 5 + .../FreeMarkerTemplateEngineMock.java | 54 + .../FreeMarkerTemplateMock.java | 62 + .../templateengine/GeneratorSetupMock.java | 16 + ...obalExtensionManagementGlobalVarsTest.java | 94 + .../templateengine/IDefaultImpl.java | 9 + .../templateengine/ObjectFactoryTest.java | 64 + .../templateengine/TemplateAliasingTest.java | 430 ++ .../TemplateControllerHookPointsTest.java | 324 + .../TemplateControllerMock.java | 31 + .../TemplateControllerSignatureUsageTest.java | 131 + .../TemplateControllerTest.java | 184 + .../templateengine/TemplateLoggerTest.java | 79 + .../templateengine/TestConstants.java | 9 + .../commons/ReportingStringHelperTest.java | 43 + .../commons/StatisticsHandlerTest.java | 26 + .../generating/templateengine/templates/A.ftl | 2 + ...umentsAreOnlyVisibleInIncludedTemplate.ftl | 4 + .../generating/templateengine/templates/B.ftl | 2 + .../generating/templateengine/templates/C.ftl | 2 + .../templates/DefaultMethodCall.ftl | 3 + .../templates/GlobalListVars.ftl | 8 + .../templateengine/templates/GlobalVars.ftl | 12 + .../templateengine/templates/HelloWorld.ftl | 2 + .../templateengine/templates/HookCall.ftl | 2 + .../templateengine/templates/HowAreYou.ftl | 2 + .../templateengine/templates/Log.ftl | 4 + .../templates/NestedSignatureCalls.ftl | 3 + .../templates/ParameterizedInclusionUsage.ftl | 4 + .../templates/PrintNameIfExists.ftl | 6 + .../templates/SignatureWithManyParameters.ftl | 3 + .../templates/SignatureWithOneParameter.ftl | 3 + .../SignatureWithThreeParameters.ftl | 3 + .../templates/TestVariables4.ftl | 6 + .../templateengine/templates/TopA.ftl | 2 + .../templates/TopStringHook.ftl | 2 + .../templates/TopTemplateHook.ftl | 2 + .../templates/aliases/AddToGlobalVarAlias.ftl | 4 + .../templates/aliases/BindHookPointAlias.ftl | 4 + .../aliases/ChangeGlobalVarAlias.ftl | 2 + .../aliases/DefineGlobalVarAlias.ftl | 2 + .../aliases/DefineHookPointAlias.ftl | 5 + .../DefineHookPointWithDefaultAlias.ftl | 5 + .../aliases/ExistsHookPointAlias.ftl | 3 + .../templates/aliases/GetGlobalVarAlias.ftl | 2 + .../templates/aliases/GlobalListVarsAlias.ftl | 8 + .../templates/aliases/Include2Alias.ftl | 2 + .../templates/aliases/IncludeAlias.ftl | 2 + .../templates/aliases/IncludeArgsAlias.ftl | 2 + .../aliases/IncludeArgsAndSignatureAlias.ftl | 2 + .../templates/aliases/IncludeDispatching.ftl | 12 + .../templates/aliases/LogAliases.ftl | 6 + .../templates/aliases/Plain.ftl | 2 + .../aliases/RequiredGlobalVarAlias.ftl | 2 + .../aliases/RequiredGlobalVarsAlias.ftl | 2 + .../SignatureAliasWithThreeParameters.ftl | 3 + .../templates/aliases/WithAst.ftl | 2 + .../generating/templates/ClassProd.ftl | 2 + .../monticore/generating/templates/First.ftl | 2 + .../generating/templates/GrammarTest.ftl | 2 + .../generating/templates/InterfaceProd.ftl | 2 + .../generating/templates/MainClassProd.ftl | 2 + .../generating/templates/MainGrammar.ftl | 2 + .../templates/MainInterfaceProd.ftl | 2 + .../generating/templates/MainTest.ftl | 2 + .../java/de/monticore/io/FileFinderTest.java | 311 + .../de/monticore/io/FileReaderWriterMock.java | 39 + .../de/monticore/io/FileReaderWriterTest.java | 53 + .../de/monticore/io/paths/MCPathTest.java | 198 + .../serialization/JsonLexerTest.java | 144 + .../serialization/JsonParserTest.java | 82 + .../JsonPrinterSecurityTest.java | 116 + .../serialization/JsonPrinterTest.java | 281 + .../test/models/de/monticore/io/Model1.cdsym | 2 + .../test/models/de/monticore/io/Model2.cd4 | 2 + .../test/models/de/monticore/io/Model2.mc4 | 2 + .../resources/de/monticore/io/Model1.cdsym | 2 + .../resources/de/monticore/io/Model1.dsym | 2 + .../resources/de/monticore/io/Model1.sdsym | 2 + .../test/resources/de/monticore/io/Model3.mc4 | 2 + .../de/monticore/parsing/SimpleStateChart.mc4 | 16 + .../de/monticore/parsing/Statechart.mc4 | 42 + .../languagecomposition/embedding/Entity.cla | 3 + .../languagecomposition/family/Cla.cla | 3 + .../languagecomposition/family/Sc.sc | 3 + .../src/test/resources/hwc/test/A.java | 7 + .../src/test/resources/jar/Test.jar | Bin 0 -> 140839 bytes .../src/test/resources/logback.groovy | 26 + .../test/resources/modelloader/modeljar.jar | Bin 0 -> 931 bytes .../modelloader/modelpath/models/A.cla | 0 .../modelloader/modelpath/models/B.cla | 0 .../modelloader/modelpath/models/B.dex | 0 .../modelloader/modelpath/models/B.ext | 0 .../modelloader/modelpath/models/D.cla | 0 .../modelloader/modelpath/models/E.cla | 0 .../modelloader/modelpath2/models/A.sc | 2 + .../modelloader/modelpath2/models/D.cla | 0 .../modelpathtest/path1/ambiguousfile.txt | 1 + .../modelpathtest/path1/unambiguousfile.txt | 1 + .../modelpathtest/path2/ambiguousfile.txt | 1 + .../src/test/resources/paths/1/AFile.ftl | 1 + .../src/test/resources/paths/1/AFile.txt | 0 .../src/test/resources/paths/1/a/AFile.ftl | 1 + .../src/test/resources/paths/1/a/AFile.txt | 0 .../src/test/resources/paths/2/a/AFile.ftl | 1 + .../src/test/resources/paths/2/a/AFile.txt | 0 overrides/main.html | 24 + scripts/ftlAnalysis.sh | 260 + scripts/preprocessing.sh | 35 + search/search_index.json | 1 + sitemap.xml | 138 + sitemap.xml.gz | Bin 0 -> 552 bytes stylesheets/extra.css | 20 + 1635 files changed, 154075 insertions(+) create mode 100644 00.org/Explanations/CHANGELOG/index.html create mode 100644 00.org/Explanations/FAQ/index.html create mode 100644 00.org/Explanations/StatusOfGrammars/index.html create mode 100644 00.org/Licenses/LICENSE-BSD3CLAUSE/index.html create mode 100644 00.org/Licenses/LICENSE-LGPL/index.html create mode 100644 00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/index.html create mode 100644 404.html create mode 100644 MontiCoreHandbook2021.gif create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.220ee61c.min.js create mode 100644 assets/javascripts/bundle.220ee61c.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js create mode 100644 assets/javascripts/workers/search.74e28a9f.min.js.map create mode 100644 assets/stylesheets/main.eebd395e.min.css create mode 100644 assets/stylesheets/main.eebd395e.min.css.map create mode 100644 assets/stylesheets/palette.ecc896b0.min.css create mode 100644 assets/stylesheets/palette.ecc896b0.min.css.map create mode 100644 docs/Agile-use-of-Models-for-Coding-and-Testing--Usage-of-UML-Diagrams.png create mode 100644 docs/BestPractices-CLI/index.html create mode 100644 docs/BestPractices-Errors/index.html create mode 100644 docs/BestPractices-Language-Design/index.html create mode 100644 docs/BestPractices-Symbols-Scopes/index.html create mode 100644 docs/BestPractices-Syntax-Design/index.html create mode 100644 docs/BestPractices/index.html create mode 100644 docs/Bild6.png create mode 100644 docs/BuildMontiCore/index.html create mode 100644 docs/DevelopedLanguages/index.html create mode 100644 docs/Download/index.html create mode 100644 docs/Eclipse.png create mode 100644 docs/GenAutomataAST.png create mode 100644 docs/GenAutomataParser.png create mode 100644 docs/GenAutomataScopes.png create mode 100644 docs/GenAutomataSymbols.png create mode 100644 docs/GenAutomataVisitors.png create mode 100644 docs/GettingStarted/index.html create mode 100644 docs/IntelliJ-IDEA.png create mode 100644 docs/Languages/index.html create mode 100644 docs/MontiCore--Selected-Languages.png create mode 100644 docs/Notational-Conventions.png create mode 100644 docs/Publications/index.html create mode 100644 docs/further_docs/Impressum/index.html create mode 100644 docs/small_bulb.png create mode 100644 img/favicon.ico create mode 100644 index.html create mode 100644 mc-logo.png create mode 100644 monticore-grammar/build.gradle create mode 100644 monticore-grammar/src/main/examples/MCHexNumbers.mc4 create mode 100644 monticore-grammar/src/main/examples/MCNumbers.mc4 create mode 100644 monticore-grammar/src/main/examples/StringLiterals.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/Cardinality.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/Cardinality.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/Completeness.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/Completeness.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/Grammars/index.html create mode 100644 monticore-grammar/src/main/grammars/de/monticore/JavaLight.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/JavaLight.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/JavaLight/index.html create mode 100644 monticore-grammar/src/main/grammars/de/monticore/MCBasics.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/MCBasics.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/MCCommon.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/MCCommon.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/UMLModifier.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/UMLModifier.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/UMLStereotype.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/UMLStereotype.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/AssignmentExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/AssignmentExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/BitExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/BitExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/CommonExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/CommonExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/Expressions/index.html create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/ExpressionsBasis.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/ExpressionsBasis.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/JavaClassExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/JavaClassExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/LambdaExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/LambdaExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/StreamExpressions.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/expressions/StreamExpressions.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/Grammar.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/Grammar.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/Grammar_WithConcepts.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/Grammar_WithConcepts.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/concepts/antlr/Antlr.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/grammar/concepts/antlr/Antlr.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/Literals/index.html create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCCommonLiterals.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCCommonLiterals.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCJavaLiterals.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCJavaLiterals.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCLiteralsBasis.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/literals/MCLiteralsBasis.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCArrayStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCArrayStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCAssertStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCAssertStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCCommonStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCCommonStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCExceptionStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCExceptionStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCFullJavaStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCFullJavaStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCLowLevelStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCLowLevelStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCReturnStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCReturnStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCStatementsBasis.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCStatementsBasis.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCSynchronizedStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCSynchronizedStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCVarDeclarationStatements.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/statements/MCVarDeclarationStatements.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/BasicSymbols.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/BasicSymbols.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/CompSymbols.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/CompSymbols.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/OOSymbols.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/symbols/OOSymbols.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/ODRuleGeneration.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/ODRuleGeneration.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/ODRules.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/ODRules.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/TFBasisExts.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/TFBasisExts.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/TFCommons.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/tf/TFCommons.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCArrayTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCArrayTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCBasicTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCBasicTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCCollectionTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCCollectionTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCFullGenericTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCFullGenericTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCFunctionTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCFunctionTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCSimpleGenericTypes.mc4 create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/MCSimpleGenericTypes.mlc create mode 100644 monticore-grammar/src/main/grammars/de/monticore/types/Types/index.html create mode 100644 monticore-grammar/src/main/grammarsHC/de/monticore/literals/tr/MCCommonLiteralsTRHC.mc4 create mode 100644 monticore-grammar/src/main/java/de/monticore/completeness/_prettyprint/CompletenessPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/assignmentexpressions/cocos/AssignmentExpressionsOnlyAssignToLValuesCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/assignmentexpressions/types3/AssignmentExpressionsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/bitexpressions/types3/BitExpressionsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/cocos/ExpressionValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/commonexpressions/_ast/ASTCallExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/commonexpressions/_ast/ASTFieldAccessExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/commonexpressions/types3/CommonExpressionsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/commonexpressions/types3/util/CommonExpressionsLValueRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/expressionsbasis/_ast/ASTNameExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/expressionsbasis/types3/ExpressionBasisTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/AssignmentExpressionsFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/AssignmentExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/BitExpressionsFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/BitExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/CommonExpressionsFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/CommonExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/ExpressionsBasisFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/ExpressionsBasisJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/JavaClassExpressionsFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/JavaClassExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/LambdaExpressionsFullJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/LambdaExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/exptojava/LegacyCommonExpressionsJavaPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/lambdaexpressions/_symboltable/LambdaExpressionsSTCompleteTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/lambdaexpressions/_symboltable/LambdaExpressionsSTCompleteTypes2.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/lambdaexpressions/types3/LambdaExpressionsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/AssignmentExpressionsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/AssignmentExpressionsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/BitExpressionsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/BitExpressionsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/CommonExpressionsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/CommonExpressionsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/ExpressionsBasisFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/ExpressionsBasisPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/JavaClassExpressionsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/JavaClassExpressionsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/LambdaExpressionsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/expressions/prettyprint/LambdaExpressionsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/ComponentCollector.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/DirectLeftRecursionDetector.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/LexNamer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/MCGrammarSymbolTableHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/Multiplicity.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/MultiplicityVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/PredicatePair.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/RegExpBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ASTRuleAndNTUseSameAttrNameForDiffNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AbstractNTNotExtendInterfaceOrExternalNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AbstractNTOnlyExtendOrAstextendNTOrClass.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AbstractNTOnlyExtendsOneNTOrClass.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AbstractNTOnlyImplementInterfaceNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AbstractNTWithoutExtensionOnlyInComponentGrammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/AttributeNameLowerCase.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ConservativeExtensionCheck.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/DerivedAndManualListName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/DuplicatedEnumConstant.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/DuplicatedSymbolDefinitionInProd.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ExternalNTNoASTRule.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ExternalNTOnlyInComponentGrammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/GrammarCoCos.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/GrammarExtensionOnce.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/GrammarInheritanceCycle.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/GrammarNameUpperCase.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/InheritedModiOverwrite.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/InheritedScopeProperty.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/InheritedSymbolProperty.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/InterfaceNTOnlyExtendInterfaceNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/InterfaceNTWithoutImplementationOnlyInComponentGrammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/KeyConstantInvalid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/KeyRuleWithoutName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/KeywordAlternativeName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/KeywordInvalidName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/KeywordRuleInvalid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/LeftRecursiveRulesInBlock.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/LexNTsNotEmpty.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/LexNTsOnlyUseLexNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/LexProdModeNameUpperCase.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/MultipleASTRules.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTAndASTRuleExtendType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTDefinedByAtmostOneProduction.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTForASTRuleExists.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTNotExtendInterfaceOrExternalNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTOnlyExtendOrAstextendNTOrClass.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTOnlyExtendsOneNTOrClass.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTOnlyImplementInterfaceNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NTUniqueIgnoreCase.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoASTExtendsForClasses.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoASTRuleForEnumNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoExtensionOfSymbolThatOnlySpansScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenGrammarName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenProdAndSymbolName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenProdName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenProdNameAddon.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenSymbolName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoForbiddenSymbolNameAddon.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoMultipleSymbolRule.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoNTInheritanceCycle.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoNestedGenericsInAdditionalAttributes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoOverridingNTHasAnnotation.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoReplaceKeywordRuleOnConstantGroup.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoReplaceKeywordRuleOnUsageNamedAttribute.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoTokenDefined.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoTokenDefinedVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/NoTokenModeInComponentGrammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingAbstractNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingAbstractNTsHaveNoSuperRules.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingAdditionalAttributes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingEnumNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingInterfaceNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingLexNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingNTHasNoAnnotation.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/OverridingNTsHaveNoSuperRules.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/PackageNameLowerCase.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdAndExtendedProdUseSameAttrNameForDiffNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdAndOverriddenProdUseSameAttrNameForDiffNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdExtendsNotExistingProd.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdStartsWithCapital.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdWithDoubleAnnos.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ProdWithExtensionMustNotBeOverridden.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ReferenceSymbolNotName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ReferenceSymbolSameAttribute.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ReferenceSymbolSameAttributeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ReferencedNTNotDefined.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ReferencedSymbolExists.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/RuleComponentsCompatible.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/ScopeProdOverwrittenByScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SplitRuleInvalid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SubrulesUseInterfaceNTs.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SymbolProdOverwrittenBySymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SymbolRuleHasName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SymbolRuleWithoutSymbolRef.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/SymbolWithManyNames.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/TerminalCritical.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/TerminalEmptyString.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/TokenConstantInvalid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/UniqueProdNameInGrammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/UnnamedTerminalInInterface.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/UsedLexNTNotDefined.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/cocos/UsedNTNotDefined.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTConstant.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTKeyTerminal.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTParserProd.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTProd.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTRuleComponent.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_ast/ASTTokenTerminal.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_prettyprint/GrammarPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/GrammarSTCompleteTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/GrammarScopesGenitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/IGrammarScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/MCGrammarSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/MCGrammarSymbolBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/ProdSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/ProdSymbolSurrogate.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar/_symboltable/RuleComponentSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/FullSynthesizeFromMCSGT4Grammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/SynthesizeFromMCBT4Grammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/SynthesizeFromMCSGT4Grammar.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_parser/GrammarTransformer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_parser/Grammar_WithConceptsParser.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_parser/RuleComponentListFinder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_symboltable/Grammar_WithConceptsGlobalScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_symboltable/Grammar_WithConceptsPhasedSTC.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_symboltable/Grammar_WithConceptsScopesGenitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/grammar_withconcepts/_symboltable/Grammar_WithConceptsScopesGenitorDelegator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/prettyprint/AntlrPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/prettyprint/GrammarPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/prettyprint/Grammar_WithConceptsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/grammar/prettyprint/Grammar_WithConceptsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/_symboltable/JavaLightSTCompleteTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/_symboltable/JavaMethodSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/ConstructorFormalParametersDifferentName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/ConstructorModifiersValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/ConstructorNoAccessModifierPair.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/ConstructorNoDuplicateModifier.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodAbstractAndOtherModifiers.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodBodyAbsence.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodBodyPresence.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodExceptionThrows.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodFormalParametersDifferentName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodNoDuplicateModifier.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/MethodNoNativeAndStrictfp.java create mode 100644 monticore-grammar/src/main/java/de/monticore/javalight/cocos/ReturnTypeAssignmentIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/MCLiteralsDecoder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/_prettyprint/MCCommonLiteralsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/BasicDoubleLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/BasicFloatLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/BasicLongLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/NatLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/SignedBasicDoubleLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/SignedBasicFloatLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/SignedBasicLongLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/cocos/SignedNatLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mccommonliterals/types3/MCCommonLiteralsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mcjavaliterals/cocos/DoubleLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mcjavaliterals/cocos/FloatLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mcjavaliterals/cocos/IntLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mcjavaliterals/cocos/LongLiteralRangeCoCo.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/mcjavaliterals/types3/MCJavaLiteralsTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/prettyprint/MCCommonLiteralsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/prettyprint/MCCommonLiteralsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/prettyprint/MCJavaLiteralsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/literals/prettyprint/MCJavaLiteralsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/CardinalityFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/CardinalityPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/CompletenessFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/CompletenessPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/JavaLightFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/JavaLightPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/MCBasicsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/UMLModifierFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/UMLModifierPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/UMLStereotypeFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/prettyprint/UMLStereotypePrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/_symboltable/MCCommonStatementsPhasedSymbolTableCreatorDelegator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/_symboltable/MCCommonStatementsSTCompleteTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/AssertIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/CatchIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/DoWhileConditionHasBooleanType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/ExpressionStatementIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/ForConditionHasBooleanType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/ForEachIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/IfConditionHasBooleanType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/ResourceInTryStatementCloseable.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/SwitchStatementValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/SynchronizedArgIsReftype.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/ThrowIsValid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mccommonstatements/cocos/WhileConditionHasBooleanType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mcvardeclarationstatements/_cocos/VarDeclarationInitializationHasCorrectType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mcvardeclarationstatements/_symboltable/MCVarDeclarationStatementsPhasedSymbolTableCreatorDelegator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/mcvardeclarationstatements/_symboltable/MCVarDeclarationStatementsSTCompleteTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCArrayStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCArrayStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCAssertStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCAssertStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCCommonStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCCommonStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCExceptionStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCExceptionStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCLowLevelStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCLowLevelStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCReturnStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCReturnStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCSynchronizedStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCSynchronizedStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCVarDeclarationStatementsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/statements/prettyprint/MCVarDeclarationStatementsPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/BasicSymbolsMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/FunctionSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/FunctionSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/IBasicSymbolsScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/TypeSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/TypeSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/TypeSymbolSurrogate.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/TypeVarSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/TypeVarSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/VariableSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/basicsymbols/_symboltable/VariableSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/ComponentSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/ComponentSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/PortSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/PortSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/SubcomponentSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/compsymbols/_symboltable/Timing.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/library/StreamType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/FieldSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/FieldSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/IOOSymbolsScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/MethodSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/MethodSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/OOTypeSymbol.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/OOTypeSymbolDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/symbols/oosymbols/_symboltable/OOTypeSymbolSurrogate.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/grammartransformation/CollectCoCoInformationState.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrulegeneration/_ast/ASTDeleteOperation.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrulegeneration/_ast/ASTDeleteOperationBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrulegeneration/_ast/ASTTransformationStructure.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrulegeneration/_ast/ASTTransformationStructureBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/AddAffixesToAssignmentsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/ChangeOperationFactory.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/DifferenceFinder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/GenerateConditionsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/GenerateLinkConditionsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/HierarchyHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/ODBuildOrder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/ODRuleCodeGenerator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/ODRulesCLI.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/_ast/ASTODAttribute.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/_ast/ASTODLink.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/_ast/ASTODObject.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/_symboltable/IODRulesScope.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/AddSuffixToOptionalsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/CalculateContextVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/CheckIfContainsTargetVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/DeleteMatchAccessVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/FindDependVarsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/FindOptionalsVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/FindSubExpressionVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/InsertIsPresentChecksVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/ODSubConstraint.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/subConstraints/ReplaceIdentifierVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/util/NameASTPair.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/util/ODRuleStereotypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/util/ODRulesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/util/TFExpressionFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/odrules/util/Util.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/ruletranslation/ODRuleNameGenerator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/ruletranslation/Position.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/ruletranslation/Rule2ODState.java create mode 100644 monticore-grammar/src/main/java/de/monticore/tf/ruletranslation/Rule2ODVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCArrayTypesNodeIdentHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCBasicTypesHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCBasicTypesNodeIdentHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCCollectionTypesNodeIdentHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCFullGenericTypesNodeIdentHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCSimpleGenericTypesNodeIdentHelper.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/MCTypeFacade.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/AbstractDerive.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/AbstractDeriveFromExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/AbstractSynthesize.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/AbstractSynthesizeFromType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/CompKindExprDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/CompKindExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfAssignmentExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfBSCommonExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfBitExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfCommonExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfJavaClassExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfLambdaExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfLiterals.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfMCCommonLiterals.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/DeriveSymTypeOfMCJavaLiterals.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullCompKindExprDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCArrayTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCBasicTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCCollectionTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCFullGenericTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCFunctionTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/FullSynthesizeFromMCSimpleGenericTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/IDerive.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/ISynthesize.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/ISynthesizeComponent.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/ITypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/KindOfComponent.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/KindOfComponentDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/KindOfGenericComponent.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/KindOfGenericComponentDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeArray.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeArrayDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeExpression.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeExpressionDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeExpressionFactory.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeObscure.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfFunction.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfFunctionDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfGenerics.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfGenericsDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfIntersection.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfIntersectionDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfNull.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfObject.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfObjectDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfUnion.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfUnionDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfWildcard.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeOfWildcardDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypePrimitive.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypePrimitiveDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeVariable.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeVariableDeSer.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SymTypeVoid.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthComp4MCBasicTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthComp4MCSimpleGenericTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthCompResult.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCArrayTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCBasicTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCCollectionTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCFullGenericTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCFunctionTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/SynthesizeSymTypeFromMCSimpleGenericTypes.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/TypeCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/TypeCheck.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/TypeCheck/index.html create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/TypeCheckResult.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/TypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/DefiningSymbolHandler.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/DefiningSymbolSetter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/DefiningSymbolSetter4CommonExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/ExprToNamePair.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/ExprToOptNamePair.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/SubExprNameExtractionResult.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/SubExprNameExtractionVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/SubExprNameExtractor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/helpers/SubExprNameExtractor4CommonExpressions.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/types3wrapper/TypeCheck3AsIDerive.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/types3wrapper/TypeCheck3AsISynthesize.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/check/types3wrapper/TypeCheck3AsTypeCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcarraytypes/MCArrayTypesMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcarraytypes/_ast/ASTMCArrayType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcarraytypes/_prettyprint/MCArrayTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcarraytypes/types3/MCArrayTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/CalculatePotentialQNames.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/MCBasicTypesMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCImportStatement.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCPrimitiveType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCQualifiedName.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCQualifiedType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCReturnType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/_ast/ASTMCType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcbasictypes/types3/MCBasicTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/MCCollectionTypesMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCBasicTypeArgument.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCGenericType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCListType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCMapType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCMapTypeBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCOptionalType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCPrimitiveTypeArgument.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCSetType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/_ast/ASTMCTypeArgument.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/types3/IMCCollectionTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/types3/MCCollectionTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/types3/util/MCCollectionSymTypeFactory.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mccollectiontypes/types3/util/MCCollectionTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfullgenerictypes/MCFullGenericTypesMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfullgenerictypes/_ast/ASTMCMultipleGenericType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfullgenerictypes/_ast/ASTMCWildcardTypeArgument.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfullgenerictypes/types3/MCFullGenericTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfunctiontypes/_ast/ASTMCFunctionType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcfunctiontypes/types3/MCFunctionTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcsimplegenerictypes/MCSimpleGenericTypesMill.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcsimplegenerictypes/_ast/ASTMCBasicGenericType.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcsimplegenerictypes/_ast/ASTMCCustomTypeArgument.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/mcsimplegenerictypes/types3/MCSimpleGenericTypesTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCArrayTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCArrayTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCBasicTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCBasicTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCCollectionTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCCollectionTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCFullGenericTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCFullGenericTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCFunctionTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCFunctionTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCSimpleGenericTypesFullPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types/prettyprint/MCSimpleGenericTypesPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/AbstractTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/ISymTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/ISymTypeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/SymTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/Type4Ast.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/BuiltInTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/FunctionRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/ILValueRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/NameExpressionTypeCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/NominalSuperTypeCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/OONameExpressionTypeCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/OOWithinTypeBasicSymbolsResolver.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeBoxingVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeCompatibilityCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeDeepCloneVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeLubCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeNormalizeVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeRelations.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeUnboxingVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/SymTypeVariableReplaceVisitor.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/TypeContextCalculator.java create mode 100644 monticore-grammar/src/main/java/de/monticore/types3/util/WithinTypeBasicSymbolsResolver.java create mode 100644 monticore-grammar/src/main/java/de/monticore/umlmodifier/_ast/ASTModifierBuilder.java create mode 100644 monticore-grammar/src/main/java/de/monticore/umlmodifier/_prettyprint/UMLModifierPrettyPrinter.java create mode 100644 monticore-grammar/src/main/java/de/monticore/umlstereotype/_ast/ASTStereoValue.java create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestCardinality.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestCompleteness.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestJavaLight.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestMCCommon.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestMCHexNumbers.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestMCLiteralsV2.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestMCLiteralsV3.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestMCNumbers.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestStringLiterals.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestUMLModifier.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/TestUMLStereotype.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/aggregation/Blah.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/aggregation/Foo.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/AbstractTypeCheckTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/CombineExpressionsWithLiterals.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestAssignmentExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestBitExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestCommonExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestJavaClassExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestLambdaExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/expressions/TestStreamExpressions.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/literals/TestMCCommonLiterals.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/literals/TestMCJavaLiterals.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCArrayStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCAssertStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCCommonStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCExceptionStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCFullJavaStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCLowLevelStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCReturnStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCSynchronizedStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/statements/TestMCVarDeclarationStatements.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/testsymtabmill/TestSymTabMill.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/typepersistence/Variable.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/GenericTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCArrayTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCBasicTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCCollectionTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCCollectionTypesWithoutPrimitivesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCFullGenericTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCFunctionTypesTest.mc4 create mode 100644 monticore-grammar/src/test/grammars/de/monticore/types/MCSimpleGenericTypesTest.mc4 create mode 100644 monticore-grammar/src/test/java/de/monticore/MCCommonUnitTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/SymbolImportTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/aggregation/AggregationTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/aggregation/blah/Bar2DummySymbol.java create mode 100644 monticore-grammar/src/test/java/de/monticore/aggregation/foo/_symboltable/FooGlobalScope.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/assignmentexpressions/cocos/AssignmentExpressionsOnlyAssignToLValuesCoCoTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/cocos/ExpressionValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/combineexpressionswithliterals/_cocos/CombineExpressionsWithLiteralsCoCoChecker.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/combineexpressionswithliterals/_cocos/NoClassExpressionForGenerics.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/combineexpressionswithliterals/_cocos/TestNoClassExpressionForGenerics.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/exptojava/AssignmentExpressionsJavaPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/exptojava/BitExpressionsJavaPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/exptojava/CommonExpressionsJavaPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/exptojava/JavaClassExpressionsJavaPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/AssignmentExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/BitExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/CommonExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/JavaClassExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/LambdaExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/expressions/prettyprint/StreamExpressionsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/GrammarGlobalScopeTestFactory.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/MCGrammarParserTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/MCGrammarPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ASTRuleAndNTUseSameAttrNameForDiffNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AbstractNTNotExtendInterfaceOrExternalNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AbstractNTOnlyExtendsOneNTOrClassTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AbstractNTOnlyExtendsOrAstextendsNTOrClassTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AbstractNTOnlyImplementInterfaceNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AbstractNTWithoutExtensionOnlyInComponentGrammarTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/AttributeNameLowerCaseTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/CocoTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ConservativeExtensionCheckTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/DerivedAndManualListNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/DuplicatedEnumConstantTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/DuplicatedSymbolDefinitionInProdTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ExternalNTNoASTRuleTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ExternalNTOnlyInComponentGrammarTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/GrammarExtensionOnceTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/GrammarInheritanceCycleTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/GrammarNameEqualsFileNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/GrammarNameUpperCaseTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/InheritedModiOverwriteTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/InheritedScopePropertyTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/InheritedSymbolPropertyTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/InterfaceNTOnlyExtendInterfaceNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/InterfaceNTWithoutImplementationOnlyInComponentGrammarTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/KeyConstantInvalidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/KeyRuleWithoutNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/KeywordAlternativeNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/KeywordInvalidNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/KeywordRuleInvalidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/LeftRecursiveRulesInBlockTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/LexNTsNotEmptyTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/LexNTsOnlyUseLexNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/LexProdModeNameUpperCaseTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/MultipleASTRulesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTAndASTRuleExtendTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTDefinedByAtmostOneProductionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTForASTRuleExistsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTNotExtendInterfaceOrExternalNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTOnlyExtendsOneNTOrClassTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTOnlyExtendsOrAstextendsNTOrClassTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTOnlyImplementInterfaceNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NTUniqueIgnoreCaseTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoASTExtendsForClassesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoASTRuleForEnumNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoExtensionOfSymbolThatOnlySpansScopeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenGrammarNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenProdAndSymbolNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenProdNameAddonTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenProdNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenSymbolNameAddonTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoForbiddenSymbolNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoMultipleSymbolRuleTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoNTInheritanceCycleTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoNestedGenericsInAdditionalAttributesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoOverridingNTHasAnnotationTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoReplaceKeywordRuleOnConstantGroupTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoReplaceKeywordRuleOnUsageNamedAttributeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoTokenDefinedTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/NoTokenModeInComponentGrammarTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingAbstractNTsHaveNoSuperRulesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingAbstractNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingAdditionalAttriutesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingEnumNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingInterfaceNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingLexNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingNTHasNoAnnotationTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingNTsHaveNoSuperRulesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/OverridingNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/PackageNameLowerCaseTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdAndExtendedProdUseSameAttrNameForDiffNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdAndOverriddenProdUseSameAttrNameForDiffNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdExtendsNotExistingProdTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdStartsWithCapitalTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdWithDoubleAnnosTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ProdWithExtensionMustNotBeOverriddenTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ReferenceSymbolNotNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ReferenceSymbolSameAttributeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ReferencedNTNotDefinedTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ReferencedSymbolExistsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/RuleComponentsCompatibleTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/ScopeProdOverwrittenByScopeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SplitRuleInvalidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SubrulesUseInterfaceNTsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SymbolProdOverwrittenBySymbolTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SymbolRuleHasNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SymbolRuleWithoutSymbolRefTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/SymbolWithManyNamesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/TerminalCriticalTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/TerminalEmptyStringTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/TokenConstantInvalidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/UniqueProdNameInGrammarTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/UnnamedTerminalInInterfaceTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/UsedLexNTNotDefinedTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/cocos/UsedNTNotDefinedTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/symboltable/IGrammarScopeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/grammar/symboltable/MontiCoreGrammarSymbolTableCreatorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/ConstructorFormalParametersDifferentNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/ConstructorModifiersValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/ConstructorNoAccessModifierPairTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/ConstructorNoDuplicateModifierTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/JavaLightCocoTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/JavaLightPhasedSymbolTableCreatorDelegator.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/JavaLightSTCompleteTypesDelegator.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodAbstractAndOtherModifiersTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodBodyAbsenceTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodBodyPresenceTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodExceptionThrowsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodFormalParametersDifferentNameTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/MethodNoNativeAndStrictfpTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/javalight/cocos/ReturnTypeAssignmentIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mccommonliterals/DoubleCommonLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mccommonliterals/FloatCommonLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mccommonliterals/IntCommonLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mccommonliterals/LongCommonLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mccommonliterals/RangeCoCosTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/DoubleJavaLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/FloatJavaLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/IntJavaLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/LongJavaLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/MCJavaLiteralsTestHelper.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcjavaliterals/RangeCoCosTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/CharLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/MCLiteralsTestHelper.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/MCLiteralsUnitTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/NatLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/NullAndBooleanLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/SignedNatLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/mcliterals/StringLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/CardinalityPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/CompletenessPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/GrammarPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/JavaLightPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/MCCommonLiteralsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/MCHexNumbersPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/MCJavaLiteralsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/MCNumbersPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/StringLiteralsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/UMLModifierPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/prettyprint/UMLStereotypePrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/AssertIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/CatchIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/DoWhileConditionHasBooleanTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/ExpressionStatementIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/ForConditionHasBooleanTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/ForEachIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/IfConditionHasBooleanTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/ResourceInTryStatementCloseableTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/SwitchStatementValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/SynchronizedArgIsReftypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/ThrowIsValidTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/VarDeclarationInitializationHasCorrectTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/cocos/WhileConditionHasBooleanTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCArrayStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCAssertStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCCommonStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCExceptionStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCLowLevelStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCReturnStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCSynchronizedStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/statements/prettyprint/MCVarDeclarationStatementsPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/symbols/basicsymbols/_symboltable/BasicSymbolsSymbols2JsonTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/symbols/library/StreamTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/symbols/oosymbols/_symboltable/ModifierTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/symbols/oosymbols/_symboltable/OOSymbolsSymbols2JsonTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/MillTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/testsymtabmill/_symboltable/TestSymTabMillArtifactScope.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/testsymtabmill/_symboltable/TestSymTabMillGlobalScope.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/testsymtabmill/_symboltable/TestSymTabMillScope.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/testsymtabmill/_symboltable/TestSymTabMillScopesGenitor.java create mode 100644 monticore-grammar/src/test/java/de/monticore/testsymtabmill/testsymtabmill/_symboltable/TestSymTabMillScopesGenitorDelegator.java create mode 100644 monticore-grammar/src/test/java/de/monticore/typepersistence/TypePersistenceTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/AlwaysTheSameASTTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCBasicTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCCollectionTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCFullGenericTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCFunctionTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCGenericsTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCSimpleGenericsTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCTypeFacadeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/MCollectionTypesCorrectStateTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/TestGenerics.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/TestGenericsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/AbstractDeriveTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DefiningSymbolsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DefsTypeBasic.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeAbstractTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfAssignmentExpressionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfBitExpressionsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfCombineExpressions.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfCommonExpressionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfExpressionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfJavaClassExpressionsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfLambdaExpressionsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/DeriveSymTypeOfMCCommonLiteralsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/FlatExpressionScopeSetter.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/FullDeriveFromCombineExpressionsWithLiterals.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/FullDeriveFromCombineExpressionsWithLiteralsAbstract.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/FullSynthesizeFromCombineExpressionsWithLiterals.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SymTypeExpressionDeSerTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SymTypeExpressionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCArrayTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCBasicTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCCollectionTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCFullGenericTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCSimpleGenericTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/SynthesizeSymTypeFromMCcFunctionTypesTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/TypeCalculatorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/helpers/DefiningSymbolSetter4CommonExpressionsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/helpers/SubExprNameExtractionResultTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/check/helpers/SubExprNameExtractor4CommonExpressionsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCArrayTypesNodeIdentHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCBasicTypesHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCBasicTypesNodeIdentHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCCollectionTypesNodeIdentHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCFullGenericTypesNodeIdentHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCSimpleGenericTypesNodeIdentHelperTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/helper/MCType2SymTypeExpressionTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/mccollectiontypes/types3/util/MCCollectionSymTypeFactoryTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/mccollectiontypes/types3/util/MCCollectionTypeRelationsTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCArrayTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCBasicTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCCollectionTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCFullGenericTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCFunctionTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/MCSimpleGenericTypesPrettyPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/prettyprint/PrintTypeAstExtensionTests.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/printer/BasicTypesPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/printer/CollectionTypesPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/printer/FullGenericTypesPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types/printer/SimpleGenericTypesPrinterTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/AbstractTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/AbstractTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/AssignmentExpressionTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/BitExpressionsTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/CommonExpressionTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/CommonLiteralsTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/ExpressionBasisTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/LambdaExpressionsTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCArrayTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCBasicTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCCollectionTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCFullGenericTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCFunctionTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/MCSimpleGenericTypesTypeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/ResolveWithinOOTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/ResolveWithinTypeTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/SymTypeBoxingVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/SymTypeCompatibilityTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/SymTypeLeastUpperBoundTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/SymTypeNormalizeVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/SymTypeUnboxingVisitorTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/util/CombineExpressionsWithLiteralsTypeTraverserFactory.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/util/CombineExpressionsWithLiteralsTypeTraverserProvider.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/util/CombineExpressionsWithLiteralsTypeVisitor.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/util/DefsTypesForTests.java create mode 100644 monticore-grammar/src/test/java/de/monticore/types3/util/DefsVariablesForTests.java create mode 100644 monticore-grammar/src/test/java/de/monticore/umlmodifier/ModifierBuilderTest.java create mode 100644 monticore-grammar/src/test/java/de/monticore/umlmodifier/ModifierPrettyPrintTest.java create mode 100644 monticore-grammar/src/test/java/prettyprint/MCHexNumbersFullPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/prettyprint/MCHexNumbersPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/prettyprint/MCNumbersFullPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/prettyprint/MCNumbersPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/prettyprint/StringLiteralsFullPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/prettyprint/StringLiteralsPrettyPrinter.java create mode 100644 monticore-grammar/src/test/java/stringliterals/_prettyprint/StringLiteralsPrettyPrinter.java create mode 100644 monticore-grammar/src/test/resources/Automaton.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/Annotations.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/CombiningGrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/KeyAndNext.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/Keywords.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/LexicalsWithMode.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/Modes.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/NonTerminalsWithSameName.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/RuleWithSymbolReference.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/Statechart.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/SubStatechart.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/TestGrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/TypeReferences.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/WrongPackage.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/aggregation/models/FooModel.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/aggregation/models/blahmodel.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/common/TestLexicals.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/common/TestLiterals.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/common/TestTypes.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/SamePackage.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/TestFullyQualifiedGrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/TestFullyQualifiedGrammarSamePackage.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/TestQualifiedImportGrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/TestStarImportGrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0112/A0112.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0112/A0112a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0112/A0112b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0112/A0112c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0113/A0113.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0113/A0113a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0117/A0117.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0117/A0117a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0118/A0118.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0120/A0120.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0120/A0120b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0125/A0125.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0125/A0125a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0135/A0135.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0135/A0135a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0135/A0135b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0142/A0142.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0142/A0142a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0274/A0274Sub.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0274/A0274Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0275/A0275Sub.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0275/A0275Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0276/A0276.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0276/A0276a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0276/A0276b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0277/A0277.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0277/A0277a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0277/A0277b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0277/A0277c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0278/A0278e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0279/A0279.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0279/A0279a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0810/A0810a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0810/A0810b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A0810/A0810c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup1.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup2.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup3.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup4.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup5.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup6.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Sup7.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2007/A2007Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2008/A2008a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2008/A2008b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2008/A2008c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2025/A2025.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2026/A2026.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2030/A2030a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2030/A2030b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2030/A2030c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2030/A2030d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2030/A2030e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2031/A2031.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2102/A2102a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2102/A2102b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2102/A2102c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2102/A2102d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2103/A2103a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2103/A2103b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2106/A2106a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2106/A2106b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2106/A2106c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2106/A2106d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2107/A2107a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2107/A2107b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2116/A2116a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2116/A2116b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2116/A2116c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A2116/A2116d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4001/A4001.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4002/A4002.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4003/A4003.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4004/A4004.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4005/A4005.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4006/A4006.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4007/A4007.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4007/A4007a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4008/A4008.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4008/A4008a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4008/A4008b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4008/A4008c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4008/A4008d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4009/A4009e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4010/A4010.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4011/A4011a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4011/A4011b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4012/A4012a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4012/A4012b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4013/A4013.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4014/A4014.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4015/A4015.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4016/A4016.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4017/A4017.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4018/A4018.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4019/A4019.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4020/A4020.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4021/A4021.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4022/A4022.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4022/A4022b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4023/A4023.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4023/A4023b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4023/A4023c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_h.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4024/A4024_i.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_sub_g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4025/A4025_super_g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4026/A4026.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4026/A4026b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4027/A4027.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4028/A4028.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4029/A4029.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4030/A4030.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4031/A4031a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4031/A4031b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4031/A4031c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4031/A4031d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4031/A4031e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4032/A4032.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4033/a4033.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4035/A4035.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4035/A4035a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4035/A4035b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4036/I.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4037/A4037.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4038/A4038.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4039/A4039.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4041/A4041.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047h.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4047/A4047i.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4054/A4054.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4056/A4056.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4056/A4056a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4058/A4058.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4059/A4059a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4059/A4059b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4062/A4062a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4062/A4062b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4063/A4063.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4064/A4064.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4068/A4068.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4069/A4069Sub.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4069/A4069Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090h.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090i.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090j.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4090/A4090k.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4094/A4094.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4094/A4094Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4096/A4096g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4097/A4097a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4097/A4097b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4098/A4098.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4098/A4098Super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4099/A4099Symbol.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4100/A4100.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4101/A4101.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102c.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102d.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102e.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102f.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102g.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102h.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4102/A4102i.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4118/A4118.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4119/A4119.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4119/A4119a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4120/A4120.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4121/A4121a.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4121/A4121b.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4122/A4122.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4150/A4150.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4151/A4151.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4161/A4161.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/invalid/A4162/A4162.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ASTRules.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/Attributes.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/Component.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ConservativeExtensionSup.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ConservativeExtensionSuper.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/CorrectSymbolInheritance.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/Enum.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ExtendNTs.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ImplementInterfaceNTs.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/InterfaceWithoutImplementation.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/InterfaceWithoutImplementation2.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/InterfaceWithoutImplementation3.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/Overriding.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/Overriding2.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ProdAndExtendedProdUseSameAttrNameForDiffNTs.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ProdAndOverriddenProdUseSameAttrNameForDiffNTs_sub.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ProdAndOverriddenProdUseSameAttrNameForDiffNTs_super.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ProdExtendsNotExistingProd.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ReferencedSymbol.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ReplaceKeyword.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/ScopeRule.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/SubGrammarWithSymbol.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/SymbolAndScopeOverwriting.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/SymbolRules.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/cocos/valid/enum/Enum.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/grammar/pack/DifferentPackage.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/inherited/Subgrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/inherited/Subsubgrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/inherited/Supergrammar.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0802/A0802.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0803/A0803.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0803/A0803a.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0804/A0804.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0804/A0804a.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0808/A0808.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0809/A0809.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0811/A0811.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0812/A0812.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0812/A0812a.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0819/A0819.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0820/A0820.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0821/A0821.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/invalid/A0821/A0821a.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0802.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0803.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0804.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0808.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0809.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0819.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0820.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/A0821.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/javalight/cocos/valid/MethodDecl.java create mode 100644 monticore-grammar/src/test/resources/de/monticore/point.in.packagename/PackagePathTest.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonV1.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonV2.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonV3.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonWithInvs.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonWithInvsAndStartRule.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/AutomatonWithInvsComp.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/HierarchicalAutomaton.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/script/ScriptExample.mc4 create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Iterator.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Pair.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Pair2.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/PairA.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/PairB.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/PairC.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/PersonKey.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/PersonValue.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Personaz.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Persondemc.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Persondex.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Personjl.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/Personju.cesym create mode 100644 monticore-grammar/src/test/resources/de/monticore/types/check/String.cesym create mode 100644 monticore-grammar/src/test/resources/logback.groovy create mode 100644 monticore-runtime/build.gradle create mode 100644 monticore-runtime/src/main/java/de/monticore/AmbiguityException.java create mode 100644 monticore-runtime/src/main/java/de/monticore/MontiCoreConstants.java create mode 100644 monticore-runtime/src/main/java/de/monticore/antlr4/MCConcreteParser.java create mode 100644 monticore-runtime/src/main/java/de/monticore/antlr4/MCErrorListener.java create mode 100644 monticore-runtime/src/main/java/de/monticore/antlr4/MCLexer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/antlr4/MCParser.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/ASTCNode.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/ASTNode.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/ASTNodeBuilder.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/Comment.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/CommentBuilder.java create mode 100644 monticore-runtime/src/main/java/de/monticore/ast/CompareNotSupportedException.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/GeneratorEngine.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/GeneratorSetup.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/CodeHookPoint.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/GlobalExtensionManagement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/HookPoint.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/ObjectFactory.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/StringHookPoint.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/TemplateController.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/TemplateHookPoint.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/TemplateStringHookPoint.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/FreeMarkerTemplateEngine.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/MontiCoreFileTemplateLoader.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/MontiCoreFreeMarkerException.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/MontiCoreTemplateExceptionHandler.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/MontiCoreTemplateLoader.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/SimpleHashFactory.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/AddToGlobalVarAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/Alias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/BindHookPointAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/ChangeGlobalVarAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/DebugAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/DefineGlobalVarAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/DefineHookPointAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/DefineHookPointWithDefault3Alias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/DefineHookPointWithDefaultAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/ErrorAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/ExistsHookPointAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/GetGlobalVarAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/GlexAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/Include2Alias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/IncludeAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/IncludeArgsAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/InfoAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/RequiredGlobalVarAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/RequiredGlobalVarsAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/SignatureAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/SimpleGlexAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/SimpleTcAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/TcAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/TraceAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/freemarker/alias/WarnAlias.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/Reporting.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/ArtifactReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/ReportingNameHelper.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/formatter/AFormatter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/formatter/GMLFormatter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/formatter/GVFormatter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/APkg.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/Element.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/ElementFactory.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/ElementType.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/Pkg.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/artifacts/model/RootPkg.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/AReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ASTNodeIdentHelper.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/DefaultReportEventHandler.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/IASTNodeIdentHelper.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/IReportEventHandler.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/Layouter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/MapUtil.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ObjectCountVisitor.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ReportCreator.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ReportManager.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ReportingConstants.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ReportingHelper.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/ReportingRepository.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/StatisticsHandler.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/commons/TreePrintVisitor.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/ArtifactGVReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/ArtifactGmlReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/DetailedReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/GeneratedFilesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/HandWrittenCodeReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/HookPointReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/IncGenGradleReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/IncGenReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/InputOutputFilesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/InstantiationsReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/InvolvedFilesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/NodeTreeDecoratedReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/NodeTreeReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/NodeTypesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/StatisticsReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/SuccessfulReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/SummaryReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/TemplateTreeReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/TemplatesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/TransformationReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/generating/templateengine/reporting/reporter/VariablesReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/io/FileReaderWriter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/io/MontiCoreClassLoader.java create mode 100644 monticore-runtime/src/main/java/de/monticore/io/paths/GlobExpressionEvaluator.java create mode 100644 monticore-runtime/src/main/java/de/monticore/io/paths/MCPath.java create mode 100644 monticore-runtime/src/main/java/de/monticore/parser/Placeholder.java create mode 100644 monticore-runtime/src/main/java/de/monticore/prettyprint/AstPrettyPrinter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/prettyprint/CommentPrettyPrinter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/prettyprint/IndentPrinter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/IArtifactScope.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/IGlobalScope.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/IScope.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/IScopeSpanningSymbol.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/ISymbol.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/ISymbolPredicate.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/ImportStatement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/SymbolWithScopeOfUnknownKind.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/SymbolWithScopeOfUnknownKindBuilder.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/SymbolWithScopeOfUnknownKindDeSer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/Symboltable/index.html create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/AccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/BasicAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/CompoundAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/IncludesAccessModifierSymbolPredicate.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/Modifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/NoAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/ReadableAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/StaticAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/modifiers/WritableAccessModifier.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/resolving/ISymbolAdapter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/resolving/ResolvedSeveralEntriesForSymbolException.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/IDeSer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/ISymbolDeSer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonDeSers.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonLexer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonParser.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonPrinter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonToken.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/JsonTokenKind.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/NumberLexer.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonArray.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonBoolean.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonElement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonElementFactory.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonNull.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonNumber.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonObject.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/JsonString.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/TraceableJsonObject.java create mode 100644 monticore-runtime/src/main/java/de/monticore/symboltable/serialization/json/UserJsonString.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IAttributeNegation.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IAttributeOptional.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IAttributePattern.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IAttributeReplacement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IList.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/INegation.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IOptional.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IPattern.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IReplacement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/IReplacementOperator.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/ITFAttribute.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/ITFElement.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/ast/ITFObject.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/rule2od/Variable2AttributeMap.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/ODRule.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/SuccessfulReporter.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/ValueComparator.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/matching/ModelTraversal.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/matching/ModelTraversalFactory.java create mode 100644 monticore-runtime/src/main/java/de/monticore/tf/runtime/matching/ModelTraversalVisitor.java create mode 100644 monticore-runtime/src/main/java/de/monticore/utils/Link.java create mode 100644 monticore-runtime/src/main/java/de/monticore/visitor/IHandler.java create mode 100644 monticore-runtime/src/main/java/de/monticore/visitor/ITraverser.java create mode 100644 monticore-runtime/src/main/java/de/monticore/visitor/IVisitor.java create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/CheckConditions.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/CheckConstraints.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/CheckSubConstraints.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/ClassMatch.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/ClassMatchList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/ConstantCode.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/Constructor.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/DoPatternMatching.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/DoPatternMatchingList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/DoPatternMatchingOptional.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/DoReplacement.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/FindActualCandidates.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/FindCandidates.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/FindSearchPlan.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/HostGraphElementGetters.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/MatchStates.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/ParameterSetters.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/SplitSearchplan.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/TransformationClass.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/TransformationUnit.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/UndoReplacement.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/constantcode/HandleChangeObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/constantcode/HandleDeleteObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/constantcode/HandleMatchObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/dopatternmatching/HandleListObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/dopatternmatching/HandleNormalObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/dopatternmatching/HandleNotObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/dopatternmatching/HandleOptObject.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/ChangeAttributeValueList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/ChangeAttributeValueSingleCompositeInList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/ChangeAttributeValueSingleCompositeNotInList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/ChangeAttributeValueSinglePrimitive.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/ChangeAttributeValues.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/doreplacement/CreateObjects.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/undoreplacement/ChangeAttributeValueList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/undoreplacement/ChangeAttributeValueSingleCompositeInList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/undoreplacement/ChangeAttributeValueSingleCompositeNotInList.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/undoreplacement/ChangeAttributeValueSinglePrimitive.ftl create mode 100644 monticore-runtime/src/main/resources/de/monticore/tf/odrules/undoreplacement/ChangeAttributeValues.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/ast/ASTCNodeMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/ast/ASTNodeMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/ast/CommentBuilderTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/cocos/helper/Assert.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/GeneratorEngineMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/GeneratorEngineTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/CodeHookPointMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/DefaultImpl.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/FreeMarkerTemplateEngineMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/FreeMarkerTemplateMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/GeneratorSetupMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/GlobalExtensionManagementGlobalVarsTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/IDefaultImpl.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/ObjectFactoryTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateAliasingTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateControllerHookPointsTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateControllerMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateControllerSignatureUsageTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateControllerTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TemplateLoggerTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/TestConstants.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/reporting/commons/ReportingStringHelperTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/reporting/commons/StatisticsHandlerTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/A.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/ArgumentsAreOnlyVisibleInIncludedTemplate.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/B.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/C.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/DefaultMethodCall.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/GlobalListVars.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/GlobalVars.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/HelloWorld.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/HookCall.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/HowAreYou.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/Log.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/NestedSignatureCalls.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/ParameterizedInclusionUsage.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/PrintNameIfExists.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/SignatureWithManyParameters.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/SignatureWithOneParameter.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/SignatureWithThreeParameters.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/TestVariables4.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/TopA.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/TopStringHook.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/TopTemplateHook.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/AddToGlobalVarAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/BindHookPointAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/ChangeGlobalVarAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/DefineGlobalVarAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/DefineHookPointAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/DefineHookPointWithDefaultAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/ExistsHookPointAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/GetGlobalVarAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/GlobalListVarsAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/Include2Alias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/IncludeAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/IncludeArgsAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/IncludeArgsAndSignatureAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/IncludeDispatching.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/LogAliases.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/Plain.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/RequiredGlobalVarAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/RequiredGlobalVarsAlias.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/SignatureAliasWithThreeParameters.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templateengine/templates/aliases/WithAst.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/ClassProd.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/First.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/GrammarTest.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/InterfaceProd.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/MainClassProd.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/MainGrammar.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/MainInterfaceProd.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/generating/templates/MainTest.ftl create mode 100644 monticore-runtime/src/test/java/de/monticore/io/FileFinderTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/io/FileReaderWriterMock.java create mode 100644 monticore-runtime/src/test/java/de/monticore/io/FileReaderWriterTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/io/paths/MCPathTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/symboltable/serialization/JsonLexerTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/symboltable/serialization/JsonParserTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/symboltable/serialization/JsonPrinterSecurityTest.java create mode 100644 monticore-runtime/src/test/java/de/monticore/symboltable/serialization/JsonPrinterTest.java create mode 100644 monticore-runtime/src/test/models/de/monticore/io/Model1.cdsym create mode 100644 monticore-runtime/src/test/models/de/monticore/io/Model2.cd4 create mode 100644 monticore-runtime/src/test/models/de/monticore/io/Model2.mc4 create mode 100644 monticore-runtime/src/test/resources/de/monticore/io/Model1.cdsym create mode 100644 monticore-runtime/src/test/resources/de/monticore/io/Model1.dsym create mode 100644 monticore-runtime/src/test/resources/de/monticore/io/Model1.sdsym create mode 100644 monticore-runtime/src/test/resources/de/monticore/io/Model3.mc4 create mode 100644 monticore-runtime/src/test/resources/de/monticore/parsing/SimpleStateChart.mc4 create mode 100644 monticore-runtime/src/test/resources/de/monticore/parsing/Statechart.mc4 create mode 100644 monticore-runtime/src/test/resources/de/monticore/symboltable/languagecomposition/embedding/Entity.cla create mode 100644 monticore-runtime/src/test/resources/de/monticore/symboltable/languagecomposition/family/Cla.cla create mode 100644 monticore-runtime/src/test/resources/de/monticore/symboltable/languagecomposition/family/Sc.sc create mode 100644 monticore-runtime/src/test/resources/hwc/test/A.java create mode 100644 monticore-runtime/src/test/resources/jar/Test.jar create mode 100644 monticore-runtime/src/test/resources/logback.groovy create mode 100644 monticore-runtime/src/test/resources/modelloader/modeljar.jar create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/A.cla create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/B.cla create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/B.dex create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/B.ext create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/D.cla create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath/models/E.cla create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath2/models/A.sc create mode 100644 monticore-runtime/src/test/resources/modelloader/modelpath2/models/D.cla create mode 100644 monticore-runtime/src/test/resources/modelpathtest/path1/ambiguousfile.txt create mode 100644 monticore-runtime/src/test/resources/modelpathtest/path1/unambiguousfile.txt create mode 100644 monticore-runtime/src/test/resources/modelpathtest/path2/ambiguousfile.txt create mode 100644 monticore-runtime/src/test/resources/paths/1/AFile.ftl create mode 100644 monticore-runtime/src/test/resources/paths/1/AFile.txt create mode 100644 monticore-runtime/src/test/resources/paths/1/a/AFile.ftl create mode 100644 monticore-runtime/src/test/resources/paths/1/a/AFile.txt create mode 100644 monticore-runtime/src/test/resources/paths/2/a/AFile.ftl create mode 100644 monticore-runtime/src/test/resources/paths/2/a/AFile.txt create mode 100644 overrides/main.html create mode 100644 scripts/ftlAnalysis.sh create mode 100644 scripts/preprocessing.sh create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 stylesheets/extra.css diff --git a/00.org/Explanations/CHANGELOG/index.html b/00.org/Explanations/CHANGELOG/index.html new file mode 100644 index 0000000000..3694773081 --- /dev/null +++ b/00.org/Explanations/CHANGELOG/index.html @@ -0,0 +1,1833 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Changelog - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

Release Notes

+

MontiCore 7.5.0

+

released: 02.05.2023

+

Additions

+
    +
  • type dispatcher for type-safe instance checks and casting
  • +
  • pretty-printer generator
  • +
  • parser generator produces code for the new rule "replcaekeyword"
  • +
  • new coco NoForbiddenProdName
  • +
  • TOP mechanism for generated ANTLr parser classes
  • +
  • add class StreamType which can be used to add Stream symbol with corresponding functions to the global scope
  • +
  • Additions to AccessModifiers
  • +
  • add class StaticAccessModifier to filter whether a symbol is considered as static or not.
  • +
  • add class WriteableAccessModifier to filter whether a symbol is considered as writable or not.
  • +
  • add class CompoundAccessModifier to compose multiple access modifier, e.g. public + static
  • +
  • Additions to the TypeCheck
  • +
  • add new class TypeRelations to provide typecheck methods in a non static fashion. The TypeCheck class now delegates to the implementation
  • +
  • add new class SymTypeOfUnion to store the type of a union of types
  • +
  • add new class SymTypeOfIntersection to store the type of an intersection of types
  • +
  • add new interface ISymTypeVisitor to traverse SymTypeExpressions
  • +
  • add new class SymTypeDeepCloneVisitor to clone SymTypeExpressions
  • +
  • add new class SymTypeBoxingVisitor to box SymTypeExpressions. This implemenation fixes issues over the methods within the SymTypeExpression classes
  • +
  • add new class SymTypeUnboxingVisitor to unbox SymTypeExpressions. This implemenation fixes issues over the methods within the SymTypeExpression classes
  • +
  • add new class SymTypeNormalizeVisitor to normalize SymTypeExpressions. This is required to check for compatibility between SymTypeExpressions, especially regarding union and intersection types
  • +
+

Changes

+
    +
  • Gradle projects containing multiple MCTasks can now use parallel builds
  • +
  • The MontiCore Gradle Plugin ensures that MCTasks are not run in parallel, other tasks, like compile, are run in parallel
  • +
+

Fixes

+
    +
  • parser generation for optional keywords with usage name
  • +
  • Overriding/Imlementing use of lexical productions
  • +
  • in OOScopes, accessmodifier can be used to filter symbols
  • +
+

MontiCore 7.4.0

+

released: 14.11.2022

+

Additions

+
    +
  • new grammar rule replacekeyword
  • +
  • add attribute derived to FieldSymbol
  • +
  • generate XParserInfo
  • +
  • Used by generated language servers
  • +
  • Can be queried for additional info about specific parser states of the generated ANTLR parser
  • +
  • Contains methods stateHasUsageNameY to check the usage name of the nonterminal associated with a parser state
  • +
  • Contains methods stateReferencesZSymbol to check the referenced symbol kind of Name nonterminal associated with a parser state
  • +
  • Additions to the TypeCheck
  • +
  • add new abstract classes AbstractDerive and AbstractSynthesize with basic functionality for FullDerivers and FullSynthesizers
  • +
  • add new class TypeCalculator that can be used to derive SymTypeExpressions from Expressions and synthesize them from types
  • +
  • add SymTypeObscure: new SymTypeExpression that is used when the SymTypeExpression for an expression could not be derived
  • +
  • add SymTypeFunction to store the type of a function
  • +
  • add the functionality for Function chaining, allowing to call functions returned by other functions
  • +
  • add varargs support for CallExpressions
  • +
  • add deriver for LambdaExpressions
  • +
  • Add grammar MCFunctionTypes to write the type of a function in a model
  • +
  • Add ExpressionStatementIsValid CoCo
  • +
  • Add grammars LambdaExpressions and StreamExpressions
  • +
+

Changes

+
    +
  • Java 11
  • +
  • Gradle 7 compatibility
  • +
  • delete deprecated method deepClone in ASTNodes
  • +
  • use CDGenerator (cdanalysis)
  • +
  • Visitor Pattern: Introduce state-based traversal of symbol table
  • +
  • Allows for combined AST and symbol table traversal from global and artifact scopes
  • +
  • Comes with integrated stand-alone symbol table traversal
  • +
  • TypeCheck Refactoring
  • +
  • rename currentResult to result in TypeCheckResult
  • +
  • split TypeCheck facade into TypeCalculator (used to derive SymTypeExpressions from Expressions and synthesize them from types) and TypeCheck (static functions that are useful when checking for type compatibility or for comparing SymTypeExpressions)
  • +
  • rename SymTypeConstant to SymTypePrimitive
  • +
  • Deriver now evaluate all subexpressions of an expression and do not stop at the first error
  • +
  • do not log multiple errors for the same error: If an error occurs in the derivation of a subexpression and this error leads to another error in the derivation of the expression itself, do not log another error
  • +
  • remove the name of CallExpression
  • +
  • rework the calculation of CallExpression, NameExpression and FieldAccessExpression
  • +
  • rework TypeCheck error messages to make them more clear
  • +
+

Fixes

+
    +
  • close all jars used to load models via MCPath
  • +
  • gradle clean should no longer fail because of dangling opened grammar jars
  • +
  • TypeCheck
  • +
  • fix an error in the WildCardTypeArgument where ? super and ? extends were swapped
  • +
  • fix TypeCheck not logging an error for NameExpression and FieldAccessExpression in isolation
  • +
  • make short compatible to byte
  • +
+

MontiCore 7.3.0

+

released: 04.04.2022

+

Additions

+
    +
  • add cocos for lexical mode
  • +
  • add coco for Expression
  • +
  • add cocos for JavaLight
  • +
  • new methods putSymbolDeSer, putXYSymbolDeSer and loadFileForModelNamed (GlobalScope Interface)
  • +
  • new method getToken (MCParser)
  • +
  • use CD4C in 02experiment.configTemplate
  • +
+

Changes

+
    +
  • rename generated classes XYCLI -> XYTool
  • +
+

MontiCore 7.2.0

+

released: 13.09.2021

+

Changes

+
    +
  • Several modes can now be specified in a grammar (for further +explanations see ANTLR). For the grammars, one +file is now generated for lexer rules and one for the parser rules.
  • +
  • delete deprecated classes: + ModelPath, IterablePath, ModelCoordinate, ModelCoordinateImpl, ModelCoordinates, and FileFinder
  • +
  • The symbol table now stores for productions whether a + production is left-recursive.
  • +
  • In the log class the dependency to ch.qos.logback:logback-core was removed
  • +
+

MontiCore 7.1.0

+

released: 05.07.2021

+

Additions

+
    +
  • introduced language-specific CLI generation
  • +
  • New class MCPath that manages a set of path entries. The class is used, e.g., for realizing symbol paths, model paths, handcoded paths, and template paths. MCPath replaces the classes IterablePath and ModelPath.
  • +
  • Different modes can now be defined for lexical tokens in grammar. + The corresponding generator will only be available in the next version.
  • +
+

Changes

+
    +
  • the methods serialize and deserialize of the class XDeSer were moved to the class XSymbols2Json
  • +
  • The following classes are marked as deprecated and will be removed in the near future: +ModelPath, IterablePath, ModelCoordinate, ModelCoordinateImpl, ModelCoordinates, and FileFinder
  • +
+

Fixes

+

MontiCore 7.0.0

+

released: 08.04.2021

+

Additions

+
    +
  • resolveXSubKinds(..) resolves for local symbols of all subkinds of a symbol kind X. This method is used + by the implementation of the resolveXLocally(..) method. It enables proper handling of symbol kind hierarchies + during symbol resolution beyond the borders of a language.
  • +
  • new annotation @NonConservative for productions
  • +
  • add configTemplate (-cf) mechanism to add a freemarker template for customizing the generation processed
  • +
  • add two predefined groovy hook points (-gh1 and -gh2) in the monticore_standard.groovy for injecting + custom groovy scripts into the workflow
  • +
+

Changes

+
    +
  • move grammars OCLExpressions and SetExpressions into OCL-project for further development
  • +
  • DefsTypeBasic was moved to test. There are now only methods for creating symbols. + Use the BasicSymbolsMill to create the basic data types like int, ...
  • +
  • deserialize(String) method of scope DeSer classes is realized as default implementation in IDeSer interface
  • +
  • deserialize(String) method of symbol DeSer classes is realized as default implementation in ISymbolDeSer interface
  • +
  • deserializeAddons() and serializeAddons() methods of scopes are realized as empty default implementation in IDeSer interface
  • +
  • If deserialization encounters a symbol kind for which no DeSer is contained in the symbol Deser map in global scopes, a warning is produced instead of an error
  • +
  • Boolean isShadowing property of scopes is only serialized if its value is "true". Deserialization assumes a default value of "false" if the property is not contained in a serialized scope
  • +
  • deserialize(String) method of symbol DeSers do not produce errors if the serialized kind deviates from the symbol kind that the DeSer is originally engineered for
  • +
  • The TypeCheck was reworked
  • +
  • The interface ITypesCalculator was renamed to IDerive and can now be used similar to the ISynthesize interface
  • +
  • no SymbolSurrogates are created anymore by the TypeCheck. The Synthesize-Classes will now log an error if a type cannot be resolved
  • +
  • SymTypeExpressions now have the method printFullName to print their full name
  • +
  • The class TypeCheck now needs one IDerive and one ISynthesize for its constructor instead of only one of them
  • +
  • The class DeriveSymTypeOfBSCommonExpressions, which does not pay attention to modifiers like static or private, can now be used as an alternative for the class DeriveSymTypeOfCommonExpressions
  • +
+

Fixes

+
    +
  • Symbols with hierarchical symbol kinds are not serialized multiple times anymore.
  • +
+

MontiCore 6.7.0

+

released: 26.01.2021

+

Additions

+
    +
  • Add new CLI for the MontiCore generator engine
  • +
+

Changes

+
    +
  • The context conditions use the new traverser infrastructure. This leads to small changes in the api. + The return value of the method addCoCo is void.
  • +
  • Attribute fileExt in GlobalScopes now refers to a regular expression for file extensions of + symbol table files. The default value of the attribute is "*sym", which usually includes symbol + files of all MontiCore languages. Attention: If your language used the "setFileExt" method in + previous versions of MontiCore to set the file extension of the model file (e.g., to "aut"), this + will cause problems now as the symbol files of the language have differen file extensions + (e.g., "autsym). To fix this, it is sufficient to remove all invocations of "setFileExt" from the + handwritten source code.
  • +
  • For scopes, artifact scopes, and global scopes: Moved abstract methods that do not have a language- + specific name or (argument, return) type from language-specific interface to MontiCore-runtime interfaces
  • +
  • new experiment "strules" demonstrating the use of symbolrules and scoperules
  • +
  • deserialize methods in SymTypeExpressionDeSers do not have an enclosingScope argument anymore. + Internally, it uses the singleton global scope instead.
  • +
  • renamed serializeAdditionalSSymbolAttributes in Symbols2Json class to serializeAddons and moved + to scope and symbol DeSers.
  • +
  • XScopeDeSer is renamed to XDeSer
  • +
  • In Symbols2Json classes:
  • +
  • now implementss Visitor2
  • +
  • new attribute "XTraverser traverser" with getter and setter
  • +
  • Removed attribute "realThis" with getter and setter
  • +
  • New constructor with two arguments XTraverser and JsonPrinter
  • +
  • New zero args constructor
  • +
  • Removed constructor with single JsonPrinter argument
  • +
  • New attributes of all known symbol DeSers and current scope DeSers
  • +
  • New method "protected void init()", initializing the DeSer attributes with the GlobalScope + and the traverser with symbols2json of inherited languages
  • +
  • adjusted store method to use traverser
  • +
  • visit methods for symbols delegate to serialize method of the symbol DeSer
  • +
  • visit and endVisit methods for scope interface and artifact scope interface print object stub + and delegate serialization to scope DeSers
  • +
  • DeSers do not have an attribute of Symbols2Json class anymore, instead it is passed as argument + in the serialize methods
  • +
  • Default values of built-in types that occur in attributes of symbolrules or scoperules are + omitted during serialization and deserialization. The defaults are as follows:
  • +
  • Boolean : false
  • +
  • String : ""
  • +
  • Numeric types: 0 (and 0L and 0.0 and 0.0f)
  • +
  • For symbolrule and scoperule attributes with non-built-in data type, no Log.error is thrown + at execution time of the serialize method call anymore. Instead, these methods (and then, their + classes as well) are generated abstract to yield compilation errors instead.
  • +
  • New interface IDeSer that all symbol and scope DeSers implement.
  • +
  • GlobalScopes manage a map with all relevant DeSers. The map maps the serialized (symbol or scope) + kind to the DeSer that (de)serialized this kind. This mechanism can be used to exchange the DeSer + for a specific kind of symbol or scope.
  • +
  • Scope DeSers have new serialize methods without Symbols2Json argment that can be used for + for serializing (artifact) scopes for, e.g., unit tests
  • +
  • removed the generation of XPhasedSymbolTableCreatorDelegator classes
  • +
  • Experiments now use ScopesGenitor-infrastructure instead of SymbolTableCreator-infrastructure
  • +
+

Fixes

+
    +
  • +

    The initMe and reset methods of the mill now initialize and reset all attributes properly

    +
  • +
  • +

    The CD4Analysis keywords ordered, composition, association, targetimport and classdiagram + can be used in grammars again

    +
  • +
+

MontiCore 6.6.0

+

released: 03.12.2020

+

Additions

+
    +
  • The mill of a language now provides a method parser() to get the parser of the language
      +
    • mill initialization allows to reconfigure the mill to provide a parser for a sublanguage
    • +
    • parser delegator XForYParser are generated that extend a parser of a super language and delegate to the parser of the current language
    • +
    • Due to multiple inheritance, delegation and subclasses are used in combination
    • +
    +
  • +
  • experiments now showcase the use of traversers
  • +
  • add coco (checks if additional attributes are declared twice)
  • +
  • added built-in primitive types to the mills of grammars that extend the grammar BasicSymbols. Add to Mill by executing BasicSymbolsMill.initializePrimitives()
  • +
+

Changes

+
    +
  • The generated parser uses the builder instead of the factory. This means that in grammars the variable _aNode is no longer available. Use instead _builder.
  • +
  • Multiple renamings and signature changes regarding the deser infrastructure
  • +
  • renamed XSymbolTablePrinter to XSymbols2Json
  • +
  • moved load and store methods form XScopeDeSer to XSymbols2Json
  • +
  • removed enclosing scope as method argument of symbol deser methods, as global scope shall be used instead
  • +
  • renamed deserializeAdditionalSSymbolAttributes to deserializeAddons
  • +
  • renamed deserializeAdditionalXScopeAttributes and deserializeAdditionalXScopeAttributes to deserializeAddons
  • +
  • added the JSON printer as a parameter to the methods of XScopeDeSer, SSymbolDeSer und XSymbols2Json
  • +
  • XScopeDeSer, SSymbolDeSer und XSymbols2Json are no longer available via the mill. The constructors can be used instead.
  • +
  • Scope builder have been removed as they did not support multiple inheritance, scope creation methods of the mill should be used instead
  • +
  • Shortened the name of the scope creation methods in the mill from xScope, xGlobalScope and xArtifactScope to scope, globalScope and artifactScope
  • +
  • Shortened the name of the modelFileExtension attribute in the XGlobalScope class to fileExt
  • +
  • renamed XScopeSkeletonCreator and XScopeSkeletonCreatorDelegator to XScopesGenitor and XScopesGenitorDelegator
  • +
  • Deprecated the XPhasedSymbolTableCreatorDelegator, will be removed without replacement in a future release
  • +
  • PrettyPrinters and other visitors in monticore-grammar now use the new Traverser infrastructure instead of the old Visitor infrastructure
  • +
  • generated XScopeGenitor and XScopeGenitorDelegator now use the new Traverser infrastructure instead of the old Visitor infrastructure
  • +
  • Changes to resolving
  • +
  • if name of a topLevelSymbol in ArtifactScope = name of ArtifactScope: qualify symbols in spanned scopes of the topLevelSymbol like before with <topLevelSymbolName>.<symbolName>
  • +
  • if name of a topLevelSymbol in ArtifactScope != name of ArtifactScope: qualify symbols in spanned scope of the topLevelSymbol with <ArtifactScopeName>.<topLevelSymbolName>.<symbolName>
  • +
  • Traverser now support lists of Visitor2 interfaces instead of only one instance
  • +
  • Rename accessor of Traverser from addXVisitor to add4X
  • +
  • Methods returning referenced symbols save the symbols instead of the surroogates
  • +
+

Fixes

+
    +
  • Traverser now properly delegate to handlers as intended
  • +
  • ScopeSkeletonCreator now properly use the mill to create scope instances to ensure substitution via the mill pattern
  • +
  • Fixed a bug where the SymbolSurrogates wrongly qualified their fullName
  • +
  • The clear method of the GlobalScope now deletes all symbols stored in the GlobalScope
  • +
  • Serializing symbolrule attributes of Strings now works properly
  • +
+

MontiCore 6.6.0

+

released: 11.11.2020

+

Additions

+
    +
  • added an experiment hwDeSers showcasing serialization and deserialization
  • +
  • added an experiment hooks showcasing hook point usage
  • +
  • IncCheck provided by the MontiCore Gradle Plugin now considers local super grammar changes to trigger new generation
  • +
  • Added new Traverser generation to replace the visitor infrastructure in a future release
      +
    • XTraverser
    • +
    • XTraverserImplementation
    • +
    • XVisitor2
    • +
    • XHandler
    • +
    +
  • +
  • Added new ScopeSkeletonCreator generation to replace the SymbolTableCreator in a future release and to enable a phased symboltable creation
      +
    • XScopeSkeletonCreator
    • +
    • XScopeSkeletonCreatorDelegator
    • +
    • XPhasedSymbolTableCreatorDelegator
    • +
    +
  • +
  • Added methods to directly obtain instances of the following classes in the mill (instead of their builders)
      +
    • XSymbolTableCreator
    • +
    • XSymbolTableCreatorDelegator
    • +
    • XScopeSkeletonCreator
    • +
    • XScopeSkeletonCreatorDelegator
    • +
    • XPhasedSymbolTableCreatorDelegator
    • +
    • XScopeDeSer
    • +
    • XSymbolDeSer
    • +
    • XSymbolTablePrinter
    • +
    • IXScope
    • +
    • IXArtifactScope
    • +
    +
  • +
+

Changes

+
    +
  • MontiCore now uses Gradle as build tool
  • +
  • some tasks have been introduced for the comfortable control of frequent activities, e.g., buildMC, assembleMC that can be found in the build.gradle
  • +
  • relocated the EMF related subprojects:
      +
    • monticore-emf-grammar to monticore-grammar-emf
    • +
    • monticore-emf-runtime to monticore-runtime-emf
    • +
    +
  • +
  • relocated integration tests and experiments:
      +
    • monticore-generator/it to monticore-test/it
    • +
    • monticore-generator/it/experiments to monticore-test/01.experiments
    • +
    • monticore-generator/it/02.experiments to monticore-test/02.experiments
    • +
    • monticore-grammar/monticore-grammar-it to monticore-test/monticore-grammar-it
    • +
    +
  • +
  • Remove the generation of XModelloader. Languages should now use XScopeDeSer to load symbol tables instead.
  • +
  • Removed the generation of the following builder classes (also from the Mill; alternative solutions described below)
      +
    • XSymbolTableCreatorBuilder
    • +
    • XSymbolTableCreatorDelegatorBuilder
    • +
    • XScopeDeSerBuilder
    • +
    • XSymbolDeSerBuilder
    • +
    • XSymbolTablePrinterBuilder
    • +
    +
  • +
  • renamed IXResolvingDelegate to IXResolver
  • +
  • outsourced Type expressions for arrays to a separate grammar
  • +
  • was FullGenericTypes, is now MCArrayTypes
  • +
  • outsourced initialization for arrays to a separate grammar
  • +
  • was MCVarDeclarationStatements, is now MCArrayStatements
  • +
  • In a composed language, mills of super languages now provide scope instances (scope, global scope and artifact scope) for the composed language
  • +
  • non-existing template paths now result in an error instead of a warning
  • +
  • Set current visitor infrastructure to deprecated
  • +
  • Integrate new visitor infrastructure (i.e., traverser) into XMill to enable re-usability of visitors via language inheritance
  • +
  • Set SymbolTableCreator, SymbolTableCreatorDelegator and their builder to deprecated
  • +
  • Integrate new ScopeSkeletonCreator, ScopeSkeletonCreatorDelegator and PhasedSymbolTableCreatorDelegator into Mill
  • +
  • Added a method clear to the GlobalScope that clears its cache and its resolvers and empties its ModelPath
  • +
+

Fixes

+
    +
  • Fixed that global variable changes in child templates were not changed in parents
  • +
  • Fixed handling of optional names of symbols in symbol table creator
  • +
  • Fixed an issue where surrogates hide symbol attributes
  • +
+

MontiCore 6.4.0

+

released: 12.10.2020

+

Additions

+
    +
  • extended the generated incCheck files to contain information about local super grammars
      +
    • the sh-file is now able to trigger generation if local super grammars are changed
    • +
    • the incCheck method provided by the plugin will support this behavior as well
    • +
    • will only be available in the next release
    • +
    +
  • +
  • extended the mill to manage the global scope instance centrally
  • +
  • added comfort methods for creating modifiers to the ModifierBuilder
      +
    • ModifierBuilder().PUBLIC() short for ModifierBuilder().setPublic(true)
    • +
    +
  • +
  • added MCShadowingJavaBlock to MCCommonStatements
      +
    • standard MCJavaBlock is no longer shadowing
    • +
    +
  • +
  • added a class diagram to the reports that represents the generated data structure for the given grammar + (ast, symbol table visitors, etc.)
  • +
  • added simple BreakStatement to MCCommonStatements
  • +
  • added an include2 alias for the template controller method for including templates in conjunction with templates arguments
  • +
+

Changes

+
    +
  • CLI does no longer check whether a generation is needed (this should be handled by the build tool)
  • +
  • rephrased messages for non-conservative extension (added super grammar name)
  • +
  • added a context condition to prevent list of names in nonterminal production marked as symbols
  • +
  • might be supported in a future version of MontiCore
  • +
  • moved XForYMills to a subpackage to reduce noise (subpackage: _auxiliary)
  • +
  • deprecated the generated enum für constants
      +
    • will be removed without replacement in a future release
    • +
    +
  • +
  • moved EnhancedForControl production from JavaLight to MCCommonStatements as it is commonly used
  • +
  • standard MCJavaBlock is no longer shadowing
  • +
  • renamed BreakStatement in MCLowLevelStatements to LabelledBreakStatement
  • +
  • ForStatement now spans a non-exporting, ordered scope
  • +
  • shortened generated error codes to have 5 digits only
  • +
  • renamed MethOrConstr to JavaMethod in JavaLight
  • +
  • MontiCore Gradle plugin is no longer shipped as a fat jar
  • +
+

Fixes

+
    +
  • Fixed error code calculation for generated error messages to no longer be random
  • +
  • Fixed the report for involved files to contain handwritten files that were considered
      +
    • will only be available in the next release
    • +
    +
  • +
  • Fixed an issue where reports did not contain meaningful names for elements such as class diagram classes or interfaces
  • +
+

MontiCore 6.3.0

+

released: 16.09.2020

+

Additions

+
    +
  • added @Override annotation for nonterminal production to state that this production overrides a super grammars' production
  • +
  • overriding without annotation leads to a warning
  • +
  • using the annotation for a production that does not override an existing nonterminal results in an error
  • +
  • added a context condition to ensure that external production do not have ast rules
  • +
  • added DiagramSymbol in BasicSymbols
  • +
  • introduced generated interfaces for GlobalScope and ArtifactScope
  • +
+

Changes

+
    +
  • serialization of symtype expression now serializes full name of symtype instead of simple name
  • +
  • class ASTNodes is now deprecated and its usages in the generator are removed
  • +
  • visitors no longer provide visit methods for concrete scope classes but their interfaces instead
  • +
  • SymTypeExpression no longer use surrogates but TypeSymbols instead
  • +
  • reverted changes to appended s for list attributes made in previous release
  • +
  • moved initialization of symbols to the endVisit method of the SymbolTableCreator
  • +
+

Fixes

+
    +
  • Fixed missing sourcecode position for overriding warning
  • +
  • Fixed an issue where the inheritance hierarchy was no considered correctly when overriding a nonterminal
  • +
+

MontiCore 6.2.0

+

released: 21.07.2020

+

Additions

+
    +
  • added isFinal to OOType in OOSymbols
  • +
  • extended the mill such that builder for DeSer related classes are provided by the mill
  • +
  • added support for symbol usages in NonterminalSeperator
      +
    • example: Bar = (bla:Name@Foo || "," )+;
    • +
    +
  • +
  • added reports for the symbol table structure of the processed grammar
  • +
  • added isReadOnly to Variable in BasicSymbols
  • +
  • added isElliptic to Method in TypeSymbols
  • +
  • added a context condition to warn if keywords consist of numbers only
      +
    • these numbers will be tokenized as keywords instead of numbers
    • +
    +
  • +
  • added splittoken to express that the listed tokens should be split and not handled as a single token
      +
    • example: splittoken ":::"; results in three token :
    • +
    +
  • +
  • added nokeyword to express that the listed keywords should not be handled as tokens
  • +
  • example: nokeyword "automaton", "state"; means that automaton and state should not be handled as keywords
  • +
  • introduced symbol inheritance
  • +
+

Changes

+
    +
  • renamed de.monticore.type.TypeSymbols to de.monticore.symbols.OOSymbols
  • +
  • renamed de.monticore.type.BasicTypeSymbols to de.monticore.symbols.BasicSymbols
  • +
  • reworked appended s for list attributes
  • +
  • renamed SymbolLoader to SymbolSurrogate
  • +
  • Surrogates are now subclasses of their corresponding symbols
  • +
  • MCJavaBlock in MCCommonStatements now spans a shadowing, non-exporting, ordered scope
  • +
  • MethodDeclaration and ConstructorDeclaration in JavaLight use MCJavaBlock instead of MCBlockStatement
  • +
  • Label in MCLowLevelStatement now is a symbol
  • +
  • VarDecl in MCVarDeclarationStatements no longer exists
      +
    • DeclaratorId now produces FieldSymbols
    • +
    +
  • +
  • removed isParameter and isVariable from Field in TypeSymbols
  • +
  • the language class is no longer generated
  • +
  • moved creator expressions to JavaClassExpression
  • +
  • moved PlusExpression and MinusExpression from AssignmentExpressions to CommonExpressions
  • +
+

Fixes

+

Fixed an issue where super and subtype comparison was wrong in type check +Fixed handling of capital letters in grammar package + * using capital letters now produces a warning +* Fixed an issue were setAbsent methods in the generated SymbolBuilder where not properly overridden +* Fixed that non-shadowing scopes where not handled as intended

+

MontiCore 6.1.0

+

released: 07.05.2020

+

MontiCore 6.0.0

+
    +
  • Uses CD4Analysis 1.5.0
  • +
  • replace get*opt methods with get*
  • +
  • bugfixing
  • +
+

MontiCore 5.4.0.1

+
    +
  • Uses CD4Analysis 1.4.0
  • +
  • add generation of serializers for grammars
  • +
  • add SymbolLoader
  • +
  • remove SymbolReferences
  • +
  • add DeSers for TypeSymbols
  • +
  • improved TypeCheck
  • +
  • replace getName methods with printType methods
  • +
+

MontiCore 5.3.0

+
    +
  • Uses CD4Analysis 1.3.20.2
  • +
  • new Generator based on Decorator-Pattern
  • +
  • add Translation classes
  • +
  • add grammar it-tests
  • +
  • move TypesCalculator to TypeCheck, create derive classes and synthesize classes
  • +
  • add TypeSymbols and SymTypeExpression structure
  • +
  • added DeSers for SymTypeExpressions
  • +
  • added keyword "key" for KeyTerminals
  • +
+

MontiCore 5.2.0

+
    +
  • add "List"-Suffix to attribute name
  • +
+

MontiCore 5.1.0

+
    +
  • Remove the dependency to JavaDSL, add JavaLight
  • +
  • Uses CD4Analysis 1.3.19
  • +
  • added grammar TypeSymbols
  • +
  • renamed SymbolDelegateList to SymbolResolvingDelegateList
  • +
  • add methods for scoperule-attributes in interfaces
  • +
  • add MCTypeVisitor to transform ASTTypes to TypeExpressions
  • +
  • add Groovy Plugin
  • +
  • add MontiCore Statements at de.monticore.statements
  • +
+

MontiCore 5.0.6

+
    +
  • The IncGen-reports are stored in the source code directory
  • +
  • Removed MutableScope
  • +
  • IncGen-Reports are stored
  • +
  • Removed deprecated keyword ast (use astrule) in *.mc4
  • +
  • Add visitors for symbol table
  • +
  • Enable TOP mechanism for visitors
  • +
  • add SymbolRules and ScopeRules
  • +
  • renamed MCBasicLiterals to MCCommonLiterals, add MCLiteralsBasis
  • +
  • move literals to package de.monticore.literals
  • +
  • renamed ShiftExpressions to BitExpressions
  • +
+

MontiCore 5.0.3

+
    +
  • Use the following emf coordinates (MB):
  • +
  • group: org.eclipse.emf
  • +
  • version: 2.15.0
  • +
  • artifact: org.eclipse.emf.ecore | org.eclipse.emf.ecore.xmi | org.eclipse.emf.common
  • +
  • The runtime environment may need the following dependency (group: org.eclipse.platform; artifacitId: org.eclipse.equinox.common; version: 3.10.0)
  • +
  • splitted Types.mc4 in MCBasicTypes, MCCollectionTypes, MCSimpleGenericTypes and MCFullGenericTypes
  • +
  • moved expressions to de.monticore.expressions and added expressions
  • +
+

MontiCore 5.0.2

+
    +
  • Generated by the MontiCore version 5.0.1
  • +
  • Uses JavaDSL 4.3.13, Cd4Analysis 1.3.16, se-commons 1.7.9
  • +
  • Introduce deprecated annotation in grammars (#2215)
  • +
  • Serialization of symobls
  • +
  • Add reporter IncGenCheckReporter
  • +
  • Configuration of the report path
  • +
  • Specific resolving methods in generated scope classes
  • +
  • Bugfixes
  • +
+

MontiCore 5.0.1

+
    +
  • Generated by the MontiCore version 5.0.0
  • +
  • Uses JavaDSL 4.3.12, Cd4Analysis 1.3.13, se-commons 1.7.9
  • +
  • Bugfixes
  • +
  • New methods defineHookPointWithDefault in GlobalExtensionManagement (MB)
  • +
  • new method cmpToken in MCParser (MB)
  • +
  • every (non-)terminal defined in an interface must be present in the implementing production (including Name and Usage Name) (CoCo) (BS)
  • +
  • to ensure that any terminal (with a specific name) has to be implemented, use an empty string, e.g. interface Expression = operator="";
  • +
  • new methods are generated for the referenced symbol and definition and the definition is saved in an attribute (generated wenn you write sth. like "Name@Symbol") (NP)
  • +
  • coco that gives a warning if you do not extend conservative (NP)
  • +
  • coco that attributes with the same usage Name have to reference the same symbol (NP)
  • +
  • SpannedScope and Symbol Methods in ASTNode set to deprecated (NP)
  • +
+

MontiCore 5.0.0

+
    +
  • Generated by the MontiCore version 4.5.5.1
  • +
  • Uses JavaDSL 4.3.11, Cd4Analysis 1.3.13, se-commons 1.7.8
  • +
  • Changed name building for list attributes in grammars (x:Name* -> getXList)
  • +
  • Changed api for GlobalExtensionMangament and TemplateController (see reference manual)
  • +
  • New api for AST nodes (constructor, getter and setter for lists and optional attributes, ...)
  • +
  • Builder classes for AST nodes are external now. Signatures are similar to those in the corresponding AST node, except those methods which set or add something, these return the Builder itself (which allows method chaining)
  • +
  • Changed default script to noemf for the generation of MontiCore. If you want to use emf you can generate monticore-grammar and Java-DSL with the profile "emf". This profile also creates the emf jars. You are also able to test the integration-tests with the profile “emf-it-tests”, which contains extra tests for the generation with emf.
  • +
  • Parsed grammars are not stored as class diagram anymore. CD is only stored as report.
  • +
  • Removed deprecated method filter(ResolvingInfo resolvingInfo, List symbols) use filter(ResolvingInfo, Collection) instead
  • +
  • Removed deprecated method filter(ResolvingInfo resolvingInfo, String name, List symbols) use filter(ResolvingInfo, String, Map) instead
  • +
  • Removed deprecated method create(Class symbolClass, SymbolKind symbolKind) use create(SymbolKind) instead
  • +
  • Removed deprecated method getSymbols use getLocalSymbols instead
  • +
  • Removed deprecated method resolve(SymbolPredicate predicate) use resolveMany(String, SymbolKind, Predicate) instead
  • +
  • Removed deprecated method define use add instead
  • +
  • Removed deprecated method resolve(ResolvingInfo resolvingInfo, String name, SymbolKind kind, AccessModifier modifier)
  • +
  • Removed deprecated method checkIfContinueWithEnclosing use checkIfContinueWithEnclosingScope instead
  • +
  • Removed deprecated method addResolver use addFilter(String, ResolvingFilter) instead
  • +
  • Removed deprecated method addTopScopeResolver use addDefaultFilter instead
  • +
  • Removed deprecated method addTopScopeResolvers use addDefaultFilters instead
  • +
  • Removed deprecated method getTopScopeResolvingFilters use getDefaultFilters instead
  • +
  • Removed deprecated constructer CommonResolvingFilter(Class symbolClass, SymbolKind targetKind) use CommonResolvingFilter(SymbolKind) instead
  • +
  • Removed deprecated method continueWithScope and continueWithEnclosingScope
  • +
  • Removed class FaildLoadingSymbol
  • +
  • Removed deprecated method putInScopeAndLinkWithAst use addToScopeAndLinkWithNode instead
  • +
  • Removed deprecated constructer CommonModelingLanguage(String, String, SymbolKind) use CommonModelingLanguage(String, String) instead
  • +
  • Removed deprecated method addResolver use addResolvingFilter instead
  • +
  • Removed deprecated method addResolver use addResolvingFilter instead
  • +
  • Removed deprecated method getResolvers use getResolvingFilters instead
  • +
  • Removed deprecated method loadAmbiguousModelAndCreateSymbolTable use loadModelsIntoScope instead
  • +
  • Removed deprecated method loadAmbiguousModels use loadModels instead
  • +
  • Removed deprecated method defineHookPoint(String) use glex.defineHookPoint instead
  • +
  • Removed deprecated enum ParserExecution
  • +
  • Removed deprecated method getParserTarget
  • +
  • Removed deprecated method setParserTarget
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/00.org/Explanations/FAQ/index.html b/00.org/Explanations/FAQ/index.html new file mode 100644 index 0000000000..d6b927ee19 --- /dev/null +++ b/00.org/Explanations/FAQ/index.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + + + + + + + + + FAQ - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + +

FAQ for MontiCore

+

Using Maven

+
    +
  1. Eclipse shows me an error stating that my project configuration is not up-to-date.
  2. +
  3. I get an error saying something about Lifecycle Mappings.
  4. +
  5. Maven build fails because of a missing JDK path.
  6. +
  7. Maven build for de.monticore.parent project fails in eclipse
  8. +
  9. I have a very weird problem, seriously, very weird ...
  10. +
  11. My .m2 folder does not exist.
  12. +
  13. I get a strange error telling me that something is wrong with the UTF8 encoding.
  14. +
  15. Changes I made on one module are not reflected in another module.
  16. +
+
+
    +
  1. +

    Eclipse shows me an error stating that my project configuration is not up-to-date. +Right-click that project and select Maven -> Update Project Configuration.

    +
  2. +
  3. +

    I get an error saying something about Lifecycle Mappings. +Install the m2e extensions mentioned in the developer tutorial.

    +
  4. +
  5. +

    Maven build fails because of a missing JDK path. +Change the installed runtime JREs to the installed JDK. Go to Window -> Preferences -> Installed JREs. Add the JDK path and select it to be the default one.

    +
  6. +
  7. +

    Maven build for de.monticore.parent project fails in eclipse. +Go to Window -> Preferences -> General -> Workspace. Disable "Build automatically" preference.

    +
  8. +
  9. +

    I have a very weird problem, seriously, very weird ... +Right-click that project and select Maven -> Update Project Configuration.

    +
  10. +
  11. +

    My .m2 folder does not exist. +Folders in Windows with a leading "." can only be created using the command line. Start the command line and type in "mkdir .m2" in your home folder.

    +
  12. +
  13. +

    I get a strange error telling me that something is wrong with the UTF8 encoding. +Change the UTF8 encoding by clicking on Window -> Preferences. Then, select the item as shown below and change the values accordingly.

    +
  14. +
  15. +

    Changes I made on one module are not reflected in another module. +Remember that all Maven modules are independent units. By default, they are not directly imported into each other. Instead, Maven resolves dependencies between projects by selecting packages (e.g.jar files) produced by these modules from your local Maven dependency repository. To make the latest version of a module available through this repository, you have to explicitly install it. If you execute an install on an aggregating POM-project, all child modules will be built with the current state of their depending projects as Maven always builds a hierarchy of modules in order of their mutual dependencies. However, if you are working in Eclipse, the workbench can import modules live. This feature is called "Workspace resolution" and is enabled by default for Eclipse automatic project builders. Nevertheless, if you build a module using a Run Configuration you have to explicitly activate "Resolve Workspaces artifacts".

    +
  16. +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/00.org/Explanations/StatusOfGrammars/index.html b/00.org/Explanations/StatusOfGrammars/index.html new file mode 100644 index 0000000000..3831e78c75 --- /dev/null +++ b/00.org/Explanations/StatusOfGrammars/index.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + + + + + + + + + StatusOfGrammars - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Grammar Status Plans - an Overview

+

MontiCore uses grammars as primary mechanism +to describe DSLs and DSL components. The extended +grammar format allows to compose language components by +(1) inheriting, (2) extending, (3) embedding +and (4) aggregating grammars (see the reference manual for details). +From the grammars a lot of infrastructructure is generated, that is as well +composable, can be extended with handwrittten code and most imprtandly, these +extensions and the grammar composition are compatible, which +leads to optimal forms of reuse.

+

To improve understanding, what will happen with a grammar, we define the +following set of stati and mention the status of each grammar, +both in the explanation and in the grammar itself:

+

Status of a Grammar

+
    +
  1. +

    MontiCore stable: +Such a grammar is meant to be stable in the further development of +MontiCore. The grammar is tested and assumed to be of high quality. +It may rarely happen that smaller extensions are made in a conservative +form, which means that (1) composition with any other grammars, +(2) extensions and adaptations and (3) handwritten extensions will +still work.

    +
  2. +
  3. +

    Beta: In Stabilization: +Such a grammar is in the process of becoming stable. One might already +include the grammar, but some changes may still appear. +(See task list for potential changes.)

    +
  4. +
  5. +

    Alpha: Intention to become stable: +Such a grammar is relatively fresh, but intended to become stable +and useful. Changes may occur, e.g. when restructuring or bug fixing. +Or it may be taken out of the process and become one of the following:

    +
  6. +
  7. +

    Example: +The grammar serves as working example, but will not have high priority on +keeping the grammar up to date. One might use it as inspiration for their +own developments.

    +
  8. +
  9. +

    Deprecated: +The grammar should not be used anymore, it is deprecated, and only +there for compatibility. Normally a newer version of the content +exists in other, often decomposed grammars, allowing to configure +which part of the grammar to be used. +Deprecated grammars are not listed in any overview.

    +
  10. +
+

Marking the Status of Grammars

+

A comment of the following form within the grammar defines this status:

+
    +
  1. /* This is a MontiCore stable grammar. + * Adaptations -- if any -- are conservative. */
  2. +
  3. /* Beta-version: This is intended to become a MontiCore stable grammar. */
  4. +
  5. /* Alpha-version: This is intended to become a MontiCore stable grammar. */ + (but sometimes also omitted)
  6. +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/00.org/Licenses/LICENSE-BSD3CLAUSE/index.html b/00.org/Licenses/LICENSE-BSD3CLAUSE/index.html new file mode 100644 index 0000000000..3a3663cad7 --- /dev/null +++ b/00.org/Licenses/LICENSE-BSD3CLAUSE/index.html @@ -0,0 +1,725 @@ + + + + + + + + + + + + + + + + + + + + + LICENSE BSD3CLAUSE - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + +

LICENSE BSD3CLAUSE

+ + +

Copyright (c) MontiCore*, All rights reserved.

+

Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

+
    +
  1. +

    Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer.

    +
  2. +
  3. +

    Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution.

    +
  4. +
  5. +

    Neither the name of the copyright holder nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission.

    +
  6. +
+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE.

+

* belongs to RWTH and RIDT

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/00.org/Licenses/LICENSE-LGPL/index.html b/00.org/Licenses/LICENSE-LGPL/index.html new file mode 100644 index 0000000000..a8334969de --- /dev/null +++ b/00.org/Licenses/LICENSE-LGPL/index.html @@ -0,0 +1,841 @@ + + + + + + + + + + + + + + + + + + + + + LICENSE LGPL - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + +

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 3, 29 June 2007

+

Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/ +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed.

+

This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below.

+
    +
  1. Additional Definitions.
  2. +
+

As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License.

+

"The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below.

+

An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library.

+

A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version".

+

The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version.

+

The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work.

+
    +
  1. Exception to Section 3 of the GNU GPL.
  2. +
+

You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL.

+
    +
  1. Conveying Modified Versions.
  2. +
+

If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version:

+

a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or

+

b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy.

+
    +
  1. Object Code Incorporating Material from Library Header Files.
  2. +
+

The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following:

+

a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License.

+

b) Accompany the object code with a copy of the GNU GPL and this license + document.

+
    +
  1. Combined Works.
  2. +
+

You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following:

+

a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License.

+

b) Accompany the Combined Work with a copy of the GNU GPL and this license + document.

+

c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document.

+

d) Do one of the following:

+
   0. Convey the Minimal Corresponding Source under the terms of this
+   License, and the Corresponding Application Code in a form
+   suitable for, and under terms that permit, the user to
+   recombine or relink the Application with a modified version of
+   the Linked Version to produce a modified Combined Work, in the
+   manner specified by section 6 of the GNU GPL for conveying
+   Corresponding Source.
+
+   1. Use a suitable shared library mechanism for linking with the
+   Library.  A suitable mechanism is one that (a) uses at run time
+   a copy of the Library already present on the user's computer
+   system, and (b) will operate properly with a modified version
+   of the Library that is interface-compatible with the Linked
+   Version.
+
+

e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 5d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 5d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.)

+
    +
  1. Combined Libraries.
  2. +
+

You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following:

+

a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License.

+

b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work.

+
    +
  1. Revised Versions of the GNU Lesser General Public License.
  2. +
+

The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns.

+

Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation.

+

If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library.

+ + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/index.html b/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/index.html new file mode 100644 index 0000000000..7b53055c03 --- /dev/null +++ b/00.org/Licenses/LICENSE-MONTICORE-3-LEVEL/index.html @@ -0,0 +1,913 @@ + + + + + + + + + + + + + + + + + + + + + + + + + License - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore 3-Level License Model

+

MontiCore is a language workbench for an efficient +development of domain-specific languages (DSLs). All the code available +in these GitHub MontiCore projects
+is published under three levels of licenses as discussed below.

+

For a full use of generated code in commercial and any other forms of +projects, the finally generated code is, completely freely available, +even though the main workbench itself has restrictions.

+

License Overview

+

The MontiCore Language Workbench deals with three levels of code:

+
    +
  • +

    (Level 3) MontiCore: the main library constituting the LWB,

    +
  • +
  • +

    (Level 2) tool derivates that are to a large extent generated by the MontiCore + LWB, and

    +
  • +
  • +

    (Level 1) product code that is finally generated by tool derivates. + This also includes analytical results, thus as results of consistency + checks, code smells, test infrastructures, etc.

    +
  • +
+

Each level has its own and more relaxing license:

+
    +
  • +

    (Level 1) Product code: the generated product code is absolutely +free for each form of use +including commercial use without any mentioning and thus without any restriction +from MontiCore.

    +
  • +
  • +

    (Level 2) Tool derivate: when a tool is derived using the MontiCore +language workbench, then the result falls under the pretty liberal +BSD 3 Clause license +(see BSD-3-Clause).

    +
  • +
  • +

    (Level 3) MontiCore: the main LWB components are published in +GitHub under the +LGPL license (see +LGPL V3.0).

    +
  • +
+

As a consequence using MontiCore during development is rather liberal +and the final products do not have any restriction.

+

Please note that this license level model holds for the MontiCore +LWB and all related projects published in GitHub. For artefacts available +from other sources, different licenses may apply. +E.g. developers of tools may impose their own form of +restrictions i.e. licenses on their tools respectively the results +generated by these tools. +Artefacts directly made available from RWTH Aachen and not published in +GitHub are for the concretely granted purpose only and are +not do be made public at all.

+

As usual in software development: For statistics, scientific reasons, +quality and performance improvement, the tools occasionally send the +fully anonymous statistics report (see file) to the developers.

+

MontiCore 3-Level License on Files

+

This repository for the MontiCore language workbench contains three +kinds of artifacts:

+
    +
  • +

    Java-files that are executed in the MontiCore LWB. They are under +LGPL licence.

    +
  • +
  • +

    Java-files that belong to the runtime environment (RTE) and are thus +copied to the generated code. They are under BSD 3 Clause license.

    +
  • +
  • +

    Templates executed during generation of tool code. +They are also only under BSD 3 Clause license, +because parts of them are copied to the generated code.

    +
  • +
+

MontiCore 3-Level License on Tool and Language Repositories

+

Other MontiCore repositories contain complete or incomplete tools as well as +MontiCore language components. They contain again three +kinds of artifacts:

+
    +
  • +

    Grammars that are used to define language components in the MontiCore LWB. +They are under LGPL licence, but these can be extended by own grammars freely.

    +
  • +
  • +

    Java-files that are executed in the tool (belonging to the tool RTE). +They are under BSD 3 Clause license.

    +
  • +
  • +

    Java-files that belong to the product runtime environment (RTE) are +completely free without restriction.

    +
  • +
  • +

    Templates executed by the tool during generation of product code. +They also are completely free without restriction, +because parts of them are copied to the generated code.

    +
  • +
+

As a result, a tool derivate (level 2) does not contain any LGPL code, +but only BSD 3 Clause code. Executing the tool derivate then +produces completely free code (level 1).

+

If questions appear e.g. on using MontiCore itself in a product +or building an interpreter, please contact monticore@se-rwth.de.

+

Underlying Licenses

+

The MontiCore 3 Level license is built on:

+ +

Please also note the general disclaimer from the BSD 3 Clause license on +liability, etc.

+

Included Software

+

This product includes the following software, both having their own licenses, +compatible with MontiCores licenses:

+ +

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000000..6ca140d141 --- /dev/null +++ b/404.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + + + + + + MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/MontiCoreHandbook2021.gif b/MontiCoreHandbook2021.gif new file mode 100644 index 0000000000000000000000000000000000000000..a608cbfe8dbbcb13b295bc848895945eba5c4b88 GIT binary patch literal 12777 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 IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.220ee61c.min.js b/assets/javascripts/bundle.220ee61c.min.js new file mode 100644 index 0000000000..116072a11e --- /dev/null +++ b/assets/javascripts/bundle.220ee61c.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var M=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?M:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function _(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=_("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():M))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>M),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=_("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - Designing Tools for Command Line Interfaces

+

Some DSLs require a tool to enable general accessibility via the command line interface (CLI). +When designing a tool, we recommend some standard guidelines.

+

Designing a Tool

+

The tool provides a general interface for the functionalities developed for a language. +This includes all features such as parsing of models, saving and loading of symbol +tables, pretty printing, reporting, or export as object diagram.

+

Default Options

+

The available options are of course language-specific. +However, we suggest some default arguments for standardized access.

+
-h,--help                    Prints this help dialog
+-i,--input <file>            Reads the (mandatory) source file resp. the
+                             contents of the model
+-path <dirlist>              Sets the artifact path for imported symbols, space separated
+-modelpath <dirlist>         Sets the artifact path for imported models, space separated
+-pp,--prettyprint <file>     Prints the AST to stdout or the specified output 
+                             file (optional)
+-s, --symboltable <file>     Serializes and prints the symbol table to stdout 
+                             or the specified output file (optional) 
+-r,--report <dir>            Prints reports of the parsed artifact to the
+                             specified directory (optional). Available reports
+                             are language-specific
+-o,--output <dir>            Path of generated files (optional)
+-so,--syntaxobjects <file>   Prints an object diagram of the AST to stdout or
+                             the specified file (optional)
+-sc,--script <file>          Advanced configuration 2: through a groovy script 
+                             that allows to adapt and extend the tool workflow (optional) 
+                             (only some tools provide groovy scripting)
+-ct, --configtemplate        Advanced configuration 1: through a Freemarker template
+                             that allows to adapt the generation process (optional)
+                             (only some tools provide a template configuration call)
+
+

An example of a complete yet relatively small tool example can be found in the +JSON project.

+

Some explanation to the arguments: +* The tool is meant for handling one individual model (-i) and store the + results appropriately in files. +* Typical results are + * (1) generated files (-o) that are used in the next step of + the build process (e.g. for compilation). + * (2) the symboltable (-s) that is then used by other tools to import symbols + * (3) reports (-r) and internal information (-so), like the AST of the + parsed model usable for developers to understand what happened + * (4) and potentially also internal information on used input and generated + output files + that allows the calling build script to understand whether a redo is + needed (as part of a + larger incremental and efficient development process). +* Directories in -path are separated via spaces, i.e. each path is an argument on its own. + Example: -path a/b x/y. +* Directories in the above options -path, -o describe the root + structure that is further refined by packages (like in Java). + That means with -path a/b x/y + the actual symboltable for a Statechart de.mine.Door is found in + a/b/de/mine/Door.scsym or x/y/de/mine/Door.scsym (in that order) +* Languages typically only load other symbols rather than other models. Therefore, the argument + -path that identifies only paths containing symbols should be implemented by most languages, whereas + the argument -modelpath for identifying paths containing models is typically not required. +* Groovy-scripting (-sc, --script): A Groovy Script is meant to describe the tool internal + workflow. It controls parsing, symbol construction, reporting, code generation etc. + This kind of scripting should only become necessary when various alternative + configurations are possible. Thus, not every tool provides Groovy scripting. +* Template-scripting (-ct, --configtemplate): + It is possible to add a custom template script right before + the full generation process starts. This template is useful to customize the + generation process e.g. by defining hook points and thus injection more templates + or switching verbosity on/off.

+

Usage of the Tool-JAR

+

A note to the tool usage: +Tools do not organize the correct order of their calls. If embedded in a larger +build process, an appropriate gradle (preferred) or make it is useful for +incremental efficiency.

+

This organisation is above the tool, due to the efficiency of the +(grade or make) buildscript itself, which must be able to decide, whether a redo +is needed. If the tool was called to decide that, too much time was already wasted.

+

For a build script to decide whether to call the tool or not, a tool call should +(and actually MontiCore does) provide among others a list of files it used for input.

+

Automatically Generating a Tool-JAR

+

Note to the tool development: +To automatically derive an executable JAR from the Gradle build process for the +corresponding tool, the following template can be used.

+

// all in one tool-jar
+shadowJar {
+    manifest {
+        attributes "Main-Class": "de.monticore.${archiveBaseName.get().capitalize()}Tool"
+    }
+    archiveFileName = "MC${archiveBaseName.get()}.${archiveExtension.get()}"
+    minimize()
+    archiveClassifier = "mc-tool"
+}
+
+jar.dependsOn shadowJar
+
+This blueprint can be used in the build.gradle script to derive a JAR for the tool +class and its provided command line functionalities. +The packed JAR already contains all the necessary dependencies. +The template defines the main class and name of the JAR. +To foster automated reuse, the template has already been configured to generate +a suitable JAR for each language project without manual adjustments. +However, this requires adhering to the following conventions: +* The name of the main class is equal to the language project name (usually defined + in the settings.gradle) with the suffix Tool. + Furthermore, the first letter of the main class is always capitalized to adhere + to the Java code conventions +* The package of the main class is de.monticore
+* The generated JAR can be found in 'target/libs'

+

Example:
+For a language project MyLang we have to implement the MyLangTool.java located +in the package de.monticore. +This automatically generates the executable JAR MCMyLang.jar

+

In general, the template can be customized by specifying the corresponding main +class and JAR name definitions. +However, we recommend to use the predefined automatic approach.

+

Functional Approach

+

When implementing the tool, we recommend a functional paradigm to provide the +desired functionalities, as the too class is not about data structures but only +exists to make functions available. +In this case it would be counterproductive to store the arguments of the available +functions as attributes. +Instead, it makes more sense to pass these arguments as parameters when calling +the respective methods. +This yields several advantages:

+
    +
  • Values that have not yet been set do not have to be displayed with Optionals
  • +
  • As a result. tedious unwrapping of Optionals with corresponding error messages + is no longer necessary
  • +
  • get/set methods for attributes are not required
  • +
  • Facilitates reusability of modular functions
  • +
+

Of course, there are always trade-offs, but a more explicit functional way of +thinking should be considered more intensively, especially when it is not about +data structures but about the functions. +For instance, if intermediate results are stored for efficiency reasons, this +might a good argument to do it differently.

+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/BestPractices-Errors/index.html b/docs/BestPractices-Errors/index.html new file mode 100644 index 0000000000..ad9382b162 --- /dev/null +++ b/docs/BestPractices-Errors/index.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + + + + + + + + + BestPractices Errors - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - Understanding Errors, Defining Errors

+

Errors happen. +Some happen because of faults in the code (we call that internal errors), +some happen because we haven't explained well how to use MontiCore and +how to use the generated code.

+

Here we try to add information how to handle occurring errors. +We use the error code for an easier identification. Error codes start with +0xand use 5(!) hex characters and thus should be at the same time +memorizable (because not completely unknown, but still not so common that +they could be taken for something else).

+

Handling Errors 0x.....

+

How to use Expressions (0xA0129)

+
    +
  • Expression is a predefined nonterminal in the MontiCore basic grammars. + Because of the infix notation of some operators and similar challenges, + it is usually not possible to use a subset of the expressions only. + For example use of ConditionalExpression may lead to a parser generation + error (i.e. 0xA0129).
  • +
  • Solutions:
  • +
  • Use nonterminal Expression and forbid all unwanted alternatives through + context conditions.
  • +
  • Think of allowing more general expressions?
  • +
  • If especially the syntax of if . then . else . shall be reused, + why not define this in a new nonterminal and ignore that the same + syntactic constructs were already available in another production.
  • +
  • Defined by: CKi, BR.
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/BestPractices-Language-Design/index.html b/docs/BestPractices-Language-Design/index.html new file mode 100644 index 0000000000..f6b87c0153 --- /dev/null +++ b/docs/BestPractices-Language-Design/index.html @@ -0,0 +1,928 @@ + + + + + + + + + + + + + + + + + + + + + BestPractices Language Design - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - Designing Languages

+

MontiCore provides a number of options to design +languages, access and modify the abstract syntax tree, and produce output files.

+

Some general questions on how to design a complete languages are addressed here.

+

Designing A Language

+

Correct language vs. superset?

+
    +
  • When you know that the incoming model will be correct, because they are generated + by algorithm, you can decide to pass a (slight) superset
  • +
  • This may simplify the development process for two reasons: + (a) you may derive a simpler grammar and (b) you may omit definitions of + context conditions.
  • +
  • But beware: (a) situations may change and manually changed models might come in + or (b) the is adapted by an ill-behaving pre-processor or (c) the model + may come in a wrong version.
  • +
  • This applies mainly for unreadable languages, such as JSON or XML.
  • +
  • Defined by: BR
  • +
+

Versioning an evolving language?

+
    +
  • When languages evolve, models may become invalid, because + certain (now obligatory) parts are missing, or old keywords are used.
  • +
  • We generally believe that a language that is made for long-lasting + models should not embody its version in the models (i.e. like Java, C++ and + other GPLs and unlike XML dialects).
  • +
  • When evolving a language, you should only evolve it in conservative form, i.e.
  • +
  • All new elements are optional by .?, .* or offer new alternatives (old | new)
  • +
  • Old elements or keywords are not simply removed, but + forbidden by coco warnings, marking them as deprecated for a while.
  • +
  • Downward compatibility of newer models, however, is not useful. + We can safely enforce developers should normally use the newest + versions of their tools.
  • +
  • Defined by: BR
  • +
+

Language Design in the Large

+

Making Transitively Inherited Grammars Explicit?

+
    +
  • When the grammar inclusion hierarchy becomes larger, there will be redundancy. + In: +
      grammar A { .. } ;
    +  grammar B extends A { .. } ;
    +  grammar C extends A,B { .. } ;
    +  grammar D extends B { .. } ;
    +
    + Grammars C and D actually include the same nonterminals.
  • +
  • If A is made explicit, you have more information right at hand, but also + larger grammars. It is a matter of taste.
  • +
  • A recommendation: when you use nonterminals from A explicitly, then also + make the extension explicit. However, be consistent.
  • +
+

How to Achieve Modularity (in the Sense of Decoupling)

+
    +
  • Modularity in general is an important design principle. + In the case of model-based code generation, modularity involves the following + dimensions:
      +
    1. Modelling languages
    2. +
    3. Models
    4. +
    5. Generator
    6. +
    7. Generated code
    8. +
    9. Runtime-Environment (RTE) including imported standard libraries
    10. +
    11. Software architecture (of the overall system), software stack
    12. +
    +
  • +
  • These dimensions are not orthogonal, but also not completely interrelated. + The actual organisation will depend on the form of project.
  • +
  • A weak form of modularity would be to organize things in + well understood substructures such as packages. + A deeper form of modularity deals with possibility for individual reuse + and thus an explicit decoupling of individual components. We aim for + decoupling (even if developed in the same git project).
  • +
  • Modularity also deals with extensibility and adaptation.
  • +
  • A principle for adaptation for the generator, + the generated code, and the RTE is to design each of them + like a framework with explicit extension points. + Extension points may be (empty) hook methods to be filled, Java interfaces + to be implemented and their objects injected to the code e.g., via + factories, builders or simply method parameters.
  • +
  • A principle for modularity for the generator, + the generated code, and the RTE is to design parts of them as + independent library functions (or larger: components) that can be used if needed.
  • +
  • We recommend to modularize whenever complexity overwhelms or extensibility and + adaptability are important:
      +
    1. MontiCore has powerful techniques for adaptation, extension and + composition of modelling languages (through their grammars). See the + handbook.
    2. +
    3. MontiCore has powerful techniques for the aggregation of models -- + using the same principles as programming languages, namely allowing to keep + the models independent (and thus storable, versionable, reusable) artifacts, + while they are semantically and through the generator technology well integrated. + The appropriate approach is based on using foreign models, e.g., through + import statements and sharing symbol infrastructures as described in the + handbook.
    4. +
    5. The generator provides (a) many Java classes and methods that can be overridden + (b) Freemarker templates hook points to extend and replace templates, and (c) + can be customized using a groovy script. + The generator itself is often structured along the software architecture / stack, + e.g., in frontend, application backend, database, transport layer, etc.
    6. +
    7. The generated code must be designed appropriately by the generator designer, + by generating builders, mills, etc. for each form of product - quite similar + to MontiCore itself. + The generated code is usually structured along the components or sub-systems + that the software architecture defines.
    8. +
    9. The RTE is probably well-designed if it is usable in a normal framework.
    10. +
    +
  • +
  • Please note: it is not easy to design modularity and extensibility from beginning. + Framework design has shown that this is an iterative optimizing process. + It must be avoided to design too many extension elements into the system + from the beginning, because this adds a lot of complexity.
  • +
  • Defined by: BR
  • +
+

Realizing Embedding through an Interface Nonterminal Extension Point

+

Consider the following scenario: +A language Host defines an extension point through an interface nonterminal.

+
grammar Host { A = I*; interface I; }
+
+

Another language Embedded, that has no connection to the Host language, +defines a class nonterminal E.

+
grammar Embedded { E = "something"; }
+
+

MontiCore provides alternative solutions to embed the language Embedded +into the language Host at the extension point I. All solutions presented here +require to implement a new grammar G that extends the grammars Embedded and Host +reuses the start nonterminal of the Host grammar:

+
grammar G extends Host, Embedded { start A; }
+
+

The connection between extension point and extension is performed by an additional +grammar rule in the grammar G. This can be realized in one of the following ways each one +of which has its own advantages and disadvantages:

+
    +
  1. Embedding through overriding of extension rule and implementing extension point:
      +
    • E implements I;
    • +
    • Advantage: simple embedding rule
    • +
    • Disadvantage: does not work in combination with inheritance of extension rule
    • +
    • Should therefore only be used, if E is not used anywhere else (= in not other language that is potentially used in combination with this language)
    • +
    +
  2. +
  3. Embedding through extending extension rule and implementing extension point rule:
      +
    • IE extends E implements I = "something";
    • +
    • Advantage: does work in combination with inheritance of extension rule
    • +
    • Disadvantage: cloning of RHS of the extension rule can produce inconsistencies if E is changed
    • +
    • Can be used if it is assured that this rule is adjusted whenever E is changed, e.g., by assuming that E is not modified at all
    • +
    +
  4. +
  5. Embedding through implementing extension point rule and providing extension on right-hand side:
      +
    • IE implements I = E;
    • +
    • Advantage: does work in combination with inheritance of extension rule
    • +
    • Disadvantage: introduces new level of indirection in the AST that invalidates the check whether the required abstract syntax (RHS of interface nonterminal) is present
    • +
    • Should therefore not be used, if the interface has a right-hand side
    • +
    +
  6. +
  7. Defined by: AB
  8. +
+

Recurring Language Components

+

The import statements

+
    +
  • Many models depend on other models from which they receive symbols they can rely on. + To define this kind of dependencies using import statements is convenient and well + known (e.g., from Java). We thus suggest to use the import statement in the spirit of Java.
  • +
  • import aName at the first sight means that a specific class with the qualified + name aName is used. In reality, however, Java has a very convenient convention + that class aName is always defined in the artifact (i.e. file) with the same name + aName.java and the needed symbol table is part of aName.class. So an import + statement actually locates an artifact.
  • +
  • As a consequence, we suggest:
      +
    • import aModelName refers to an artifact with name aModelName -- regardless + which kind of model is defined there.
    • +
    • All the symbols exported by the artifact aModelName are imported when using + the import statement import aModelName.
    • +
    • The imported artifact provides the desired symbols, typically stored through + an earlier tool execution in a symbol file aModelName.sym.
    • +
    • The symbol file may have specific extensions, such as autsymor cdsym.
    • +
    • Selective import (known from Java), such as import aName.innerClass + should be possible, but currently no such showcase has been made yet (beyond Java).
    • +
    • The import statement is only used to make symbols available in their simple form. + It is usually + not intended to explicate a single dependency, e.g., a configuration model + that depends on exactly one base model. Like in Java, where you import an + artifact and then still explicitly extend the contained class.
    • +
    +
  • +
  • It is methodically of interest to store at most one artifact with the same + qualified name (although it is not per se forbidden to have more). + Java then also uses the first occurring class in its classpath only.
  • +
  • In a heterogeneous language setting, it may be necessary to map symbols + from a source to a target form (e.g., state symbols to Java enum constants or state + pattern classes). There are three main options for this task:
      +
    1. Store in the desired target symbol form upon creating the symbol file. + Has some problems: (1) increases dependencies between tools, + (2) potentially several files need to be stored.
    2. +
    3. Adapt the imported symbols upon loading (recommended).
    4. +
    5. Use an explicit transformation tool between the two model processing tools + to map the initially stored symbol file to the desired format.
    6. +
    +
  • +
+

Version number in language variants

+
    +
  • As an important rule:
      +
    • Do not include version numbers in the DSL explicitly.
    • +
    +
  • +
  • The reason is that whenever you do a tooling update, all the models that have + been defined before are suddenly not valid anymore and have to be adapted. + Java has very carefully ensured that updates in the language are extensions only + and thus all old Java files are still validated with new Java compilers + (with the one exception: new keyword assert).
  • +
  • If your language is still very volatile against disruptive changes, + it may be an option at the beginning, but should be avoided with the first real release.
  • +
  • It is a burden to manage version numbers and downward compatibility through + all the versioning, especially if language components evolve with their own + versioning.
  • +
  • MontiCore provides a theory of conservative extension to avoid + explicit version controlling within the language.
  • +
  • And if needed: MontiCore and their tools provide extensive checks of + wellformedness (i.e. + context conditions), on each update a fully automated consistency check + of all existing models + should be easily establishable.
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/BestPractices-Symbols-Scopes/index.html b/docs/BestPractices-Symbols-Scopes/index.html new file mode 100644 index 0000000000..a6d449d5ca --- /dev/null +++ b/docs/BestPractices-Symbols-Scopes/index.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + + + + + + + + + BestPractices Symbols Scopes - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - Symbols, Scopes, Symboltables

+

MontiCore provides a number of options to design +languages, access and modify the abstract syntax tree, and produce output files.

+

The newest MontiCore release gives powerful capabilities to define and +use symbols. Symbols, scopes, and symboltables are somewhat complex +to design, but powerful in their use.

+

Designing Symbols, Scopes and SymbolTables

+

How to define a Symbol Usage without a given Symbol Definition

+
grammar E { 
+  A = Name@S; 
+  symbol S = Name; 
+}
+
+
    +
  • If you want to use a special form of symbol that shall neither be defined + inside the grammar of a language, nor shall it be imported.
  • +
  • We can define symbols of kind S in the grammar in a grammar rule that + is never reached by the parser from the start production. + Through this, MontiCore generates:
  • +
  • symbol table infrastructure for handling S symbols
  • +
  • symbol table infrastructure for resolving these in E scopes, and
  • +
  • integration of S symbols with the AST of A.
  • +
  • However, S symbols are not automatically instantiated. + This has to be described manually, e.g., by extending the symbol table + creator or via providing an adapter translating a foreign symbol into an S symbol.
  • +
  • This can be used, e.g., in these scenarios:
  • +
  • A name of a certain kind is introduced automatically the first time it occurs + in a model. If it occurs more than once, all other occurrences of the name + do not introduce new symbols. (e.g., this happens with features in FDs, + and works because features do not have a body.)
  • +
  • A name in a language E refers to a named element of another language, + but the language shall be decoupled from E. + Therefore, E introduces a symbol S and an adapter maps other, foreign + symbols to S symbols.
  • +
  • Defined by: AB, BR
  • +
+

Symbol Definition prepared for Reuse

+

grammar E { 
+  symbol Bla = "bla" Name AnotherNT; 
+}
+
+* has the effect that three things are defined: (a) concrete syntax, + abstract syntax with (b) AST element ASTBla + and (c) a symbol BlaSymbol. +* Reuse of the symbol BlaSymbol currently only works together with a reuse + of the syntax too, i.e.

+

grammar F extends E { 
+  Blubb extends Bla = "blubb" Name; 
+}
+
+ would for example be illegal, because the conservative extension paradigm + enforces AnotherNT to be included in Blubb as well. +* To allow individual reuse of symbol BlaSymbol we recommend to + restructure its definition into an interface that does not preclude + create syntax and only a minimal constraint on the abstract syntax:

+
grammar E { 
+  symbol interface Bla = Name; 
+  Bla2 implements Bla = "bla" Name AnotherNT; 
+}
+grammar F extends E { 
+  Blubb implements Bla = "blubb" Name; 
+}
+
+
    +
  • Please note that MontiCore allows that a nonterminal implements + multiple interfaces. However, only one of them may carry the symbol + keyboard property, because the newly defined symbol then is also + a subclass of the inherited symbol (in Java).
  • +
+

Loading (DeSerializing) Symbols of Unknown Symbol Kinds

+

Specific languages (e.g., CD) may provide specific symbols, of specific kinds. +A symbol import of these symbols into another language L1 has to cope with +potentially unknown kinds of symbols, even though the super kind could be known. +E.g., TypeSymbol is extended by CDTypeSymbol providing e.g., additional +visibility information. +Upon loading an CD-symboltable into an L1-tool +it may be that neither AST-class CDTypeSymbol nor superclass information about +it is available. +But, the symbols of the unknown kind should (and can) be loaded as symbols of a more abstract kind.

+

Loading the symbols of the unknown kind as symbols of the specific known kind is possible in multiple ways. +Options would be + 1. adapt the L1-tool to know about the new symbols, or + 2. the L1-tool has been written in such a way that new classes can be added + through appropriate class loading, or + 3. the L1-tool is configurable in handling unknown symbol kinds as explained below.

+

Loading Symbols as Symbols of Another Kind

+

Symbols of an unknown source kind (e.g., CDTypeSymbol) may easily be loaded as +symbols of a known kind (e.g., TypeSymbol) when the source kind provides +all mandatory attributes (i.e. those without defaults) of the symbol class. +This is especially the case if the source kind is a subclass of the known +kind.

+

This behavior can be configured in the global scope by calling the method putSymbolDeser(String, ISymbolDeser), +where the unknown source kind is encoded as string (here: CDTypeSymbol) and is mapped to +an appropriate DeSer (here for TypeSymbol). +For instance the call would be +putSymbolDeSer("de.monticore.cdbasis._symboltable.CDTypeSymbol", new TypeSymbolDeSer()).

+

Because the global scope is a singleton, this configuration can be e.g., called in or shortly +after constructing the global scope. However, this would still encode the name of the unknown +symbol kind in the L1-tool, although it prevents any actual dependency to the imported tools.

+

The method can also be called from a CLI to dynamically configure the deserialization, +e.g., the information be fed to the L1-tool via parameters, e.g., like +

  java L2Tool --typeSymbol=de.monticore.cdbasis._symboltable.CDTypeSymbol
+              --functionSymbol=de.monticore.cdbasis._symboltable.CDMethodSymbol
+

+

Converting Stored Symbol Tables

+

If the unknown symbol kinds do have different attributes or some extra information +needs to be calculated in the new symbols, then either the L1-tool needs to be adapted or +the serialized symbol table can be transformed to another +serialized symbol table where the kind information is transformed as required as an +intermediate step between the tools providing and reading the symbol tables.

+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/BestPractices-Syntax-Design/index.html b/docs/BestPractices-Syntax-Design/index.html new file mode 100644 index 0000000000..b9f3dcecbd --- /dev/null +++ b/docs/BestPractices-Syntax-Design/index.html @@ -0,0 +1,1021 @@ + + + + + + + + + + + + + + + + + + + + + BestPractices Syntax Design - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - Concrete and Abstract Syntax

+

MontiCore provides a number of options to design +languages, access and modify the abstract syntax tree, and produce output files.

+

This (currently unsorted and evolving) list of practices discusses solutions +that we identified and applied as well as alternatives and their specific +advantages and drawbacks. The list also mentions where the solutions have been +found and where they have been applied first.

+

This file is partially temporary and also contains compact (incomplete) solutions. +More detailed descriptions of best practices can be found in the +MontiCore handbook. +Some of the best practices here will also be incorporated in the next version +of the reference manual.

+

Designing Concrete and Abstract Syntax

+

Specific keywords that shall be used as normal names elsewhere

+
    +
  • A = "foo" B introduces foo as a keyword that cannot be used as an ordinary + (variable) name anymore. To prevent that we may use:
  • +
  • A = key("foo") B instead, which introduces foo only at that specific point.
  • +
  • In general, we use all Java keywords as permanent, but abstain from other + permanent keywords, especially if they are only used for a specific purpose in a composable + sublanguage, like in in the OCL.
  • +
  • Defined by: BR
  • +
+

Complex Token clashing with other uses of sub-tokens

+
    +
  • For example <- is supposed to be used as arrow, but in an expression + 3<-10 is also syntactically allowed.
  • +
  • The problem: as soon as "<-" is defined as a token in any part of the + current or any extended grammars, the expression 3<-10 would not be + parsed as 3 < -10 anymore.
  • +
  • Solutions:
      +
    1. We might decompose the token to "<" "-" which in its consequence + means that we put more burden to the context-free parser and less to the + regular scanner. ("scannerless parsing")
        +
      • Drawback: spaces would now be allowed inbetween.
      • +
      +
    2. +
    3. Decompose the token to {noSpace(2)}? "<" "-". This (slightly + hacking approach) prevents spaces between two tokens.
    4. +
    +
  • +
  • The challenge: when designing a language component, we don't know yet + what further uses will bring. This may include sub-tokens to come up + with new interactions. This would require an (already defined) grammar + with the complex token to be adapted afterwards (and thus conflict + with the library idea).
  • +
  • Remark: A forthcoming enhancement will provide an improved solution, + keeping parsing efficiency and compositionality of grammars.
  • +
  • Defined by: BR
  • +
+

Extension forms in a component grammar

+

A component grammar is meant for extension. MontiCore therefore provides five(!) +mechanisms that can be used when a sub-grammar shall extend a super-grammar. +The solutions are briefly discussed here:

+

1. Interface in the super-grammar

+
    +
  • Introduce an interface and allow building of sub-nonterminals in sub-grammars.
    +
    component grammar A {  
    +  interface X;
    +  N = "bla" X "blubb";
    +}
    +grammar B extends A {
    +  Y implements X = "specific" "thing"
    +}
    +
  • +
  • Advantage: Multiple extensions are possible at the same time. + An NT Y can also implement multiple interfaces (like in Java).
  • +
  • Disadvantage: the designer of A explicitly has to design the hole + (extension point) X and add it into the production.
  • +
+

2. Overriding (empty) nonterminal from the super-grammar

+
    +
  • Use a normal nonterminal X and override it in a sub-grammar.
    +
    component grammar A {  
    +  X = "";
    +  N = "bla" X "blubb";
    +}
    +grammar B extends A {
    +  @Override
    +  X = "my" "thing";
    +}
    +
  • +
  • Advantage: Default implementation "" exists, no explicit filling needed.
  • +
  • Disadvantage:
      +
    1. The designer of A explicitly has to design the hole (extension point) X + and inject it into other places.
    2. +
    3. Only one overriding alternative possible (i.e. multiple overriding in + subgrammars are allowed, but only the most specific resides).
    4. +
    +
  • +
+

3. Extending nonterminal from the super-grammar.

+
    +
  • Use an empty normal nonterminal X and extend it in a sub-grammar. +
    component grammar A {  
    +  X = ;
    +  N = "bla" X "blubb";
    +}
    +grammar B extends A {
    +  Y extends X = "this";
    +}
    +
  • +
  • Advantage: Default implementation "" exists, no explicit filling needed.
  • +
  • Disadvantage: + The designer of A explicitly has to design the hole (extension point) X + and inject it into other places.
  • +
  • Care: Extension still allows the (empty) alternative X.
  • +
+

4. Using external nonterminals in the super-grammar.

+
    +
  • +

    Mark nonterminal X as external. +

    component grammar A {  
    +  external X;
    +  N = "bla" X "blubb";
    +}
    +grammar B extends A {
    +  X = "your";
    +}
    +

    +
  • +
  • +

    Advantage: Explicitely marks a nonterminal as hole (extension point) in the grammar.

    +
      +
    • Please observe that interface terminals may or not may be meant to be + extended in sub-grammars. external is clearer here.
    • +
    +
  • +
  • Disadvantage:
      +
    1. Leads to more objects in the AST. Both classes a.X and b.X are + instantiated and a.X only links to b.X.
    2. +
    3. Only one filling of the hole is possible.
    4. +
    +
  • +
+

5. Overriding the whole production.

+
    +
  • If you don't want to add a hole at any possible place of extension: +
    component grammar A {  
    +  N = "bla" "blubb";
    +}
    +grammar B extends A {
    +  @Override
    +  N = "bla" "my" "blubb" "now";
    +}
    +
  • +
  • Advantage: Compact definition. No "framework thinking" needed (no need + to forecast all potential extension points)
  • +
  • Disadvantage:
      +
    1. The entire production is overriden (some redundancy).
    2. +
    3. Only one overriding alternative possible.
    4. +
    +
  • +
  • Combinations are possible. Dependent on the anticipated forms of + adaptations option 1, 2, 3 and 5 are in use.
  • +
  • Defined by: BR
  • +
+

Avoid empty nonterminals (if body is known)

+
    +
  • +

    From the two variants: +

    A = "bla" B? C*;
    +B = "B's body" ;
    +C = "C's body" ;
    +
    + and +
    A = "bla" B C;
    +B = ("B's body")? ;
    +C = ("C's body")* ;
    +
    + we generally prefer the first one, i.e. add multiplicities when + using a nonterminal.

    +
  • +
  • +

    This is a matter of taste, but useful to keep this consistent.

    +
  • +
  • Sometimes exceptions are useful.
  • +
  • Defined by: SVa, BR
  • +
+

Avoid complex tokens (1)

+
    +
  • The token definitions can only define regular expressions. + Furthermore, the token parser (i.e. the lexer) does not consider backtracking.
  • +
  • If combinations of characters may be split into several token sequences + this leads to problems. E.g. in 3-2 and (-2) the - has different roles. + Unfortunately these problems also occur when composing languages + that make excessive use of (conflicting) token definitions.
  • +
  • Solution: instead of defining a complex token like +
      token NegativeNat = "-" Digits;
    +
    + we split the token and allow individual parsing into nonterminals: +
      NegativeNat = negative:["-"] Digits {noSpace()}? 
    +
    + (where we assume Digits is a given token).
  • +
  • +

    As a workaround, we use the semantic predicate {noSpace()}? that ensures + that between the two last processed token there is no space inbetween. + If one of the tokens is optional we have to split the alternatives: +

    SignedNatLiteral = 
    +        (negative:["-"]) Digits {noSpace()}? |
    +                         Digits;  
    +

    +
  • +
  • +

    Adding a handcoded function like getValue() via astrule or the + TOP-mechanism allows to use SignedNatLiteral like a token.

    +
  • +
  • Scannerless parsing is a principle where the tokens are reduced to simple + characters (or character classes, such as [a-z]). Scannerless parsing + generally avoids this kinds of problems, but is way slower. + This kind of solution tries to mediate between the two extremes benefitting + from both approaches.
  • +
  • Defined by: MB, in: MCCommonLiterals.mc4 and other literals grammars.
  • +
+

Avoid complex tokens (2)

+
    +
  • Same general problem. In language composition conflicting tokens may lead to issues.
  • +
  • For example Java allows 42. as a literal of type float. + UML allows to define cardinalities like [42..44]. Composition clashes.
  • +
  • +

    Solution: In a Java sublanguage we split the token: +

    SignedBasicFloatLiteral =
    +   ... 
    +   | Digits "." {noSpace()}? ... ;
    +

    +
  • +
  • +

    This will ensure that [42..44] will be parsed like [ 42 .. 44 ] + in a language composition as well.

    +
  • +
  • It generally seems that overly complex composed tokens may lead to issues + especially if the language allows compact models. Suboptimal tokens may be e.g. + "[[" (vs. nested lists), or + "<-" (vs. 3 < -2).
  • +
  • Defined by: MC team.
  • +
+

How to define keyword enumerations

+
    +
  • A finite set of keyword-based alternatives can be defined in several forms:
  • +
  • Standard three keywords act as alternative: +
    N = (["public"] | ["protected"] | ["private"]) ;
    +
  • +
  • Effects:
      +
    1. not extensible without overriding and repetition
    2. +
    3. introduces boolean flags, where only one can be true at a time
    4. +
    +
  • +
  • Use an enumeration nonterminal +
    enumeration E = "public" | "protected" | "private" ;
    +N = E ;
    +
  • +
  • Effects:
      +
    1. not extensible
    2. +
    +
  • +
  • Use an interface and subclasses with almost empty body: +
    interface E ;
    +P1 implements E = "public"    ;
    +P2 implements E = "protected" ;
    +P3 implements E = "private"   ;
    +N = E ;
    +
  • +
  • Effects:
      +
    1. very extensible in various ways (even beyond mere keywords)
    2. +
    3. visitor can easily address the keywords (i.e. by visit(P1) ...)
    4. +
    5. Disadvantage: Clumsy notation and visitors are always needed.
    6. +
    +
  • +
  • Defined by: SVa, BR.
  • +
+

Common AST-Access to Syntactically Similar Nonterminals

+
    +
  • +

    Sometimes the following occurs (e.g. in associations of CDs or + interactions of SD):
    +

    A = X Y Z;
    +B = Z Y X;
    +

    +
  • +
  • +

    The concrete syntax differs (in order), but the syntactic concepts are + the same.

    +
  • +
  • +

    To allow common access, a common interface nonterminal is introduced + that is not used in the grammar directly. + This doesn't change the concrete syntax but allows common AST access: +

    interface F = X Y Z;      // order is irrelevant
    +A implements F = X Y Z;
    +B implements F = Z Y X;
    +

    +
  • +
  • +

    Defined by: BR.

    +
  • +
+

How and when to use Names for Nonterminals

+
    +
  • Normally names like expr:Exprcan be avoided which makes a grammar easier to read + and more concise, i.e. Expr alone has the same effect.
  • +
  • There may be two reasons to use a name:
      +
    1. Nonterminal X occurs several times and we want to distinguish: + left:Expr "*" right:Expr
    2. +
    3. We can also use the name to describe the purpose of the nonterminal, i.e. +
       MyVariable implements Variable = Name "=" initial:Expression;
      +
      +vs: +
       MyParameter implements Variable = Name "=" default:Expression;
      +
    4. +
    +
  • +
  • Defined by: BR.
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/BestPractices/index.html b/docs/BestPractices/index.html new file mode 100644 index 0000000000..e14d3d5156 --- /dev/null +++ b/docs/BestPractices/index.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Best Practices - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + + +

MontiCore Best Practices - A Guide For Small Solutions

+

MontiCore provides a number of options to design +languages, access and modify the abstract syntax tree, and produce output files.

+

This (currently unsorted and evolving) list of practices discusses solutions +that we identified and applied as well as alternatives and their specific +advantages and drawbacks. The list also mentions where the solutions have been +found and where they have been applied first.

+

The list is subdivided into several MD files tackling various language design areas.

+

The list is partially temporary and also contains compact (incomplete) solutions. +More detailed descriptions of best practices can be found in the +MontiCore handbook. +Some of the best practices here will also be incorporated in the next version +of the handbook.

+ +

includes: Language Design in the Large

+ +

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/Bild6.png b/docs/Bild6.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d2b0b07cc9e426e5278be89ba3367d4caea9c4 GIT binary patch literal 33446 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

15k8LTJisafByVAl#HWo;pV9k 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%0A?bYKHU{c*Yxj`3)D>di9#iT?+^{ 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 literal 0 HcmV?d00001 diff --git a/docs/BuildMontiCore/index.html b/docs/BuildMontiCore/index.html new file mode 100644 index 0000000000..289515adc9 --- /dev/null +++ b/docs/BuildMontiCore/index.html @@ -0,0 +1,777 @@ + + + + + + + + + + + + + + + + + + + + + BuildMontiCore - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + +

+
+

+

+

MontiCore - Language Workbench And Development Tool Framework

+ +

General disclaimer

+

(Repeated from the BSD 3 Clause license):

+

This software is provided by the copyright holders and contributors +"as is" and any expressed or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a particular +purpose are disclaimed. In no event shall the copyright holder or +contributors be liable for any direct, indirect, incidental, special, +exemplary, or consequential damages (including, but not limited to, +procurement of substitute goods or services, loss of use, data, or +profits, or business interruption) however caused and on any theory of +liability, whether in contract, strict liability, or tort (including +negligence or otherwise) arising in any way out of the use of this +software, even if advised of the possibility of such damage.

+

Included Software

+

This product includes the following software: +* AntLR +* FreeMarker

+

Contribution

+

When you want to contribute: Please make sure that your complete workspace only +uses UNIX line endings (LF) and all files are UTF-8 without BOM. On Windows, you should +configure git to not automatically replace LF with CRLF during checkout +by executing the following configuration:

+
git config --global core.autocrlf input
+
+

Build MontiCore

+

MontiCore is currently built using Gradle.

+

Please note that from the top level build script, not everything is built and +all tests executed. It is a deliberate decision, to exclude some of the longer +lasting tasks.

+
    +
  • build the productive code (including the unit tests, ~8 min)
  • +
  • gradle buildMC
  • +
  • skipping the unit tests: gradle assembleMC
  • +
  • run integration tests (which are not included in the unit tests, ~30 min)
  • +
  • all integration tests
      +
    • gradle testIT
    • +
    +
  • +
  • Integration tests of the generator:
      +
    • gradle -p monticore-test/it build
    • +
    +
  • +
  • EMF Integration tests of the generator (only test collection not included in testIt):
      +
    • gradle -p monticore-test/it build -PbuildProfile=emf
    • +
    +
  • +
  • Experiments (from the Handbook) as integration tests:
      +
    • gradle -p monticore-test/01.experiments build and
    • +
    • gradle -p monticore-test/02.experiments build
    • +
    +
  • +
  • Grammar integration tests:
      +
    • gradle -p monticore-test/monticore-grammar-it build
    • +
    +
  • +
  • clean:
  • +
  • call gradle clean
  • +
  • cleaning integration tests:
      +
    • using gradle gradle clean within the corresponding subproject (see above)
    • +
    +
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/DevelopedLanguages/index.html b/docs/DevelopedLanguages/index.html new file mode 100644 index 0000000000..367af035c1 --- /dev/null +++ b/docs/DevelopedLanguages/index.html @@ -0,0 +1,962 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Languages and Language Components - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + +

Languages and Language Components Developed with MontiCore

+

The MontiCore language workbench has been under development for a while +already and of course has been used by our group to develop +many languages. Not all of those languages are publicly +available and some of these languages are equipped with tools based +on MontiCore 5.

+

Many of these languages are composed of sublanguages and +thus potentially build on each +other. The available languages can be used as is, but +also be adapted, extended and further composed.

+

Please also have a look at our literature references for further +information on many of the languages.

+

Information about Languages and Language Components

+
    +
  • +

    MontiCore Handbook. + The handbook describes how to use MontiCore as an out-of-the-box + language workbench), but also as a grey box tooling framework. + It thus also gives an overview over a number of core mechanisms of MontiCore.

    +
  • +
  • +

    List of MontiCore core Language Components. + MontiCore concentrates on reuse. It therefore offers a set of + predefined language components where the main artifact is usually a + component grammar. Reusing these language components allows + language developers to define their own language as a + composition of reusable assets efficiently. Reusable assets describe among others + several sets of literals, expressions and types, which are relatively + freely composable.

    +
  • +
  • +

    List of languages. + This is a another list of newer MontiCore + languages that can be used out of the box or also composed. + Many of them already are rather stable, but some of them also undergo a + lively development and enhancement. + These complete languages are usually composed of a number of language + components.

    +
  • +
  • +

    MontiCore topic list + Describes various research topics which MontiCore builds on or + where MontiCore has been used as foundation.

    +
  • +
+

Github Available Languages

+ +

Further Languages (e.g. used in scientific and industrial projects)

+
    +
  • +

    MontiArc ADL is an architectural definition language for + component and connector models with enhanced connection facilities, + hierarchical decomposition etc. and provides a simulator + [HRR12,BHH+17,Wor16,Hab16].

    +
  • +
  • +

    MontiArcAutomaton ADL is an extension of the + architectural definition language MontiArc using automata to describe + behavior. + Some applications e.g. are of robotics, production, or InternetOfThings. + [BKRW17a,HKR+16,BRW16a,Wor16].

    +
  • +
  • +

    UML/P is a derivation from UML, especially suited for agile +development. See language definition and usage method in +[Rum17,Rum16,Sch12].

    +
      +
    • UML/P Class Diagrams for data structures
    • +
    • UML/P Object Diagrams for exemplaric situations: usable for + constructive development as well as testing
    • +
    • OCL/P as Java-variant of the OCL with a nice logic, + set-comprehension etc.
    • +
    • UML/P Statecharts for behavior
    • +
    • UML/P Sequence Diagrams for interaction
    • +
    • Activity Diagrams for workflows and requirements + (an extension to the books)
    • +
    +
  • +
  • +

    Delta-MontiArc [HRRS12,HKR+11,HRRS11] + is a DSL for expressing deltas on MontiArc component definitions + which allows to model software product lines in a bottom up way.

    +
  • +
  • +

    MontiArcHV [HRR+11] + allows specifying component variability fully integrated within the + component hierarchy located at variation points in component definitions.

    +
  • +
  • +

    Java as full language as well as source for Java expressions, + statements, attribute or method definitions.

    +
  • +
  • +

    FeatureDSL is a DSL for feature diagrams in software product line + approaches.

    +
  • +
  • +

    DeltaCD is a DSL for expressing deltas on class diagrams + which allows to model software product lines in a bottom up way

    +
  • +
  • +

    Aerospace Constraint Specification Language is a DSL used to + specify critical situations in an airspace including airplanes, + weather, flight conditions and much more. [ZPK+11]

    +
  • +
  • +

    clArc DSL Family: [PR13]

    +
      +
    • Cloud Architecture Description Language: used to model of + architectures of cloud-based systems; based on MontiArc.
    • +
    • Target Description Language: used to model the infrastructure + architecture of cloud-based systems.
    • +
    • Mapping Description Language: used to model deployments + between software and infrastructure architectures.
    • +
    • Architecture Scenario Description Language: used to model + scenario-based test cases for software architectures.
    • +
    +
  • +
  • +

    I/O-TestDSL
    + for the definition of stream-based, input-output + related black-box tests for architecture definition languages + like MontiArc.

    +
  • +
  • +

    LightRocks, a modelling language for robotic assembly processes.

    +
  • +
  • +

    cdViews is a DSL used to model partial views on class diagrams

    +
  • +
  • +

    RBAC for Role-Based Access Control in enterprise information systems.

    +
  • +
  • +

    MontiWis [[RR13,Rei16]] + is a family of DSLs for the model-based, generative + development of web information systems among others based on + class diagrams, activity diagrams and views.

    +
  • +
  • +

    HQL: Hibernate Query Language that maps to hibernate based + executions.

    +
  • +
  • +

    SQL the well known DB query language; used for embedding + e.g. into other languages.

    +
  • +
  • +

    XML the basic infrastructure for all XML dialects

    +
  • +
  • +

    CarOLO DSLs for autonomic driving. This among others + contains a DSL for defining road scenarios with moving vehicles + as well a obstacles suited for laser, lidar, radar and camera + sensors. This languages are part of the Darpa Urban Challenge 2007. + [BR12b,BR12,Ber10,BR09].

    +
  • +
  • +

    ProcEd a Web-based Editing Solution for Domain-Specific + Process-Engineering + [BGR09].

    +
  • +
  • +

    MontiWeb a modular development approach for + Web Information Systems (which was later succeeded by MontiWIS) + [DRRS09].

    +
  • +
  • +

    C++ and its sublanguages for expressions, statements and + definitions (but no generic types, no defines).

    +
  • +
  • +

    MontiCore itself uses a family of DSLs for the definition of + DSLs, i.e., their grammars. [HR17]

    +
  • +
+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/Download/index.html b/docs/Download/index.html new file mode 100644 index 0000000000..20568c24f1 --- /dev/null +++ b/docs/Download/index.html @@ -0,0 +1,869 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Downloads - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + +

Downloads

+ + + +

The following tools for MontiCore can be used from the command line and thus e.g. well be embedded in scripting. Their languages as well as related tooling are currently available for download:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ArtifactDescriptionDownload
MontiCore ToolTool for processing grammars.Link
MontiCore RuntimeMontiCore's runtime library.Link
Automaton Example ProjectExample project that can be used with the MontiCore CLI tool.Link
Automaton Example Project in GradleExample project that can be used with Gradle.Link
CD ToolTool for a Class Diagram language.Link
FACT ToolTool for a Feature Diagram language.Link
FeatureConfiguration ToolTool for a Feature Diagram language.Link
FeatureConfigurationPartial ToolTool for a Feature Diagram language.Link
FeatureDiagram ToolTool for a Feature Diagram language.Link
MLC ToolTool for grouping MontiCore language components.Link
OCL ToolTool for an Object Constraint Language.Link
OD4Data ToolTool for an Object Diagram language.Link
OD4Report ToolTool for an Object Diagram language.Link
SD4Development ToolTool for a Sequence Diagram language.Link
Statecharts ToolTool for a Statechart language.Link
JSON ToolTool for a JSON language.Link
XML ToolTool for an XML language.Link
+

Please note the MontiCore 3-Level License of these tools.

+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/Eclipse.png b/docs/Eclipse.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fe32ce2d7cbb3d87a1519c59749fdac1dc6d0d GIT binary patch literal 161388 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 + + + + + + + + + + + + + + + + + + + + + + + + Getting Started - MontiCore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + + +
+
+
+ + + + +
+
+ + + + + +

Getting Started with MontiCore

+

This page describes the technical installation and usage of MontiCore for +language developers. This page further inspects a simple example grammar and the +Java classes and other artifacts generated from this grammar. After installing +MontiCore as described on this page, it can be used to develop new modeling +languages and generators as described in subsequent chapters.

+

MontiCore provides a command line interface (CLI) tool and can easily be used +with Gradle. The Gradle integration enables developers to easily employ +MontiCore in commonly used integrated development environments (IDEs), such as +Eclipse and IntelliJ IDEA. We strongly recommend to work through the section +about the CLI tool first. The CLI section contains information about an example +MontiCore project and the files generated by MontiCore. It also shortly explains +some key features of MontiCore.

+

Detailed information about all configuration options that can be used in +the MontiCore CLI tool and in MontiCore Gradle projects are explained in +Chapter 16 of the handbook. More +information about the example Automata language are available in +Chapter 21 of the handbook.

+

Prerequisites: Installing the Java Development Kit

+

We start with the JDK: Please perform the following steps to install the +Java Development Kit (JDK) and validate that the installation was successful:

+
    +
  • Install a JDK with at least version 11 provided by Oracle or OpenJDK.
  • +
  • Make sure the environment variable JAVA_HOME points to the installed JDK, and + not to the JRE, e.g., the following would be good:
      +
    • /user/lib/jvm/java-11-openjdk on UNIX or
    • +
    • C:\Program Files\Java\jdk-11.* on Windows. +You will need this in order to run the Java compiler for compiling +the generated Java source files.
    • +
    +
  • +
  • Also make sure that the system variable is set such that the Java + compiler can be used from any directory. JDK installations on UNIX + systems do this automatically. On Windows systems, the bin + directory of the JDK installation needs to be appended to the PATH + variable, e.g. %PATH%;%JAVA_HOME%.
  • +
  • Test whether the setup was successful. Open a command line shell in + any directory. Execute the command javac -version. If this command + is recognized and the shell displays the version of the installed + JDK (e.g., javac 11.0.5), then the setup was successful.
  • +
+

Now we have the prerequisites to run MontiCore from the command line. +The JDK installation is also required for using MontiCore with Gradle.

+

Install and Use the MontiCore Command Line Interface

+

This section describes instructions to perform the following first steps +to use MontiCore as an CLI tool:

+
    +
  • Installation of the MontiCore distribution file.
  • +
  • Grammar inspection
  • +
  • Running the MontiCore generator
  • +
  • Compiling the product
  • +
  • Running the product, i.e. the Automata tool with an example model + example/PingPong.aut.
  • +
+

Installation

+

For installing MontiCore, perform the following steps:

+
    +
  • Download the example Automata MontiCore project: +
    // MontiCore zip distribution source
    +https://www.monticore.de/download/monticore.tar.gz
    +
  • +
  • Unzip the archive. The unzipped files include a directory called + mc-workspace containing the executable MontiCore tool + monticore.jar along with a directory src containing + handwritten Automata DSL infrastructure, a directory hwc + containing handwritten code that is incorporated into the generated + code, and a directory example containing an example model of the + Automata DSL. +
    // MontiCore zip distribution content in directory mc-workspace
    +Automata.mc4
    +monticore.jar
    +monticore-rt.jar
    +src/automata/AutomataTool.java
    +src/automata/visitors/CountStates.java
    +src/automata/prettyprint/PrettyPrinter.java
    +src/automata/cocos/AtLeastOneInitialAndFinalState.java
    +src/automata/cocos/StateNameStartsWithCapitalLetter.java
    +src/automata/cocos/TransitionSourceExists.java
    +hwc/automata/_ast/ASTState.java
    +hwc/automata/_symboltable/AutomatonSymbol.java
    +hwc/automata/_symboltable/AutomataSymbols2Json.java
    +hwc/automata/_symboltable/AutomatonSymbolDeser.java
    +hwc/automata/_symboltable/AutomataGlobalScope.java
    +example/PingPong.aut
    +
  • +
+

Inspect the Example Grammar

+

MontiCore is a language workbench. It supports developers in developing +modular modelling languages. The core of MontiCore is its grammar +modelling language (cf. Chapter 4 of the MontiCore handbook), +which is used by developers for modelling +context-free grammars. A MontiCore grammar defines (parts of) the +abstract and concrete syntax of a language. Each grammar contains +nonterminals, production rules, and may extend other grammars. At most +one rule is marked as the start rule.

+

It is a key feature of MontiCore that it allows a grammar to reuse and extend other grammars. +In an extension all the nonterminals +defined in the extended grammars can be reused or even overridden. This +form of extension allows to achieve several effects:

+
    +
  • Language (i.e. grammar) components can be reused and integrated in + larger languages, composed of several components.
  • +
  • Individual nonterminals can be reused (like classes) from a library.
  • +
  • A given language can be extended, allowing to add additional + alternatives inside a language.
  • +
+

Component grammars and grammar extensions are detailedly discussed in +Chapter 4 of the MontiCore handbook.

+
grammar Automata extends de.monticore.MCBasics {
+
+  symbol scope Automaton =
+    "automaton" Name "{" (State | Transition)* "}" ;
+
+  symbol State =
+    "state" Name
+    (("<<" ["initial"] ">>" ) | ("<<" ["final"] ">>" ))*
+    ( ("{" (State | Transition)* "}") | ";") ;
+
+  Transition =
+    from:Name "-" input:Name ">" to:Name ";" ;
+}
+
+
Listing 2.2: The Automata grammar.
+ +

In the following, we inspect the MontiCore grammar of the Automata +language. Navigate your file explorer to the unzipped mc-workspace +directory. The directory contains the file Automata.mc4. This file +contains the MontiCore grammar depicted in Listing 2.2. MontiCore grammars end with +.mc4.

+

The definition of a MontiCore grammar starts with the keyword grammar, +followed by the grammar's name. In this example, the grammar is +called Automata. The grammar's name is optionally followed by the +keyword extends and a list of grammars that are extended by the +grammar. In this example, the Automata grammar extends the grammar +de.monticore.MCBasics.

+
+
+ +Tip 2.3 MontiCore Key Feature: Composition +
+

The MontiCore language workbench allows to compose language components +by composing grammars and also to reuse all infrastructure, such as +context conditions, symbol table infrastructure, generator parts and +handwritten extensions.

+ +

In the example the Automata grammar extends the grammar +de.monticore.MCBasics and thus reuses its functionality.

+ +

MontiCore comes with an extensive library of predefined language +components.

+
+ +

Grammars can also have a package and import other grammars. If a grammar +has a package, then the package declaration must be the first statement +in the grammar and is of the form package QualifiedName where +package is a keyword and QualifiedName is an arbitrary qualified +name (e.g. de.monticore). The optional grammar imports follow the +package definition. Every import is of the form import +QualifiedName. The Automata example grammar file does neither +contain a package declaration nor imports. The grammar extended by the +Automata grammar is specified by its fully qualified name.

+

As usual in context-free grammars, production rules have a left-hand +side and a right-hand side. The left-hand side contains the possibly +annotated name of a nonterminal. The left-hand side is followed by the +terminal = and the right-hand side. Nonterminal names start with an +upper-case letter. For instance, the Automata grammar contains the +nonterminals Automaton, State, and Transition. A single +nonterminal can be provided with the start keyword. Then, the +nonterminal is the starting symbol of the grammar. If no nonterminal is +marked with start, then the first nonterminal of the grammar +becomes the starting symbol by default. In the Automata grammar, the +Automaton nonterminal is the starting symbol.

+

The other possible keywords for nonterminals influence the generated +classes for the abstract syntax tree as well as the generated symbol +table infrastructure. Details can be found in +Chapter 4 and Chapter 9 of the MontiCore handbook. +For example, the +Automaton nonterminal is marked with symbol and scope. The +keyword symbol makes the MontiCore generator generate a symbol +class for the nonterminal. Intuitively stated, the keyword scope +instructs the MontiCore generator to construct a symbol table +infrastructure that +opens a scope when the production is processed. The following sections +explain the effects of specifying the Automaton nonterminal with the +keywords symbol and scope in more detail. Terminals are surrounded +by quotation marks. The Automata grammar, for example, inter alia +contains the terminals automaton, state, {, }, and ;.

+

The right-hand sides of grammar productions consist of nonterminals, +terminals, and semantic predicates, may use cardinalities (*, +, +?), and introduce alternatives via the terminal | as known from +regular expressions. Details can be found in +Chapter 4 of the MontiCore handbook. +The right-hand side of +the production defining the nonterminal Automaton, for example, uses +the terminal automaton and the nonterminals Name, State, and +Transition. The nonterminal Name is not defined in the grammar +Automata. Thus, it must be defined in one of the extended grammars. In +this case, Name is defined in the grammar MCBasics and is reused by +the grammar Automata. For distinguishing different usages of +nonterminals on right-hand sides, they can be named. For example, the +right-hand side of the production defining the nonterminal Transition +uses the Name nonterminal twice. The first usage is named input and +the second usage is named to. MontiCore also supports interface and +external nonterminals for introducing extension points as detailedly +described in Chapter 4 of the MontiCore handbook. +However, the example grammar does not use these concepts.

+
automaton PingPong {
+  state NoGame <<initial>>;
+  state Ping;
+  state Pong <<final>>;
+
+  NoGame - startGame > Ping;
+
+  Ping - stopGame > NoGame;
+  Pong - stopGame > NoGame;
+
+  Ping - returnBall > Pong;
+  Pong - returnBall > Ping;
+}
+
+
Listing 2.4: A model conforming to the Automata grammar.
+ +

Listing 2.4 depicts an example model conforming to the Automata grammar in its +concrete syntax. +It depicts a simple game of Ping Pong. The automaton consists of three states: +the initial state NoGame, such as the states Ping and Pong, for +identifying on which side the ball is located. +Initially, the automaton starts in the state NoGame. +The game starts at the corresponding event. +During a run, the automaton switches states by returning the ball from one +side to the other. +Additionally, it can be stopped at each stage of the game, resulting in the +initial configuration. +You can find the model in the file PingPong.aut +contained in the example directory of the unzipped mc-workspace +directory.

+

Run MontiCore

+

The MontiCore generator takes a MontiCore grammar as input and generates +an infrastructure for processing models conforming to the grammar. When +a grammar E extends another grammar G, then all the +infrastructure generated for the grammar G is reused and only the +extending part from E is generated.

+
+
+ +Tip 2.5 Infrastructure Generated by MontiCore +
+MontiCore itself as well as the infrastructure generated by the +MontiCore generator are implemented in Java. This infrastructure +includes: + +
    +
  • a parser for parsing models conforming to the grammar and + transforming textual models into abstract syntax tree instances + abstracting from the concrete syntax.
  • +
  • a symbol table infrastructure to handle the symbols introduced or + used by models conforming to the grammar. The symbol table + infrastructure is used for resolving dependencies between model + elements that are possibly defined in different files.
  • +
  • a context-condition checking framework for checking + well-formedness rules that cannot be captured by context-free + languages.
  • +
  • a visitor infrastructure for traversing models respectively their + abstract syntax instances. The abstract syntax of a model consists + of its internal representation as an abstract syntax tree + abstracting from the concrete syntax of the model (the instance of + the data structure obtained from parsing) and the symbol table of + the model.
  • +
  • a mill infrastructure for retrieving objects for language + processing, such as parsers, builders for abstract syntax trees, + visitors and objects for the symbol tables of the language. + A mill serves as a dynamic factory, adapting to the current + modeling language. The + possibility to configure the mills is crucial for reusing the + functionality implemented for a sublanguage (cf. Section 5.9, + Section 5.10.2, and Section 11.5 for details).
  • +
  • a code generating framework that extends the FreeMarker template + engine [Fre21] by various modularity enhancing features.
  • +
+ +
+ +

For executing MontiCore using the Automata grammar as input, perform +the following steps:

+
    +
  1. Open a command line shell and change the working directory to the + unzipped directory (mc-workspace).
  2. +
  3. Execute the following command in order to generate the language + infrastructure of the Automata DSL: +
    java -jar monticore.jar -g Automata.mc4 -hcp hwc/ src/ -mp monticore-rt.jar
    +
    +The only required argument Automata.mc4 denotes the input grammar +that shall be processed by MontiCore. The processing includes the +generation of the language infrastructure. Using the option -hcp +enables specifying the path to a directory containing the +handwritten code that is to be incorporated into the generated +infrastructure. In this case, passing the argument hwc/ to the +option -hcp makes MontiCore consider the handwritten code located +in the directory hwc/. Providing handwritten code enables to +easily incorporate additional functionality into the generated code. +For example, this enables developers to extend generated abstract +syntax classes as detailedly described in +(cf. Section 5.10 of the MontiCore handbook). +Passing the argument -mp enables specifying the paths to directories +or archives +containing paths to grammars and Java classes that are imported by the +processed grammar and the related tooling. In this case, the archive +monticore-rt.jar contains the grammars and handwritten extensions +of the monticore standard library. +More information about the standard library can be found in +Chapters 17- 20 of the handbook.
  4. +
+

Executing the command launches MontiCore, which results in the +executing of the following steps:

+
    +
  1. The specified grammar is parsed and processed by MontiCore.
  2. +
  3. Java source files for the corresponding DSL infrastructure are + generated into the default output directory out. This + infrastructure consists of the directories
      +
    • out/automata/ containing the mill (cf. Section 5.9, Section 5.10.2, Section 11.5).
    • +
    • out/automata/_ast containing the abstract syntax tree data + structure (cf. Chapter 5 of the MontiCore handbook).
    • +
    • out/automata/_auxiliary containing adapted mills of sublanguages, + which are required for configuring the mills of sublanguages + (cf. Chapter 11 of the MontiCore handbook).
    • +
    • out/automata/_cocos containing the infrastructure for context + conditions (cf. Chapter 10 of the MontiCore handbook).
    • +
    • out/automata/_od containing the infrastructure for printing + object diagrams for reports produced during processing the + models.
    • +
    • out/automata/_parser containing the generated parsers, which are + based on ANTLR (cf. Chapter 6 of the MontiCore handbook).
    • +
    • out/automata/_symboltable containing the infrastructure for the symbol + table (cf. Chapter 6 of the MontiCore handbook).
    • +
    • out/automata/_visitor containing the infrastructure for visitors + (cf. Chapter 9 of the MontiCore handbook).
    • +
    • out/reports/automata containing reports created during the + processing of the grammar.
    • +
    +
  4. +
  5. The output directory also contains a log file of the executed + generation process with the generation time in its name.
  6. +
+

In the following, we review the classes and interfaces generated from +the Automata grammar that are relevant for language engineers in more +detail. We do not review the classes and interfaces that are only +internally relevant for MontiCore and are usually not intended to be +used by language engineers.

+

Abstract Syntax Tree Data Structure

+

The tree data structure is generated into the directory out/automata/_ast. +Details about the generation of AST classes can be found in +(cf. Chapter 5 of the MontiCore handbook). For +each nonterminal contained in the grammar, the MontiCore generator +produces AST and corresponding builder classes. The AST classes +implement the abstract syntax tree data structure.

+

The builder classes implement the builder pattern for constructing +instances of the respective AST classes as usual. For example, the class +ASTAutomaton is the AST class generated for the Automaton +nonterminal (cf. Listing 2.2) and the class ASTAutomatonBuilder is the +corresponding generated builder class.

+

Parts of the AST data structure generated for the Automata grammar.

+

+
Figure 2.6: Parts of the AST data structure generated for the Automata grammar.
+ +

The contents of the AST and builder classes are generated systematically +from the grammar. The attributes of each AST class resemble the +right-hand side of the corresponding production rule. In the following, +we mainly speak of attributes, but please be aware that all attributes +come fully equipped with access and modification methods, which should +normally be used.

+

For instance, Figure 2.6 depicts parts of the generated AST infrastructure for +the Automata grammar. The class ASTAutomaton contains the attributes +name, states, and transitions. The AST class does not contain an +attribute for the terminal automaton as it is part of every word +conforming to the production of the Automaton nonterminal. The type of +the attribute name is String whereas the attributes states and +transitions are lists of the types of the AST classes corresponding +to the used nonterminals. This is the case because exactly one Name is +parsed with the right-hand side of the production of the nonterminal +Automaton, whereas multiple states and transitions can be parsed.

+

The ASTAutomaton class further contains the attributes symbol, +spannedScope, and enclosingScope. These attributes are specific to +the symbol table of Automata models and are used for linking the +symbol table of a model with its abstract syntax tree. Details can be +found in Chapter 9 of the MontiCore handbook.

+
+
+ +Tip 2.7 Generated Symbols and Scopes in the AST +
+

Each AST class contains access to the enclosingScope.

+ +

When a production contains the keyword symbol, the generated AST class +contains the attribute symbol +(see Chapter 9 of the MontiCore handbook).

+ +

Keyword scope indicates that a nonterminal also defines a new local +scope, stored in attribute spannedScope.

+ +

The parser builds the abstract syntax tree of a model and the available +scope genitor creates the symbol table of the model, consisting of +symbols and scopes.

+
+ +

The ASTAutomaton class further contains several straight-forward +methods for checking different instances for equality and accessing the +attributes. Similar to the ASTAutomaton class, the +ASTAutomatonBuilder class contains attributes resembling the +right-hand side of the corresponding production. It further contains +methods for changing the values of the attributes (e.g., addState), +checking whether the AST instance that would be constructed from the +current builder state is valid (cf. isValid), and for building the +AST instance corresponding to the builder's state (cf. build). The +contents of the other AST and Builder classes are constructed +analogously.

+
+
+ +Tip 2.8 Handwritten AST Class Extensions +
+

If the generator detects that an AST class for a nonterminal is +already implemented in the handwritten code, then it produces a +corresponding TOP AST class instead.

+ +

This TOP mechanism allows developers to add handwritten extensions to +any generated class, while reusing the generated TOP class via +extension.

+ +

This gives a very close integration between handwritten and generated +code that even adapts builders accordingly, while preventing the very +bad habit of performing manual changes to the generated code.

+ +

Option -hcp tells the generator where to look for handwritten +integrations.

+
+ +

The following section presents the methods of the classes for parsing +textual models (possibly stored in files) into AST class instances at +runtime. For now, it suffices for you to understand that (1) MontiCore +generates an extensible AST data structure that resembles the +nonterminals and productions of the grammar in a straight-forward way +and (2) that all models of a grammar have an AST data structure +representation for internal processing.

+

Parser

+

The infrastructure is generated into the directory out/automata/_parser. +Details about the generated parsers and their uses are described in +Chapter 6 of the MontiCore handbook.

+

Parts of the class AutomataParser generated from the Automata +grammar.

+

+
Figure 2.9: Parts of the class AutomataParser generated from the Automata grammar.
+ +

Parts of the generated class AutomataParser are depicted in Figure 2.9. The +class implements the generated parser for the Automata grammar. +Usually, developers are solely concerned with the methods +parse(String) and parse_String(String). For now, it suffices if you +remember that parsing textual Automata models stored in files is +possible by calling the method parse(String) of an AutomataParser +object with the fully qualified name of the file as input.

+
+
+ +Tip 2.10 Methods for Parsing +
+

The class AutomataParser contains the methods

+ +
    +
  • parse(Reader r),
  • +
  • parse(String filename), and
  • +
  • parse_String(String content).
  • +
+ +

All of the methods return an object of type Optional<ASTAutomaton>, +where absence means failure of parsing and errors have been issued.

+ +

For each nonterminal in the grammar, the class further contains methods +for parsing a sub-model described by this nonterminal.

+
+ +

Symbol Table

+

The infrastructure is generated into the directory out/automata/_symboltable. +Details about the generated symbol table infrastructure and its use are +described in Chapter 9 of the MontiCore handbook. +The symbol table infrastructure is used for resolving +cross-references concerning information defined in different model +elements that are potentially defined in different models stored in +different files.

+

+
Figure 2.11: The scope classes generated from the `Automata` grammar.
+ +
+
+ +Tip 2.12 Scope Classes +
+

For the Automata grammar, the generator produces the classes

+ +
    +
  • AutomataScope,
  • +
  • AutomataArtifactScope, and
  • +
  • AutomataGlobalScope
  • +
+ +

as well as respective interfaces. The relationships between these +classes and interfaces are depicted in Figure 2.11.

+ +

The singleton AutomataGlobalScope contains all +AutomataArtifactScopes of all loaded Automata artifacts. +AutomataScopes represent scopes spanned inside of models.

+
+ +

+
Figure 2.13: Parts of the symbol classes generated from the Automata grammar.
+ +

Figure 2.13 depicts parts of the symbol classes generated for the Automata +grammar. As the nonterminal State is annotated with symbol in the +Automata grammar, the generator produces the class StateSymbol. The +StateSymbol class, inter alia, contains the attributes name, +enclosingScope, and spannedScope. The attribute name stores the +name of the symbol. The attributes enclosingScope and spannedScope +store the enclosing and spanned scopes of the symbol. The class further +contains methods for accessing and setting the attributes. For all +symbol classes, the MontiCore generator also produces builder classes +(e.g., AutomataArtifactScopeBuilder and StateSymbolBuilder).

+
+
+ +Tip 2.14 Extending Symbol Classes +
+

It is possible to add further methods and attributes in two ways:

+ + +
+ +

The generated class AutomataScopesGenitor is responsible for creating +the scope structure of Automata artifacts and linking the scope +structure with the corresponding AST nodes. For this task, it provides +the method createFromAST that takes an ASTAutomaton instance as +input and returns an IAutomataArtifactScope instance. The returned +IAutomataArtifactScope instance can be added as a subscope to the +(during runtime unique and administrated by the mill) +AutomataGlobalScope instance.

+

Developers can create visitors for complementing the symbol table +(creating symbols and filling the extensions introduced via symbol rules +or the TOP mechanism) of an Automata artifact. After creating the +scope structure, the visitor should be used to traverse the AST +instance of the artifact for complementing the symbols and scopes. The +following sections explain the generated visitor infrastructure in more +detail.

+
Optional<AutomatonSymbol> resolveAutomaton(String name)
+List<AutomatonSymbol> resolveAutomatonMany(String name)
+Optional<StateSymbol> resolveState(String name)
+List<StateSymbol> resolveStateMany(String name)
+
+
Listing 2.15: Different resolve methods.
+ +

For each nonterminal annotated with symbol in the grammar Automata, +the scope interfaces contain a symbol-specific resolve method taking a +string as input. The method can be called to resolve symbol instances by +their names. The name given as input to a resolve method should be as +qualified as needed to find the symbol. For instance, Listing 2.15 lists the +signatures of four of the resolve methods provided by the interface +IAutomataScope.

+

For now, it suffices for you to understand that (1) MontiCore generates +an extensible symbol table data structure that resembles the scope and +symbol structure as specified in the grammar in a straight-forward way +and (2) that all models of a grammar have a symbol table data structure +representation for internal processing and (3) that symbols can be +resolved from scopes via calling the resolve methods.

+

(De)Serialization of Symbol Tables

+

MontiCore also supports the serialization and deserialization of symbol tables. The +(de)serialization is crucial for incremental code generation and +efficient language composition via aggregation. Details about this are +explained in Chapter 7 and Chapter 9 of the MontiCore handbook.

+

For the (de)serialization, the generator produces the class +AutomataSymbol2Json. It provides the public methods store and +load. The former can be used to serialize IAutomataScope instances +into their string representations encoded in JSON and persisting these +to a file at a location that is passed as method argument. The latter +can be used to load a stored IAutomataScope into its objects +representation. For now, it suffices that you understand which methods +to call for the (de)serialization.

+

Visitor

+

+
Figure 2.16: Parts of the visitor infrastructure generated from the Automata grammar
+ +

The infrastructure is generated into the directory out/automata/_visitor. +Details about the generated visitor infrastructure are described in +Chapter 8 of the MontiCore handbook. +For each grammar, the generator systematically produces several classes +and interfaces implementing the visitor infrastructure. For the +Automata grammar, for example, the generator produces the interfaces +AutomataTraverser, AutomataVisitor2, and AutomataHandler and the +class AutomataTraverserImplementation. The relationships between these +interfaces and classes are depicted in Figure 2.16.

+

The interfaces Traverser, Visitor2 and Handler together realize +the Visitor pattern. Conceptually, the traverser is the entry point for +traversing. The traverser manages visitors for the different +sublanguages and realizes the default traversing strategy. Whenever an +AST node is traversed, the traverser delegates the visit to the +corresponding visitor implementation. If a special traversal is to be +implemented that differs from the default, it is possible to add +handlers to the traverser that realize the alternative traversal. For a +more detailed explanation consider reading +Chapter 8 of the MontiCore handbook.

+
+
+ +Tip 2.17 Visitors +
+

MontiCore provides the visitor pattern in a detangled and thus flexible +variant.

+ +

AutomataTraverser is traversing the AST. AutomataVisitor2 contain +the actual functionalities, added through subclassing. Many visitors can +be added to the traverser for parallel execution via the method +add4Automata.

+
+ +

The visitors are compositional, allowing to maximize reuse of visitors +from sublanguages, and they can be adapted through the TOP mechanism.

+

For example, the handwritten class PrettyPrinter, which can be found +in the directory mc-workspace/src/automata/prettyprint, implements +functionality for pretty printing an Automata model, which is given by +its abstract syntax tree. Listing 2.18 depicts the attributes and the constructor of +the class. The PrettyPrinter class implements the AutomataHandler +interface. Its constructor instantiates a printer (a helper for printing +indented strings) and retrieves an AutomataTraverser object from the +mill (which is explained later on). It sets the handler of the traverser +to itself. This ensures that the pretty printer becomes the handler of +the traverser. We will execute it in a following section.

+
public class PrettyPrinter implements AutomataHandler {
+  private final IndentPrinter printer;
+  private AutomataTraverser traverser;
+
+  public PrettyPrinter() {
+    this.printer = new IndentPrinter();
+    this.traverser = AutomataMill.traverser();
+    traverser.setAutomataHandler(this);
+  }
+// further methods
+}
+
+
Listing 2.18: Attributes and constructor of the PrettyPrinter for the Automata language.
+ +

For now, you should understand that (1) for implementing visitors it is +often sufficient to implement the visitor interfaces and to add them to +a traverser and (2) custom traversals can be realized by implementing +handlers and adding those to the traverser.

+

Context Conditions

+

The infrastructure is generated into the directory out/automata/_cocos. +Details about the generated context condition infrastructure are +described in Chapter 10 of the MontiCore handbook.

+

For each nonterminal of a grammar, the generator produces a context +condition interface for implementing context conditions for this +nonterminal. For the Automata grammar, for example, the generator +produced the interface AutomataASTStateCoCo. The interface solely +contains the method check(ASTState). Each class implementing the +interface should represent a predicate over subtrees of abstract syntax +trees starting at a node with the type corresponding to the nonterminal.

+

The check method should be implemented such that it reports an error or +a warning if the input node does not satisfy the predicate. Thus, +context conditions implement well-formedness rules that cannot be +captured by context-free grammars (or that are intentionally not +captured by the grammar to achieve a specific AST data structure). For +producing the error or warning, the static methods error and warning +of the MontiCore runtime class Log should be used.

+

For the Automata grammar, the generator also produced the class +AutomataCocoChecker. For each nonterminal of the grammar, the class +contains a method for adding context condition instances to an +AutomataCocoChecker instance. For checking whether an AST node +satisfies all registered context conditions, the method checkAll can +be called with the AST node as input. Calling the method makes the +checker traverse the abstract syntax tree and check whether each node +satisfies the context conditions registered for the node. Thus, +AutomataCocoChecker instances represent sets of context conditions +that are required to be satisfied by abstract syntax tree instances.

+

For now, you should understand that (1) implementing context conditions +is possible via implementing the generated CoCo interfaces and (2) +context conditions can be checked via instantiating the Checker class, +adding the CoCos, and calling the checkAll method.

+

Mill as Factory for Builders

+

The for the Automata language is generated into the directory +out/automata/. Details about the generated mill and the mill pattern +in general are described in Section 11.5. The generated mill class AutomataMill is +responsible for providing ready to use and correct parser, scope +genitor, scope, and builder instances. The mill of each language is a +singleton.

+
+
+ +Tip 2.19 Mill Use and Automatic Initialization +
+

A mill is a factory for builders and other commonly used functions, such +as parsers or visitors. The mill was introduced to ensure +compositionality of languages, while retaining reusability of functions +developed for sublanguages.

+ +

Only one mill instance exists, even though in composed languages it is +available under several static signatures. Let language G2 extend +another language G1. Then G2Mill initializes the G1Mill +appropriately, such that all the code of the sublanguage G1 can be +reused in the tools developed for the language G2, even when creating +new AST nodes, symbols, etc.

+ +

Cool mechanism and the developers don't have to bother.

+
+ +
public static IAutomataGlobalScope globalScope()
+public static IAutomataArtifactScope artifactScope()
+public static IAutomataScope scope()
+public static AutomataScopesGenitor scopesGenitor ()
+public static AutomataScopesGenitorDelegator scopesGenitorDelegator()
+public static ASTAutomatonBuilder automatonBuilder()
+public static AutomatonSymbolBuilder automatonSymbolBuilder()
+public static AutomataParser parser()
+public static AutomataTraverser traverser ()
+
+
Listing 2.20: Some method of the AutomataMill.
+ +

Developers should retrieve all instances of the classes and interfaces +provided by the mill by using the mill. Instances of the classes and +interfaces that are provided by the mill should never be instantiated +manually. Otherwise, it may be the case that not all of the code +implemented for the language can be reused as expected in other +languages extending the language. Listing 2.20 shows some signatures of the methods +of the AutomataMill.

+
+
+ +Tip 2.12 Mill Methods +
+

A mill provides public static methods for retrieving the instances of +the parsers, scope genitors, scopes, and builders. For that is acts like +a factory. Because a mill is realized using the static delegator pattern +(cf. Section 11.1), it still can be adapted at will.

+ +

This combines the advantage of general availability with the advantage +of being able to override the functions.

+
+ +

For now, you should understand that (1) the methods of the mill should +be used for creating ready to use and correct parser, scope genitor, +scope, and builder instances and (2) how to call these methods.

+

Compile the Target

+

Section 2.2.3 of the MontiCore handbook +describes how to generate the desired Java code +from a MontiCore grammar. For these Java classes, generated for the +Automata DSL, execute the following command in the mc-workspace:

+

With Powershell on Windows +

javac -cp monticore-rt.jar -sourcepath "src/;out/;hwc/" `
+                                  src/automata/AutomataTool.java
+
+With Bash on Unix +
javac -cp monticore-rt.jar -sourcepath "src/:out/:hwc/" \
+                                  src/automata/AutomataTool.java
+
+With cmd on Windows +
javac -cp monticore-rt.jar -sourcepath "src/;out/;hwc/" ^
+                                  src/automata/AutomataTool.java
+

+

Please note, on Unix systems paths are separated using ":" (colon) +instead of semicolons.

+

Providing the option -cp with the argument monticore-cli.jar makes +the Java compiler consider the compiled MontiCore runtime classes +contained in the file monticore-cli.jar.

+

The option -sourcepath enables to specify paths to directories +containing the source files that should be considered during the +compilation.

+

In this case, executing the command makes the Java compiler consider all +generated classes located in and all handwritten classes located in src and hwc. +The last argument instructs the Java compiler to compile the class +src/automata/AutomataTool.java.

+

Please note that the structure of the handwritten classes follows the +package layout of the generated code, i.e. there are the following sub +directories (Java packages):

+
    +
  • src/automata contains the top-level language realization for using + the generated DSL infrastructure. In this case the class + src/automata/AutomataTool.java constitutes a main class executable + for processing automata models with the automata DSL.
  • +
  • src/automata/cocos contains infrastructure for context condition + of the automata DSL.
  • +
  • src/automata/prettyprint contains an exemplary use of the + generated visitor infrastructure for processing parsed models for + pretty printing.
  • +
  • src/automata/visitors contains an exemplary analysis using the + visitor infrastructure. The exemplary analysis counts the states + contained in the parsed automata model.
  • +
  • hwc/automata/_ast contains an exemplary usage of the handwritten + code integration mechanism for modifying the AST for the automata + DSL. Details about the integration mechanism are described in Section 5.10.
  • +
  • hwc/automata/_symboltable contains handwritten extensions of the + generated symbol table infrastructure. Details about implementing + handwritten symbol table infrastructure extensions are described in + Chapter 9 of the MontiCore handbook.
  • +
+

Please, also do not mix the code for the Automata tool vs. the code +for the final product, generated from that tool, although both have a +similar package structure.

+

We already described the contents of the directories hwc/automata/_ast +and hwc/automata/_symboltable in the previous section. They contain +handwritten extensions of the abstract syntax of the Automata +language.

+
public class CountStates implements AutomataVisitor2 {
+  private int count = 0;
+
+  @Override
+  public void visit(ASTState node) {
+    count++;
+  }
+
+  public int getCount() {
+    return count;
+  }
+}
+
+
Listing 2.22: The CountStates visitor implementation
+ +

The directory src/automata/visitors contains the file +CountStates.java. The class is depicted in Listing 2.22. It implements a simple +visitor for counting the number of states contained in an Automata +model. To this effect, it implements the AutomataVisitor2 interface. +It has an attribute count of type int for storing the current number +of counted nodes. It overrides the visit method for ASTState to +increase the counter whenever a state is visited.

+

The directory src/automata/cocos contains the context-condition +implementations for the Automata language.

+
public class AtLeastOneInitialAndFinalState
+       implements AutomataASTAutomatonCoCo {
+@Override
+  public void check(ASTAutomaton automaton) {
+    boolean initialState = false;
+    boolean finalState = false;
+
+    for (ASTState state : automaton.getStateList()) {
+      if (state.isInitial()) {
+        initialState = true;
+      }
+      if (state.isFinal()) {
+        finalState = true;
+      }
+    }
+
+    if (!initialState || !finalState) {
+      // Issue error...
+      Log.error("0xA0116 An automaton must have at least one initial 
+                 and one final state.",
+          automaton.get_SourcePositionStart());
+    }
+  }
+}
+
+
Listing 2.23: Context condition implementation for checking that +there exist at least one initial and at least one +final state.
+ +

Listing 2.23 depicts the class AtLeastOneInitialAndFinalState. The class implements +a context condition for checking whether an Automata model contains at +least one initial and at least one final state. To this effect, the +class implements the interface AutomataASTAutomatonCoCo. The class +StateNameStartsWithCapitalLetter is implemented similarly.

+
public class TransitionSourceExists
+                 implements AutomataASTTransitionCoCo {
+
+  @Override
+  public void check(ASTTransition node) {
+
+    IAutomataScope enclosingScope = node.getEnclosingScope();
+    Optional<StateSymbol> sourceState =
+        enclosingScope.resolveState(node.getFrom());
+
+    if (!sourceState.isPresent()) {
+      // Issue error...
+      Log.error(
+        "0xADD03 Source state of transition missing.",
+         node.get_SourcePositionStart());
+    }
+  }
+}
+
+
Listing 2.24: Context condition implementation for checking that +states used in transitions exist.
+ +

Listing 2.24 presents the implementation of the class TransitionSourceExists. The +class implements a context condition for checking whether the source +states used in transitions are defined. To this effect, the class uses +the resolving mechanisms of the symbol table. For each transition, the +context conditions tries to resolve the state symbol corresponding to +the source state of the transition. If the resolving fails for the +state, then the context condition logs an error.

+

The class AutomataTool is the main class of the Automata language. +It is defined in the file AutomataTool.java contained in the directory +src/automata.

+
public class AutomataTool extends AutomataToolTOP {
+  // main method missing in this listing
+
+  public ASTAutomaton parse(String model) {
+    try {
+      AutomataParser parser = new AutomataParser() ;
+      Optional<ASTAutomaton> optAutomaton = parser.parse(model);
+
+      if (!parser.hasErrors() && optAutomaton.isPresent()) {
+        return optAutomaton.get();
+      }
+      Log.error("0xEE840 Model could not be parsed.");
+    }
+    catch (RecognitionException | IOException e) {
+      Log.error("0xEE640 Failed to parse " + model, e);
+    }
+    System.exit(1);
+    return null;
+  }
+}
+
+
Listing 2.25: Methods for parsing and creating symbol tables.
+ +

Listing 2.25 presents the implementation of the method parse of the AutomataTool +class which can be used for parsing Automata models. The class extends the +generated abstract superclass AutomataToolTOP that provides methods to be used in +the run method. One example is the method createSymbolTable that uses the global scope +and genitors available in the mill to create a symbol table for Automata.

+
public static void main(String[] args) {
+  // delegate main to instantiatable method for better integration,
+  // reuse, etc.
+  new AutomataTool().run(args);
+}
+
+public void run(String[] args) {
+
+  // use normal logging (no DEBUG, TRACE)
+  AutomataMill.init();
+  Log.ensureInitalization();
+
+  Options options = initOptions();
+  try {
+    //create CLI Parser and parse input options from commandline
+    CommandLineParser cliparser = new org.apache.commons.cli.DefaultParser();
+    CommandLine cmd = cliparser.parse(options, args);
+
+    //help: when --help
+    if (cmd.hasOption("h")) {
+      printHelp(options);
+      //do not continue, when help is printed.
+      return;
+    }
+    //version: when --version
+    else if (cmd.hasOption("v")) {
+      printVersion();
+      //do not continue when help is printed
+      return;
+    }
+
+    Log.info("Automata DSL Tool", "AutomataTool");
+
+    if (cmd.hasOption("i")) {
+      String model = cmd.getOptionValue("i");
+      final ASTAutomaton ast = parse(model);
+      Log.info(model + " parsed successfully!", "AutomataTool");
+
+      AutomataMill.globalScope().setFileExt("aut");
+      IAutomataArtifactScope modelTopScope = createSymbolTable(ast);
+      // can be used for resolving things in the model
+      Optional<StateSymbol> aSymbol = modelTopScope.resolveState("Ping");
+      if (aSymbol.isPresent()) {
+        Log.info("Resolved state symbol \"Ping\"; FQN = "
+            + aSymbol.get().toString(),
+          "AutomataTool");
+      } else {
+        Log.info("This automaton does not contain a state called \"Ping\";",
+          "AutomataTool");
+        }
+      runDefaultCoCos(ast);
+
+      if(cmd.hasOption("s")){
+        String storeLocation = cmd.getOptionValue("s");
+        storeSymbols(modelTopScope, storeLocation);
+      }
+
+      // analyze the model with a visitor
+      CountStates cs = new CountStates();
+      AutomataTraverser traverser = AutomataMill.traverser();
+      traverser.add4Automata(cs);
+      ast.accept(traverser);
+      Log.info("Automaton has " + cs.getCount() + " states.", "AutomataTool");
+      prettyPrint(ast,"");
+    }else{
+      printHelp(options);
+    }
+  } catch (ParseException e) {
+    // e.getMessage displays the incorrect input-parameters
+    Log.error("0xEE752 Could not process AutomataTool parameters: " + e.getMessage());
+  }
+}
+
+
Listing 2.26: Main method of the AutomataTool class
+ +

The AutomataTool provides a main method, which can be called from +the command line. The implementation of the method is depicted in Listing 2.26. It +expects two inputs. The first is the name of a file containing an +Automata model. The second input is the name of the file in which the +tool should store the symbol table of the model given as first input.

+

The method

+
    +
  • parses the input model,
  • +
  • creates the symbol table,
  • +
  • resolves a state,
  • +
  • executes context conditions,
  • +
  • stores the symbol table by using the serialization,
  • +
  • executes the visitor for counting the states, and
  • +
  • pretty prints the model to the standard output.
  • +
+

Inspect the main method and try to understand the implementation for the +executed tasks. Read the above descriptions again if necessary.

+

Run the Tool

+

The previous command compiles the handwritten and generated code +including the Automata tool class AutomataTool. For running the +Automata DSL tool, execute the following command:

+

With Powershell on Windows +

java -cp "src/;out/;hwc/;monticore-rt.jar" `
+                    automata.AutomataTool -i example/PingPong.aut `
+                    -s st/PingPong.autsym
+
+With Bash on Unix +
java -cp "src/:out/:hwc/:monticore-rt.jar" \
+                    automata.AutomataTool -i example/PingPong.aut \
+                    -s st/PingPong.autsym
+
+With cmd on Windows +
java -cp "src/;out/;hwc/;monticore-rt.jar" ^
+                    automata.AutomataTool -i example/PingPong.aut ^
+                    -s st/PingPong.autsym
+

+

Please note again, on Unix systems paths are separated using ":" +(colon) instead of semicolons. Executing the command runs the Automata +DSL tool.

+

Using the option -cp makes the Java interpreter consider the compiled +classes contained in the paths specified by the argument.

+

The argument automata.AutomataTool makes the Java interpreter execute +the main method of the class automata.AutomataTool contained in the +directory src.

+

The argument example/PingPong.aut is passed to the main method of the +Automata DSL tool class as input. Inspect the output on the command +line, which displays log messages concerning the processing of the +example Automata model.

+

The last argument st/PingPong.autsym is also passed to the main +method. It makes the tool store the serialized symbol table of the input +model into the file example/PingPong.aut.

+

The shipped example Automata DSL (all sources contained in +mc-workspace/src and mc-workspace/hwc) can be used as a starting +point for creating your own language. It can easily be altered to +specify your own DSL by adjusting the grammar and the handwritten Java +sources and rerunning MontiCore as described above.

+

Using MontiCore via Gradle From the Command Line

+

It is possible to execute MontiCore via the MontiCore plugin. A detailed +description about using the MontiCore Gradle plugin is given in +Chapter 16 of the MontiCore handbook. This +section describes the execution of MontiCore via a Gradle plugin from +the command line shell by example. Before you start, +install gradle +and make sure that you can use it from the command line.

+

The shipped example Automata DSL can be used as a starting point and +can be downloaded here:

+
https://www.monticore.de/download/Automaton.zip
+
+

The build script (file build.gradle) can easily be adapted for creating build +scripts for other languages. For executing MontiCore via the Gradle +plugin from the command line shell by example of the Automata DSL, +perform the following steps:

+
    +
  1. Download the Automata example.
  2. +
  3. Unzip the downloaded zip file into an arbitrary directory.
  4. +
  5. Open a shell and change your working directory to the directory in + which you unzipped the downloaded file (the directory containing the + file build.gradle).
  6. +
  7. Execute Gradle in the shell:
      +
    • If you are using a Windows shell, execute the command + gradle build.
    • +
    • If you are using a Unix shell, execute the command + ./gradle build.
    • +
    +
  8. +
+

When executing the above commands, MontiCore launches, which results in +the execution of the following steps:

+
    +
  1. The grammars specified in the build.gradle are incrementally parsed + and processed by MontiCore.
  2. +
  3. Java source files for the corresponding DSL infrastructure are + generated into the default output directory + ../target/generated-sources/monticore/sourcecode. The contents of + this generated directory are equal to the contents of the generated + directory out as described in .
  4. +
+

Using MontiCore in Eclipse

+

The MontiCore plugin can be used in Eclipse. Section 2.4.1 describes the process of setting +up Eclipse. Section 2.4.2 presents how to import the example project in Eclipse. +Finally, Section 2.4.3 explains how the MontiCore Gradle plugin can be executed in +Eclipse.

+

Setting up Eclipse

+

Before you import the example project and run MontiCore as a Gradle +plugin, please make sure that a current version of the Gradle plugin is +installed in Eclipse. When installing a new version of Eclipse, the +Gradle plugin is installed by default. If the Gradle plugin is not yet +integrated into your Eclipse installation, download the latest Eclipse +version or perform the following steps to install the Eclipse plugin:

+
    +
  1. Download and install Eclipse (or use an existing one).
  2. +
  3. Open Eclipse.
  4. +
  5. Install the needed Plugins.
      +
    • Help > Eclipse Marketplace...
    • +
    • Type 'gradle' in the search box and click Enter.
    • +
    • Install the 'Buildship Gradle Integration' plugin.
    • +
    +
  6. +
  7. Make sure to configure Eclipse to use an JDK instead of an JRE.
      +
    • Window > Preferences > Java > Installed JREs.
    • +
    +
  8. +
+

Importing the Example

+

The shipped example Automata DSL can be used as a starting point. Once +imported into Eclipse, it can easily be altered to specify your own DSL +by adjusting the grammar and the handwritten Java sources and rerunning +MontiCore as described in Section 2.4.3. To import the example, perform the following +steps:

+
    +
  1. Download and unzip the Automata example: +
    http://www.monticore.de/download/Automaton.zip
    +
  2. +
  3. Open Eclipse and select
      +
    • File > Import > Gradle (if you are required to choose a Gradle + version, then choose version 7.4.1) > Existing Gradle + Projects > Next.
    • +
    • Click on the Browse.. button and import the directory that + contains the file build.gradle from the Automata example.
    • +
    +
  4. +
+

Running MontiCore

+

To execute the MontiCore Gradle plugin, perform the following steps:

+
    +
  • Select the Gradle Task menu (at the top or bottom, depending on + your installed Eclipse version).
  • +
  • There select automaton > build > build (double click).
  • +
+

This makes Eclipse execute the MontiCore Gradle plugin as described in +Section 2.3 of the MontiCore handbook . +After installing and executing MontiCore in Eclipse, your workspace +should look similar to Figure 2.27.

+

+
Figure 2.27: Eclipse after importing the example project and executing MontiCore
+ +

Using MontiCore in IntelliJ IDEA

+

The MontiCore plugin can be used in IDEA. Section 2.5.1 describes the process of +setting up IntelliJ IDEA. Afterwards, Section 2.5.2 presents how to import the example +project in Eclipse. Finally, Section 2.5.3 explains how the MontiCore Gradle plugin +can be executed in IntelliJ IDEA.

+

Setting up IntelliJ IDEA

+

For setting up IntelliJ IDEA, perform the following steps:

+
    +
  1. Download and install IntelliJ IDEA (or use your existing installation).
      +
    • Hint for Students: You get the Ultimate version of IntelliJ IDEA + for free.
    • +
    +
  2. +
  3. Open IntelliJ IDEA.
  4. +
+

Importing the Example

+

The shipped example Automata DSL can be used as a starting point. Once +imported into IntelliJ IDEA, it can easily be altered to specify your +own DSL by adjusting the grammar and the handwritten Java sources and +rerunning MontiCore as described in Section 2.5.3. For importing the example, perform +the following steps:

+
    +
  1. Download and unzip the Automata example: +
    http://www.monticore.de/download/Automaton.zip
    +
  2. +
  3. In the IDE select: File > Open.
  4. +
  5. Select the directory containing the build.gradle (if you are + required to choose a Gradle version, then choose version 6.7.1).
  6. +
+

Running MontiCore

+

To execute the MontiCore Gradle plugin, perform the following steps:

+
    +
  • Select the Gradle Projects menu on the right.
  • +
  • From there select automaton > Tasks> build > build (double click).
  • +
+

This makes IntelliJ IDEA execute the Gradle plugin as described in Section 2.3. If +you do not see the Gradle Projects menu yet, right-click on the +build.gradle file and select 'Import Gradle Project'. Now the Gradle +Projects menu should occur on the right side and you can follow the +above mentioned steps for the execution. After installing and executing +MontiCore in IntelliJ IDEA, your workspace should look similar to Figure 2.28.

+

+
Figure 2.28: IntelliJ IDEA after importing +the example project and executing MontiCore
+ + + + + + +
Fre21FreeMarker website. https://freemarker.apache.org/, 2021.
+ +

Using MontiCore with GitPod

+

Installing all the prerequisites and an IDE can take some time. +Alternatively to this, you can use Gitpod, an open-source +Kubernetes application for ready-to-code developer environments. It already +has all the prerequisites and an operational Web IDE similar to Microsoft's +Visual Studio Code installed. You need to login with an existing GitHub account +to use it.

+

This link can be used +to access the Gitpod project for the Automata language. +First, an environment for the project with the proper Java and Gradle version +will be prepared and initialized automatically. +After that, you will be directed to the Web IDE. The project will be built +with Gradle first, and after that it is ready-to-use. The Web IDE also has a +built-in terminal which can be used to build the project via gradle build +or execute other tasks.

+

The Web IDE can be used to change existing project files, such as the Automata +grammar or the handwritten classes for the language. Simply navigate to the grammars +or classes in the file explorer on the left-hand side of the IDE and edit the files. +This makes experimenting with MontiCore possible. The changes will be compiled by the +IDE immediately and compilation errors will be marked with red color. To run the project, +execute the command gradle build in the terminal.

+

You will notice that the link to the Gitpod project is generated and always +has the same pattern. +An example for a link is https://indigo-ostrich-8psdfoer.ws-eu18.gitpod.io. +After 30 minutes of non-use, Gitpod will "freeze" the environment. +It can be reactivated by using the same link to access it. The environment is +reactivated, and you do not even need to rebuild the project with Gradle to use +the project again.

+

Further Information

+ + + + + + + +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/IntelliJ-IDEA.png b/docs/IntelliJ-IDEA.png new file mode 100644 index 0000000000000000000000000000000000000000..2abfe31a2f45badfe91840ca2773c17f0e37b096 GIT binary patch literal 169826 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