Why my grammar don't validate the program and how to fix it [message #1799110] |
Thu, 29 November 2018 20:47 |
kozhaev Vladimir Messages: 108 Registered: July 2009 |
Senior Member |
|
|
Hi all. I have create the grammar(please, see it bellow and not sure why following text generate the errors.
My program
class user {
key pubkey;
index username: text;
firstName: text;
lastName: text;
email: text;
}
operation add_user (admin_pubkey: integer, pubkey, username: text, firstName: text, lastName: text, email: text) {
create user (pubkey, username, firstName, lastName, email); // Error on this line
}
Errors
Quote:
Multiple markers at this line - no viable alternative at input 'pubkey' - missing ';' at 'username' - no viable alternative at input
'email' - no viable alternative at input 'firstName' - no viable alternative at input 'lastName'
My grammar
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])? '{'
attributeListField+=AttributeListField*
'}';
AttributeListField:
key=Key? index=Index? mutable=Mutable? attributeList+=RelAttrubutesList ';';
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+=VariableInit
(',' variableList+=VariableInit*)? '}';
Delete:
'delete' entity=[ClassDefinition] '(' conditions=Conditions? ')';
Create:
'create' entity=[ClassDefinition] '(' (attributeList+=CreateAttrMember (',' attributeList+=CreateAttrMember)*) ')';
CreateAttrMember:
{VarRefDecl} name=[VariableDeclaration] |
{Default} name=ID '=' expr=Expression;
Conditions:
elements+=ConditionElement (',' elements+=ConditionElement*)?;
ConditionElement:
name=ID ('==' | '!=' | '>' | '<' | '>=' | '<=') expr=Expression;
VariableInit:
name=[VariableDeclaration] '=' 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)*;
MulOrDiv returns Expression:
Primary ({MulOrDiv.left=current} op=('*' | '/')
right=Primary)*;
Primary returns Expression:
'(' Expression ')' |
{Not} "not" expression=Primary |
Atomic;
Atomic returns Expression:
{IntConstant} value=INT |
{StringConstant} value=STRING |
{BoolConstant} value=('true' | 'false') |
{VariableRef} value=[VariableDeclaration];
RelAttrubutesList:
value+=VariableOrRef (',' value+=VariableOrRef)*;
VariableOrRef:
{Var} value=Variable |
{VarDeclRef} value=[VariableDeclaration];
VariableDeclaration:
name=Name | name=Pubkey | name=Tuid | (name=ID ':' type=TypeReference);
TypeReference:
primitive=PrimitiveType | entityType=ClassType;
PrimitiveType:
primitiveType=(Text | Tuid | Pubkey | Name | Timestamp | Integer | Json | ByteArray | Boolean);
ClassType:
entityRef=[ClassDefinition];
Name:
'name';
Pubkey:
'pubkey';
Timestamp:
'timestamp';
Tuid:
'tuid';
Boolean:
'bool';
Json:
'json';
Integer:
'integer';
Text:
'text';
ByteArray:
'byte_array';
Key:
'key';
Index:
'index';
Mutable:
'mutable'
;
|
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.08617 seconds