Class members reference with xtext [message #1797650] |
Sat, 03 November 2018 19:15  |
Eclipse User |
|
|
|
Hi all
I have implemented the grammar(please, see it below) and there are classes(aka database tables) and operations. I want to add class members to expressions.
I know that variable reference can be implemented something like the following
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true' | 'false') |
{VariableRef} value=[VariableDeclaration];
but maybe it's possible to add the link on the class member reference? Something like this.
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true' | 'false') |
{VariableRef} value=[VariableDeclaration]|
{ClassMemberRef} value=[ClassDefinition.member];
I need it to use it in the type checking and also check that given member really there are in the given class
I know that with content independent grammar is impossible, but maybe it's possible in XText?
Regards,
Vladimir
My grammar is
grammar org.blockchain.rell.Rell with org.eclipse.xtext.common.Terminals
generate rell "http://www.blockchain.org/rell/Rell"
Model:
entities+=ClassDefinition*
operations+=Operation*;
ClassDefinition:
'class' name=ID ('extends' superType=[ClassDefinition])? '{'
attributes+=Attribute*
'}';
Operation:
"operation" name=ID "(" parameters=RelAttrubutesList? ")" "{" statements+=Statement* "}";
Statement:
( relation=Relational | variable=Variable | varInit=VariableInit) ';';
Variable:
declaration=VariableDeclaration (('=' expression=Expression)?);
Relational:
Update | Delete | Create;
Update:
'update' entity=[ClassDefinition] '(' conditions=Conditions? ')' '{' variableList+=UpdateVariableInit
(',' variableList+=UpdateVariableInit*)? '}';
Delete:
'delete' entity=[ClassDefinition] '(' conditions=Conditions? ')';
Create:
'create' entity=[ClassDefinition] '(' conditions=Conditions? ')';
Conditions:
elements+=ConditionElement (',' elements+=ConditionElement*)?;
ConditionElement:
name=ID ('==' | '!=' | '>' | '<' | '>=' | '<=') expr=Expression;
VariableInit:
name=[VariableDeclaration] '=' expression=Expression;
UpdateVariableInit:
name = ID '=' expression=Expression
;
Expression:
or=Or;
Or returns Expression:
And ({Or.left=current} "or" right=And)*;
And returns Expression:
Equality ({And.left=current} "and" right=Equality)*;
Equality returns Expression:
Comparison ({Equality.left=current} op=("==" | "!=")
right=Comparison)*;
Comparison returns Expression:
PlusOrMinus ({Comparison.left=current} op=(">=" | "<=" | ">" | "<")
right=PlusOrMinus)*;
PlusOrMinus returns Expression:
MulOrDiv (({Plus.left=current} '+' | {Minus.left=current} '-')
right=MulOrDiv)*;
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true' | 'false') |
{VariableRef} value=[VariableDeclaration];
MulOrDiv returns Expression:
Primary ({MulOrDiv.left=current} op=('*' | '/')
right=Primary)*;
Primary returns Expression:
'(' Expression ')' |
{Not} "not" expression=Primary |
Atomic;
RelAttrubutesList:
value+=VariableDeclaration (',' value+=VariableDeclaration)*;
Attribute:
modificator=Prefix? variable=VariableDeclaration ';';
VariableDeclaration:
name=ID ':' type=TypeReference;
TypeReference:
primitive=PrimitiveType | entityType=ClassType;
PrimitiveType:
primitiveType=(Text | Integer | Json | ByteArray | Boolean);
ClassType:
entityRef=[ClassDefinition];
Boolean:
'bool';
Json:
'json';
Integer:
'integer' | 'timestamp';
Text:
'text' | 'tuid' | 'name';
ByteArray:
'byte_array' | 'signer' | 'guid' | 'pubkey';
Prefix:
'key' | 'index';
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.14472 seconds