From 8a7b9b436b31e6d2f5a0521a077c960ebdeb4cbe Mon Sep 17 00:00:00 2001 From: Oszkar Semerath Date: Tue, 28 Apr 2020 20:43:04 +0200 Subject: initial commit --- .../solver/language/GenerateSolverLanguage.mwe2 | 49 +++++++ .../viatra/solver/language/SolverLanguage.xtext | 154 +++++++++++++++++++++ .../language/SolverLanguageRuntimeModule.xtend | 11 ++ .../language/SolverLanguageStandaloneSetup.xtend | 15 ++ .../generator/SolverLanguageGenerator.xtend | 25 ++++ .../scoping/SolverLanguageScopeProvider.xtend | 15 ++ .../validation/SolverLanguageValidator.xtend | 25 ++++ 7 files changed, 294 insertions(+) create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/GenerateSolverLanguage.mwe2 create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguage.xtext create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageRuntimeModule.xtend create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageStandaloneSetup.xtend create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/generator/SolverLanguageGenerator.xtend create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/scoping/SolverLanguageScopeProvider.xtend create mode 100644 Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend (limited to 'Application/org.eclipse.viatra.solver.language/src') diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/GenerateSolverLanguage.mwe2 b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/GenerateSolverLanguage.mwe2 new file mode 100644 index 00000000..7f95e737 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/GenerateSolverLanguage.mwe2 @@ -0,0 +1,49 @@ +module org.eclipse.viatra.solver.language.GenerateSolverLanguage + +import org.eclipse.xtext.xtext.generator.* +import org.eclipse.xtext.xtext.generator.model.project.* + +var rootPath = ".." + +Workflow { + + component = XtextGenerator { + configuration = { + project = StandardProjectConfig { + baseName = "org.eclipse.viatra.solver.language" + rootPath = rootPath + runtimeTest = { + enabled = true + } + eclipsePlugin = { + enabled = true + } + eclipsePluginTest = { + enabled = true + } + createEclipseMetaData = true + } + code = { + encoding = "UTF-8" + lineDelimiter = "\r\n" + fileHeader = "/*\n * generated by Xtext \${version}\n */" + } + } + language = StandardLanguage { + name = "org.eclipse.viatra.solver.language.SolverLanguage" + fileExtensions = "vsc" + + serializer = { + generateStub = false + } + validator = { + // composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator" + // Generates checks for @Deprecated grammar annotations, an IssueProvider and a corresponding PropertyPage + generateDeprecationValidation = true + } + junitSupport = { + junitVersion = "5" + } + } + } +} diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguage.xtext b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguage.xtext new file mode 100644 index 00000000..17a329ad --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguage.xtext @@ -0,0 +1,154 @@ +grammar org.eclipse.viatra.solver.language.SolverLanguage with org.eclipse.xtext.common.Terminals +import "http://www.eclipse.org/emf/2002/Ecore" as ecore +generate solverLanguage "http://www.eclipse.org/viatra/solver/language/SolverLanguage" + +Problem: + statements+=Statement*; +Statement: Interpretation | Predicate; + +@Override terminal STRING returns ecore::EString: '"' ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|'"') )* '"'; +REALLiteral returns ecore::EBigDecimal: '-'? INT '.' INT; +INTLiteral returns ecore::EInt: '-'? INT; +BooleanValue: {BooleanTrue} 'true' | 'false' {BooleanFalse}; +TruthValue: {True} 'true' | {False} 'false' | {Unknown} 'unknown' | {Error} 'error' ; + + +/////////////////// +// Core grammar +/////////////////// +Interpretation: BasicInterpretation | DefaultInterpretation | CDInterpretation; + +BasicInterpretation: symbol=Symbol '(' objects+=ComplexObject* ')' ':' value = TruthValue; + +Symbol: ModelSymbol | PartialitySymbol | DataSymbol; + +ModelSymbol: name = ID; + +PartialitySymbol: ExistSymbol | EqualsSymbol; +ExistSymbol:'exists'{ExistSymbol}; +EqualsSymbol:'equals' {EqualsSymbol}; + +DataSymbol: BooleanSymbol | IntegerSymbol | RealSymbol | StringSymbol; +BooleanSymbol:'bool' {BooleanSymbol}; +IntegerSymbol:'int' {IntegerSymbol}; +RealSymbol: 'real' {RealSymbol}; +StringSymbol:'string' {StringSymbol}; + +ComplexObject: Object | AllInstances | AllObjects; + +Object: NamedObject | UnnamedObject | DataObject; +NamedObject: "'" name = ID "'"; +UnnamedObject: name = ID; +DataObject: BooleanObject | IntObject | RealObject | StringObject; +BooleanObject: value = BooleanValue; +IntObject: value = INTLiteral; +RealObject: value = REALLiteral; +StringObject: value = STRING; + +/////////////////// +// Predicte grammar +/////////////////// +Predicate: PredicateSymbol | ErrorPredicate; +PredicateSymbol: + 'predicate' symbol = ModelSymbol '(' parameters += Parameter* ')' ':' ('false' | (bodies += PatternBody ('|' bodies += PatternBody)*)) '.' +; +ErrorPredicate: + {ErrorPredicate} 'error' (name = ID)? ('(' parameters += Parameter* ')') ':' ('false' | (bodies += PatternBody ('|' bodies += PatternBody)*)) '.' +; + +Parameter: variable = Variable (':' type = Symbol)?; +PatternBody: {PatternBody} ('true' | constraints += Constraint*) ; +Polarity: {Positive} '+' | {Negative} '-'; +Constraint: (polarity = Polarity)? symbol = ModelSymbol ( + ( '(' params += Literal* ')') | (closureType = ClosureType '(' params += Literal params += Literal ')')); + +ClosureType: {ReflexiveClosure} '*' | {IrreflexiveClosure} '+'; +Literal: Variable | DataObject; +Variable: name = ID; + +/////////////////// +// Complex Interpretation grammar +/////////////////// + +AllInstances: ':' symbol = Symbol; +AllObjects: {AllObjects} '*'; + +/////////////////// +// Defaul Interpretation grammar +/////////////////// +DefaultInterpretation: 'default' interpretation = BasicInterpretation; + +/////////////////// +// Advanced Class-Diagram interpretations +/////////////////// +CDInterpretation: ClassInterpretation | EnumInterpretation| GlobalRelationInterpretation; +ClassInterpretation: + abstract?='abstract' 'class' symbol = ModelSymbol ('extends' supertypes += ModelSymbol+)?'{' + fielt += FieldRelationInterpretation* + '}' +; +EnumInterpretation: 'enum' Symbol = ModelSymbol '{' objects+=NamedObject+ '}'; +FieldRelationInterpretation: containment ?= 'containment' symbol = ModelSymbol ':' multiplicity = MultiplicityDefinition? target = Symbol; +GlobalRelationInterpretation: containment ?= 'containment' 'relation' symbol = ModelSymbol ':' sourceMultiplicity = MultiplicityDefinition? source = Symbol targetMultiplicity = MultiplicityDefinition? target = Symbol; +MultiplicityDefinition: lower = INT '..' (upper = INT | unlimitedUpper?='*'); + +////SymbolIntroduction : Type | GlobalRelation | Predicate; +////Symbol: Type | Relation | Predicate | Variable | Element; +// +////////////////////// +//// Types +////////////////////// +// +//Type: TypeDeclaration | /*TypeDefinition |*/ TypeEnumeration; +// +//TypeDeclaration: +// abstract?= 'abstract' 'class' name = ID ('extends' supertypes += [Type] (',' supertypes += [Type])) '{' +// fieldDeclarations += FieldRelationDeclaration* +// '}' +//; +//TypeEnumeration: +// 'enum' name = ID 'extends' supertypes += [Type] (',' supertypes += [Type]) '{' +// (elements += Element)* +// '}' +//; +//Element: +// name = ID +//; +// +////////////////////// +//// Relations +////////////////////// +// +//Relation: FieldRelationDeclaration | GlobalRelationDeclaration | RelationEnumeration; +//GlobalRelation returns Relation: GlobalRelationDeclaration | /*RelationDefinition |*/ RelationEnumeration; +// +//FieldRelationDeclaration: +// containment?='containment' target = [Type] name = ID +//; +// +//GlobalRelationDeclaration: +// containment?='containment' 'relation' name = ID '(' source = [Type] ',' target = [Type] ')' +//; +// +//RelationEnumeration: +// 'relation' name = ID '{' links += Link* '}' +//; +// +//Link: '(' source = Element ',' target = Element ')'; +// +// +// +// +// +// +//Model: +// 'model' '{' +// atoms += Atom (',' atoms += Atom ) +// '}' +//; +//Atom: referredSymbol = [Symbol] '(' (params += Element (',' params += Element)*)? ')'; +// +//ScopeDeclaration: +// 'scope' +//; +// diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageRuntimeModule.xtend b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageRuntimeModule.xtend new file mode 100644 index 00000000..343bc48a --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageRuntimeModule.xtend @@ -0,0 +1,11 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language + + +/** + * Use this class to register components to be used at runtime / without the Equinox extension registry. + */ +class SolverLanguageRuntimeModule extends AbstractSolverLanguageRuntimeModule { +} diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageStandaloneSetup.xtend b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageStandaloneSetup.xtend new file mode 100644 index 00000000..1ce7b1d8 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/SolverLanguageStandaloneSetup.xtend @@ -0,0 +1,15 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language + + +/** + * Initialization support for running Xtext languages without Equinox extension registry. + */ +class SolverLanguageStandaloneSetup extends SolverLanguageStandaloneSetupGenerated { + + def static void doSetup() { + new SolverLanguageStandaloneSetup().createInjectorAndDoEMFRegistration() + } +} diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/generator/SolverLanguageGenerator.xtend b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/generator/SolverLanguageGenerator.xtend new file mode 100644 index 00000000..0b8620e9 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/generator/SolverLanguageGenerator.xtend @@ -0,0 +1,25 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language.generator + +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.xtext.generator.AbstractGenerator +import org.eclipse.xtext.generator.IFileSystemAccess2 +import org.eclipse.xtext.generator.IGeneratorContext + +/** + * Generates code from your model files on save. + * + * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation + */ +class SolverLanguageGenerator extends AbstractGenerator { + + override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) { +// fsa.generateFile('greetings.txt', 'People to greet: ' + +// resource.allContents +// .filter(Greeting) +// .map[name] +// .join(', ')) + } +} diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/scoping/SolverLanguageScopeProvider.xtend b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/scoping/SolverLanguageScopeProvider.xtend new file mode 100644 index 00000000..6b92897c --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/scoping/SolverLanguageScopeProvider.xtend @@ -0,0 +1,15 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language.scoping + + +/** + * This class contains custom scoping description. + * + * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping + * on how and when to use it. + */ +class SolverLanguageScopeProvider extends AbstractSolverLanguageScopeProvider { + +} diff --git a/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend new file mode 100644 index 00000000..a7ff7252 --- /dev/null +++ b/Application/org.eclipse.viatra.solver.language/src/org/eclipse/viatra/solver/language/validation/SolverLanguageValidator.xtend @@ -0,0 +1,25 @@ +/* + * generated by Xtext 2.18.0.M3 + */ +package org.eclipse.viatra.solver.language.validation + + +/** + * This class contains custom validation rules. + * + * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#validation + */ +class SolverLanguageValidator extends AbstractSolverLanguageValidator { + +// public static val INVALID_NAME = 'invalidName' +// +// @Check +// def checkGreetingStartsWithCapital(Greeting greeting) { +// if (!Character.isUpperCase(greeting.name.charAt(0))) { +// warning('Name should start with a capital', +// SolverLanguagePackage.Literals.GREETING__NAME, +// INVALID_NAME) +// } +// } + +} -- cgit v1.2.3-54-g00ecf