All code to be executed in SMOL, with the exception of the main block, is
contained in classes. Classes define fields and methods. Classes are
instantiated in objects via the
new expression, all objects of a class
share the same methods and fields. Each object’s fields hold different state
that can change over time.
A class can have generic type parameters, field declarations, methods and a modelling bridge. Additionally a class may be abstract and contain abstract methods. An abstract class may containt non-abstract methods.
ClassDeclaration ::= 'abstract'? 'class' Identifier ( '<' Identifier (',' Identifier)* '>')? ('extends' Type )? '(' (FieldDeclaration (',' FieldDeclaration)* )? ')' ModelsDeclaration? MethodDefinition* 'end'
A field is declared using a type and a name.
hidden modifier disables semantic lifting for this field.
domain modifier moves the generated triples to the modelled node.
A field cannot be
FieldDeclaration ::= 'hidden'? 'domain'? Type Identifier
models declarations are used to connect object structure to semantic
reflection; see Section Modeling Bridge.
ModelsDeclaration ::= ('models' '(' Expression ')' StringLiteral ';')* 'models' StringLiteral ';'
rule method cannot have side-effects (no object creation, no writing field access), no parameters and can only call other
MethodDefinition ::= ConcreteMethod | AbstractMethod ConcreteMethod ::= 'rule'? 'domain'? 'override'? Type Identifier '(' (Type Identifier (',' Type Identifier)* )? ')' Statement* 'end' AbstractMethod ::= 'abstract' 'rule'? 'domain'? 'override'? Type Identifier '(' (Type Identifier (',' Type Identifier)* )? ')'