-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStipula.g4
More file actions
93 lines (53 loc) · 2.63 KB
/
Stipula.g4
File metadata and controls
93 lines (53 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
grammar Stipula;
// Struttura del linguaggio
stipula : 'stipula' contractId=ID '{' assetsDecl? fieldsDecl? agreement functionDecl+ '}' EOF ;
assetsDecl : 'assets' assetId+=ID (',' assetId+=ID)* ;
fieldsDecl : 'fields' fieldInit (',' fieldInit)* ;
fieldInit : fieldId=ID ('=' value=(BOOL | TIMEDELTA | NUMBER | DATESTRING | STRING))? ;
agreement : 'agreement' '(' partyId+=ID (',' partyId+=ID)* ')' '{' agree+ '}' '=>' '@' stateId=ID ;
agree : partyId+=ID (',' partyId+=ID)* ':' fieldId+=ID (',' fieldId+=ID)* ;
functionDecl : '@' startStateId=ID partyId=ID ':' functionId=ID '(' (fieldId+=ID (',' fieldId+=ID)*)? ')' '['(assetId+=ID (',' assetId+=ID)*)? ']' ('(' precondition=expression ')')? '{' functionBody '}' '=>' '@' endStateId=ID ;
functionBody : statement* eventDecl* ;
statement : ifThenElse | assetOperation | fieldOperation ;
ifThenElse : 'if' '(' condition=expression ')' '{' ifBody=functionBody '}' 'else' ( '{' elseBody=functionBody '}' | ifThenElse) ;
assetOperation : left=expression '-o' (right=ID ',')? destination=ID ;
fieldOperation : left=expression '->' right=ID ;
eventDecl : trigger=timeExpression '>>' '@' startStateId=ID '{' statement* '}' '=>' '@' endStateId=ID ;
// Espressioni temporali
timeExpression : NOW (PLUS right=timeExpression1)? | DATESTRING | ID ;
timeExpression1 : left=(TIMEDELTA | ID) (PLUS right=timeExpression1)? ;
// Operazioni
expression : left=expression1 (operator=(AND | OR) right=expression)? ;
expression1 : NOT? expression2 ;
expression2 : left=expression3 (operator=(EQ | NEQ | GE | LE | GEQ | LEQ) right=expression2)? ;
expression3 : left=expression4 (operator=(PLUS | MINUS) right=expression3)? ;
expression4 : left=expression5 (operator=(TIMES | DIVISION) right=expression4)? ;
expression5 : MINUS? expression6 ;
expression6 : NOW | BOOL | TIMEDELTA | NUMBER | DATESTRING | STRING | ID | '(' expression ')' ;
// Lexer rules
NOT : '!' ;
AND : '&&' ;
OR : '||' ;
EQ : '==' ;
NEQ : '!=' ;
LE : '<' ;
GE : '>' ;
LEQ : '<=' ;
GEQ : '>=' ;
PLUS : '+' ;
MINUS : '-' ;
TIMES : '*' ;
DIVISION : '/' ;
NOW : 'now' ;
BOOL : TRUE | FALSE ;
TRUE : 'true' ;
FALSE : 'false' ;
TIMEDELTA : INTEGER [YMDhm]? | NUMBER 's' ;
NUMBER : INTEGER ('.' [0-9]*)? ;
INTEGER : '0' | [1-9] [0-9]* ;
DATESTRING : '"' [0-9] [0-9] [0-9] [0-9] '-' ('0' [1-9] | '1' [0-2]) '-' ('0' [1-9] | [1-2] [0-9] | '3' [0-1]) '"' | '\'' [0-9] [0-9] [0-9] [0-9] '-' ('0' [1-9] | '1' [0-2]) '-' ('0' [1-9] | [1-2] [0-9] | '3' [0-1]) '\'' ;
STRING : '\'' ~('\'')+ '\'' | '"' ~('"')+ '"' ;
ID : [a-zA-Z] ([a-zA-Z] | [0-9] | '_')* ;
WS : [ \t\r\n] -> skip;
LINECOMMENT : '//' ~[\r\n]* -> skip ;
BLOCKCOMMENT : '/*' ('*' ~'/' | ~'*')* '*/' -> skip ;