-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDatalog.g4
68 lines (52 loc) · 2.2 KB
/
Datalog.g4
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
grammar Datalog;
origin_clause: 'trusting' origin_element (',' origin_element)*;
origin_element
: 'authority' #originElementAuthority
| 'previous' #originElementPrevious
| signature_alg PUBLICKEYBYTES #originElementPublicKey
;
signature_alg: 'ed25519';
authorizer: (authorizer_element)*;
authorizer_element: ( policy | check | fact | rule_ ) ';';
block: (block_element)*;
block_element: ( check | fact | rule_ ) ';';
fact: NAME '(' fact_term (',' fact_term)* ')';
rule_: predicate '<-' rule_body;
check: 'check' kind=('if' | 'all') rule_body ('or' rule_body)*;
policy: kind=('allow' | 'deny') 'if' rule_body ('or' rule_body)*;
rule_body: rule_body_element (',' rule_body_element)* (origin_clause)?;
rule_body_element: predicate | expression;
predicate: NAME '(' term (',' term)* ')';
expression
: '!' expression #expressionUnary
| '(' expression ')' #expressionParentheses
| expression METHOD_INVOCATION '(' (term ( ',' term)* )? ')' #expressionMethod
| expression mult=('*' | '/') expression #expressionMult
| expression add=('+' | '-') expression #expressionAdd
| expression logic=('||' | '&&') expression #expressionLogic
| expression comp=('>=' | '<=' | '>' | '<' | '==') expression #expressionComp
| fact_term #expressionTerm
| VARIABLE #expressionVariable
;
term: fact_term | VARIABLE;
fact_term: set_term #setTerm
| set #setFactTerm;
set_term: BOOLEAN #booleanFactTerm
| STRING #stringFactTerm
| NUMBER #numberFactTerm
| BYTES #bytesFactTerm
| DATE #dateFactTerm;
VARIABLE: '$'[a-zA-Z_:0-9]+;
STRING : '"' ( '\\"' | . )*? '"' ;
NUMBER: '-'?[0-9]+;
BYTES: 'hex:'([a-f] | [0-9])+;
PUBLICKEYBYTES: '/'([a-f] | [0-9])+;
BOOLEAN: 'true' | 'false';
DATE: [0-9]* '-' [0-9] [0-9] '-' [0-9] [0-9] 'T' [0-9] [0-9] ':' [0-9] [0-9] ':' [0-9] [0-9] ( 'Z' | ( ('+' | '-') [0-9] [0-9] ':' [0-9] [0-9] ));
set: '[' ( fact_term ( ',' set_term)* )? ']';
METHOD_INVOCATION: '.' ([a-z] | [A-Z] ) ([a-z] | [A-Z] | [0-9] | '_' )*;
NAME: [a-zA-Z][a-zA-Z_:0-9]+;
SINGLE_LINE_COMMENT: '//' InputCharacter* -> skip;
DELIMITED_COMMENT: '/*' .*? '*/' -> skip;
fragment InputCharacter: ~[\r\n\u0085\u2028\u2029];
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines