grammar org.eclipse.viatra.solver.language.Problem with org.eclipse.xtext.common.Terminals import "http://www.eclipse.org/emf/2002/Ecore" as ecore import "http://www.eclipse.org/viatra/solver/language/model/Problem" Problem: ("problem" name=Identifier ".")? statements+=Statement*; Statement: ClassDeclaration | EnumDeclaration | PredicateDefinition | Assertion | ScopeDeclaration; ClassDeclaration: abstract?="abstract"? "class" name=Identifier ("extends" superTypes+=[Relation|QualifiedName] ("," superTypes+=[Relation|QualifiedName])*)? ("{" (referenceDeclarations+=ReferenceDeclaration ";"?)* "}" | "."); EnumDeclaration: "enum" name=Identifier ("{" (literals+=EnumLiteral ("," literals+=EnumLiteral)* ("," | ";")?)? "}" | "."); EnumLiteral returns Node: name=QuotedOrUnquotedId; ReferenceDeclaration: (containment?="contains" | "refers")? referenceType=[Relation|QualifiedName] ("[" multiplicity=Multiplicity "]")? name=Identifier ("opposite" opposite=[ReferenceDeclaration|QualifiedName])?; PredicateDefinition: (error?="error" "pred"? | "pred") name=Identifier "(" (parameters+=Parameter ("," parameters+=Parameter)*)? ")" (":-" bodies+=Conjunction (";" bodies+=Conjunction)*)? "."; Parameter: parameterType=[Relation|QualifiedName]? name=Identifier; Conjunction: literals+=Literal ("," literals+=Literal)*; Literal: Atom | NegativeLiteral; NegativeLiteral: "!" atom=Atom; Atom: relation=[Relation|QualifiedName] transitiveClosure?="+"? "(" (arguments+=Argument ("," arguments+=Argument)*)? ")"; Argument: variableOrNode=[VariableOrNode|QualifiedName]; Assertion: (relation=[Relation|QualifiedName] "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")" ":" value=LogicValue | value=ShortLogicValue? relation=[Relation|QualifiedName] "(" (arguments+=[Node|QualifiedName] ("," arguments+=[Node|QualifiedName])*)? ")") "."; enum LogicValue: TRUE="true" | FALSE="false" | UNKNOWN="unknown"; enum ShortLogicValue returns LogicValue: FALSE="!" | UNKNOWN="?"; ScopeDeclaration: "scope" typeScopes+=TypeScope ("," typeScopes+=TypeScope)* "."; TypeScope: targetType=[ClassDeclaration] (increment?="+=" | "=") multiplicity=DefiniteMultiplicity; Multiplicity: UnboundedMultiplicity | DefiniteMultiplicity; DefiniteMultiplicity returns Multiplicity: RangeMultiplicity | ExactMultiplicity; UnboundedMultiplicity: {UnboundedMultiplicity}; RangeMultiplicity: lowerBound=INT ".." upperBound=UpperBound; ExactMultiplicity: exactValue=INT; UpperBound returns ecore::EInt: INT | "*"; QuotedOrUnquotedId: QUOTED_ID | Identifier; QualifiedName: QUOTED_ID | Identifier (":" Identifier)* (":" QUOTED_ID)?; Identifier: ID | "true" | "false"; @Override terminal STRING: '"' ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | '"'))* '"'; terminal QUOTED_ID: "'" ('\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\' | "'"))* "'";