Skip to main content



      Home
Home » Modeling » TMF (Xtext) » Trigger new rule after creating cross reference
Trigger new rule after creating cross reference [message #1407030] Mon, 11 August 2014 14:02 Go to next message
Eclipse UserFriend
I'm new with Xtext, and I've been working in a small DSL that uses an ecore model.
In my DSL, I have a RoleType with attributes and operations like this.

RoleType returns crom::RoleType:
    {crom::RoleType}
    'role' name=EString (Extends tr_extends=[crom::RoleType])?
    '{'
        (attributes+=Attribute | operations+=Operation)*
    '}';


When I define a new role I have to do something like this:

compartment myCompartment {
	rolemodel:
	role A {
		
	}
	role B {
		
	}
	constraints:
	total A -> B;
	
}


And later on I can create contraints between roles

Constraint returns crom::Constraint:
	(RoleConstraint | RelationshipConstraints | ComplexConstraint) ';'?;
RoleConstraint returns crom::RoleConstraint:
	RoleImplication | RoleEquivalence | RoleProhibition;


RoleImplication returns crom::RoleImplication:
	(first=[crom::RoleType|QualifiedName] ('implies' | '->' | '>') second=[crom::RoleType|QualifiedName] |
	second=[crom::RoleType|QualifiedName] ('<-' | '<') first=[crom::RoleType|QualifiedName]) ';';


But the thing is, when I create a new Role and define a new Constraint I should create a RoleTypeInheritance rule.

RoleTypeInheritance returns crom::RoleInheritance:
	{crom::RoleInheritance}
	super=[crom::RoleType|QualifiedName] sub=[crom::RoleType|QualifiedName];


I'm not sure if I made myself clear. In conclusion I want to create an instance of RoleTypeInheritance when I create a new Constraint.

Thanks in advance,
Rodrigo.
Re: Trigger new rule after creating cross reference [message #1407064 is a reply to message #1407030] Mon, 11 August 2014 16:01 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

i did not get your actual problem. can you please elaborate ...
Re: Trigger new rule after creating cross reference [message #1407067 is a reply to message #1407064] Mon, 11 August 2014 16:12 Go to previous messageGo to next message
Eclipse UserFriend
if you want to write one thing and derive implcitely other things have a look at IDerivedStateComputer
http://xtextcasts.org/episodes/18-model-optimization
Re: Trigger new rule after creating cross reference [message #1407071 is a reply to message #1407064] Mon, 11 August 2014 16:24 Go to previous messageGo to next message
Eclipse UserFriend
OK, sorry, I will try to reformulate my question.

When I define a contraint using my DSL I am using the role I created called RoleImplication. But I want to use underneath the role RoleTypeInheritance. Because we have different types of Contraints like RoleImplication, RoleEquivalence, RoleProhibition, but in the end all contraints are RoleTypeInheritance from two differents RoleType in my Constraint.

Try in a different way.

Here I define my roles using the rule RoleType.

        rolemodel:
        role A {
		
	}
	role B {
		
	}


And latter on I use the rules that I created to define contraints between them.
The rule is called constraint and it uses the RoleTypes I defined before.
Since I have different types of constraints I should declare a rule for each type.
(RoleImplication, RoleEquivalence, RoleProhibition)

        constraints:
	A -> B;


But, the a constraint, in my case, define a relationship between two roles and this relationship is represented by RoleTypeInheritance.

My question is, having a constraint A->B (RoleImplication) how can I link them using the role RoleTypeInheritance? I think it should be done probably at the linking phase, but I don't know how. Any Ideas?

Thanks.
Re: Trigger new rule after creating cross reference [message #1407079 is a reply to message #1407071] Mon, 11 August 2014 16:50 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

i still do not understand where the problem is. you simply want to introduce a common supertype.

simply write a rule that you do no call

Parent: Child1 | ... | ChildN;
Re: Trigger new rule after creating cross reference [message #1407323 is a reply to message #1407079] Tue, 12 August 2014 06:27 Go to previous messageGo to next message
Eclipse UserFriend
It doesn't fulfill my needs.
Because, I can have different types: DataType, NaturalType, CompartmentType, RoleType and so on.
And I have different Constraints: RoleImplication, RoleEquivalence, RoleProhibition and so on.
If I have just types without constraints they are only types. But if I define a constraint between them (e.g. A -> B), so they become members of CompartmentTypeInheritance, only if I define the constraint. Got it?

I was trying to manipulate the resource class in my generator, but I don't know if this is a valid approach.

Thanks for your help.
Re: Trigger new rule after creating cross reference [message #1407335 is a reply to message #1407323] Tue, 12 August 2014 07:14 Go to previous messageGo to next message
Eclipse UserFriend
No

can you please pseudocode the ast you want and the ast you get (maybe as java classes)
Re: Trigger new rule after creating cross reference [message #1407367 is a reply to message #1407335] Tue, 12 August 2014 08:55 Go to previous messageGo to next message
Eclipse UserFriend
This is my grammar

//Main model element
Model returns crom::Model:
	{crom::Model}
	(elements+=ModelElement | relations+=ModelRelations)*;

ModelRelations returns crom::Relation:
	Fulfillment ';'?;

ModelElement returns crom::ModelElement:
	Group | RigidType;

	//Basic terminals
enum Direction returns crom::Direction:
	Undirected='--' | FirstToSecond='-->' | SecondToFirst='<--';

EString returns ecore::EString:
	STRING | ID;

QualifiedName:
	ID ('.' ID)*;

Extends:
	'extends' | ':';

Fills:
	'fills' | 'can play' | '-|>';

	//Definition of basic model element properties
Attribute returns crom::Attribute:
	name=ID ':' type=[crom::RigidType|EString] ';'; //TODO: Replace ESTRING with QualifiedName

Parameter returns crom::Parameter:
	{crom::Parameter}
	name=ID ':' type=[crom::RigidType|EString]; //TODO: Replace ESTRING with QualifiedName

Operation returns crom::Operation:
	name=ID
	'(' (params+=Parameter ("," params+=Parameter)*)? ')' ':' type=[crom::RigidType|EString] //TODO: Replace ESTRING with QualifiedName
	'{'
	operation=EString
	'}';

	//Definition of basic model elements
RigidType returns crom::RigidType:
	DataType | NaturalType | CompartmentType;

Group returns crom::Group:
	{crom::Group}
	'group' name=EString
	'{'
	(elements+=ModelElement)*
	('relations:'
	(relations+=ModelRelations)*)?
	'}';

DataType returns crom::DataType:
	{crom::DataType}
	(serializable?='serializable')?
	'data' name=EString (Extends tr_extends=[crom::DataType])? //TODO: Replace ESTRING with QualifiedName
	'{'
	(attributes+=Attribute | operations+=Operation)*
	'}';

NaturalType returns crom::NaturalType:
	{crom::NaturalType}
	'natural' name=EString (Extends tr_extends=[crom::NaturalType])? //TODO: Replace ESTRING with QualifiedName
	'{'
	(attributes+=Attribute | operations+=Operation)*
	'}';

	//Definition of Compartments
CompartmentType returns crom::CompartmentType:
	{crom::CompartmentType}
	'compartment' name=EString (Extends tr_extends=[crom::CompartmentType])? //TODO: Replace ESTRING with QualifiedName
	'{'
	('interface:' (attributes+=Attribute | operations+=Operation)*)?
	('rolemodel:' (parts+=Part | relationships+=Relationship)*)?
	('constraints:' (constraints+=(Constraint))*)?
	'}';

CompartmentTypeInheritance returns crom::CompartmentInheritance:
	{crom::CompartmentInheritance}
	super=[crom::CompartmentType|QualifiedName] sub=[crom::CompartmentType|QualifiedName];

Part returns crom::Part:
	('[' lower=INT '..' upper=INT ']' |
	'[' lower=INT '..' '*' ']' |
	//	  '[' lower=PInt ']' | //TODO: find out how this might work
	'[*]')?
	role=AbstractRole;

AbstractRole returns crom::AbstractRole:
	RoleType | RoleGroup;

RoleType returns crom::RoleType:
	{crom::RoleType}
	'role' name=EString (Extends tr_extends=[crom::RoleType])?
	'{'
	(attributes+=Attribute | operations+=Operation)*
	'}';

RoleTypeInheritance returns crom::RoleInheritance:
	{crom::RoleInheritance}
	super=[crom::RoleType|QualifiedName] sub=[crom::RoleType|QualifiedName];

RoleGroup returns crom::RoleGroup:
	'rolegroup' name=EString
	(('#' | 'selecting') lower=INT ('..' | 'upto') upper=INT |
	('#' | 'selecting') lower=INT ('..' | 'upto') '*' |
	('#' | 'selecting') '*')?
	'{'
	(elements+=RoleGroupElement (elements+=RoleGroupElement)*)?
	'}';

RoleGroupElement returns crom::RoleGroupElement:
	RoleType | RoleGroup | AbstractRoleReference;

AbstractRoleReference returns crom::AbstractRoleRef:
	ref=[crom::AbstractRole|QualifiedName] (';')?;

Relationship returns crom::Relationship:
	name=ID '(' first=Place direction=Direction second=Place ')'
	(':' tr_constraints+=IntraRelationshipConstraint (',' tr_constraints+=IntraRelationshipConstraint)*)?;

Place returns crom::Place:
	holder=[crom::RoleType|QualifiedName]
	('[' lower=INT '..' upper=INT ']' |
	'[' lower=INT '..' '*' ']' |
	'[*]')?;

	//Definition of Constraints
Constraint returns crom::Constraint:
	(RoleConstraint | RelationshipConstraints | ComplexConstraint) ';'?;

RoleConstraint returns crom::RoleConstraint:
	RoleImplication | RoleEquivalence | RoleProhibition;

RoleImplication returns crom::RoleImplication:
	(first=[crom::RoleType|QualifiedName] ('implies' | '->' | '>') second=[crom::RoleType|QualifiedName] |
	second=[crom::RoleType|QualifiedName] ('<-' | '<') first=[crom::RoleType|QualifiedName]) ';';

RoleEquivalence returns crom::RoleEquivalence:
	first=[crom::RoleType|QualifiedName] ('equals' | '<->' | '<>') second=[crom::RoleType|QualifiedName] ';';

RoleProhibition returns crom::RoleProhibition:
	first=[crom::RoleType|QualifiedName] ('prohibits' | '><' | '>-<') second=[crom::RoleType|QualifiedName] ';';

RelationshipConstraints returns crom::RelationshipConstraint:
	IntraRelationshipConstraint | InterRelationshipConstraint;

IntraRelationshipConstraint returns crom::IntraRelationshipConstraint:
	({crom::Total} 'total' |
	{crom::Cyclic} 'cyclic' |
	{crom::Irreflexive} 'irreflexive' |
	{crom::ParthoodConstraint} kind=Parthood);

InterRelationshipConstraint returns crom::InterRelationshipConstraint: //TODO: Replace ESTRING with QualifiedName
	{crom::RelationshipImplication}
	(first=[crom::Relationship|EString] ('subset of' | '==>') second=[crom::Relationship|EString] |
	second=[crom::Relationship|EString] ('superset of' | '<==') first=[crom::Relationship|EString]);

enum Parthood returns crom::Parthood:
	ExclusivePart='exclusivepart' | SharablePart='sharablepart' | EssentialPart='essentialpart' |
	MandatoryPart='mandatorypart' | InseparablePart='inseparablepart';

	//Definition of Fulfillment 
Fulfillment returns crom::Fulfillment:
	filler=[crom::RigidType] Fills filled=[crom::AbstractRole|QualifiedName];

	//continue the definition
ComplexConstraint returns crom::ComplexConstraint:
	'invariant' 'using' targets+=[crom::AbstractRole|QualifiedName] ("," targets+=[crom::AbstractRole|QualifiedName])*
	'ensure' expression=EString;


And this is a language generated with my grammar

compartment myCompartment {
	rolemodel:
	role A {
		
	}
	role B extends A {
		
	}
	role C {
		
	}
	
	role D {
		
	}
	
	[*] role E {
		
	}
	[0..10] role F {
		
	}
	constraints:
	total A -> B;
	B -> C;
}


When I create a contraint between two roles I should create a RoleTypeInheritance as well because, now, they have a relationship.
Got it?
Re: Trigger new rule after creating cross reference [message #1407386 is a reply to message #1407367] Tue, 12 August 2014 09:37 Go to previous messageGo to next message
Eclipse UserFriend
so B -> C actually creates 2 objects?
Re: Trigger new rule after creating cross reference [message #1407391 is a reply to message #1407386] Tue, 12 August 2014 09:50 Go to previous messageGo to next message
Eclipse UserFriend
Yeap. Exactly.
Re: Trigger new rule after creating cross reference [message #1407393 is a reply to message #1407391] Tue, 12 August 2014 09:54 Go to previous messageGo to next message
Eclipse UserFriend
this is why i proposed you an iderivedstatecomputer in the first place
Re: Trigger new rule after creating cross reference [message #1407399 is a reply to message #1407393] Tue, 12 August 2014 09:58 Go to previous message
Eclipse UserFriend
Ok. Thanks I will get a better look on it.
Previous Topic:Cross-file references as in 15-min tutorial not working
Next Topic:Xtext editor does not reflect changes in linked resources
Goto Forum:
  


Current Time: Sat Jul 05 09:15:39 EDT 2025

Powered by FUDForum. Page generated in 0.10329 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top