-
-
Save dancompton/8e291f1615deeb4f142d1a42a657913d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
grammar Jsonnet; | |
jsonnet | |
: expr EOF | |
; | |
expr | |
: value=(NULL | TRUE | FALSE | SELF | DOLLAR | STRING | NUMBER ) # Value | |
| '(' expr ')' # Parens | |
| '{' objinside? '}' # Object | |
| '[' ( elems+=expr (',' elems+=expr)* )? ','? ']' # Array | |
| '[' expr ','? forspec+ ']' # ArrayComp | |
| expr '.' ID # Index | |
| expr '[' expr ']' # Index | |
| expr '[' start=expr? ':' (end=expr? (':' step=expr? )? )? ']' # Slice | |
| SUPER . ID # IndexSuper | |
| SUPER '[' expr ']' # IndexSuper | |
| expr '(' args? ')' TAILSTRICT? # Apply | |
| ID # Var | |
| IF expr THEN expr ( ELSE expr )? # IfThenElse | |
| op=(PLUS | MINUS | NOT | BITNOT) expr # UnaryExpr | |
| expr op=(MULTIPLY | DIVIDE | MODULUS) expr # BinaryExpr | |
| expr op=(PLUS | MINUS) expr # BinaryExpr | |
| expr op=(SHIFTLEFT | SHIFTRIGHT) expr # BinaryExpr | |
| expr op=(GT | GE | LT | LE | IN) expr # BinaryExpr | |
| expr op=(EQUALS | NOTEQUALS) expr # BinaryExpr | |
| expr op=BITAND expr # BinaryExpr | |
| expr op=BITXOR expr # BinaryExpr | |
| expr op=BITOR expr # BinaryExpr | |
| expr op=AND expr # BinaryExpr | |
| expr op=OR expr # BinaryExpr | |
| expr '{' objinside? '}' # ApplyBrace | |
| FUNCTION '(' params? ')' expr # Function | |
| assertion ';' expr # Assert | |
| IMPORT STRING # Import | |
| IMPORTSTR STRING # Import | |
| ERROR expr # ErrorExpr | |
| expr IN SUPER # InSuper | |
| LOCAL binds+=bind (',' binds+=bind)* ';' expr # LocalBind | |
; | |
objinside | |
: members+=member (',' members+=member)* ','? # Members | |
| ( objlocal ',' )* '[' key=expr ']' ':' value=expr ( ',' objlocal )* ','? forspec+ | |
# ObjectComp | |
; | |
member | |
: objlocal | assertion | field | |
; | |
field | |
: fieldname PLUS? visibility expr # ValueField | |
| fieldname '(' params? ')' visibility expr # FunctionField | |
; | |
visibility | |
: ':' | |
| ':' ':' | |
| ':' ':' ':' | |
; | |
objlocal | |
: LOCAL bind | |
; | |
forspec | |
: FOR ID IN expr ifspec* | |
; | |
ifspec | |
: IF expr | |
; | |
fieldname | |
: ID | |
| STRING | |
| '[' expr ']' | |
; | |
assertion | |
: ASSERT condition=expr (':' message=expr)? | |
; | |
bind | |
: ID '=' expr # ValueBind | |
| ID '(' params? ')' '=' expr # FunctionBind | |
; | |
args | |
: pos+=expr ( ',' pos+=expr )* ( ',' names+=ID '=' named+=expr )* ','? | |
| names+=ID '=' named+=expr ( ',' names+=ID '=' named+=expr )* ','? | |
; | |
params | |
: pos+=ID ( ',' pos+=ID )* ( ',' names+=ID '=' defaults+=expr )* ','? | |
| names+=ID '=' defaults+=expr ( ',' names+=ID '=' defaults+=expr )* ','? | |
; | |
DOLLAR : '$'; | |
ASSERT : 'assert'; | |
ELSE : 'else'; | |
ERROR : 'error'; | |
FALSE : 'false'; | |
FOR : 'for'; | |
FUNCTION : 'function'; | |
IF : 'if'; | |
IMPORT : 'import'; | |
IMPORTSTR : 'importstr'; | |
LOCAL : 'local'; | |
NULL : 'null'; | |
SELF : 'self'; | |
SUPER : 'super'; | |
TAILSTRICT: 'tailstrict'; | |
THEN : 'then'; | |
TRUE : 'true'; | |
EQUALS : '==' ; | |
NOTEQUALS : '!='; | |
PLUS : '+'; | |
MINUS : '-'; | |
MULTIPLY : '*'; | |
DIVIDE : '/'; | |
MODULUS : '%'; | |
AND : '&&'; | |
OR : '||'; | |
NOT : '!'; | |
GT : '>'; | |
GE : '>='; | |
LT : '<'; | |
LE : '<='; | |
IN : 'in'; | |
SHIFTLEFT : '<<'; | |
SHIFTRIGHT: '>>'; | |
BITNOT : '~'; | |
BITAND : '&'; | |
BITXOR : '^'; | |
BITOR : '|'; | |
STRING | |
: '"' (ESCAPES | UNICODE | ~["\\\u0000-\u001F])* '"' | |
| '\'' (ESCAPES | UNICODE | ~['\\\u0000-\u001F])* '\'' | |
| '@' '"' ('""' | ~["])* '"' | |
| '@' '\'' ('\'\'' | ~['])* '\'' | |
| '@' '\'' ('\'\'' | ~['])* '\'' | |
| '|||' ( ~'|' | '|' ~'|' | '||' ~'|' )* '|||' | |
; | |
NUMBER: INT ( '.' DIGIT+ )? EXP?; | |
ID: ALPHA (ALPHA | DIGIT)*; | |
fragment ESCAPES: '\\' ["'\\/bfnrt]; | |
fragment DIGIT: [0-9]; | |
fragment ALPHA: [_a-zA-Z]; | |
fragment UNICODE: 'u' HEX HEX HEX HEX; | |
fragment HEX: [0-9a-fA-F]; | |
fragment INT: '0' | [1-9] DIGIT*; | |
fragment EXP: [Ee] [+\-]? DIGIT+; | |
Whitespace | |
: [ \t]+ -> skip | |
; | |
Newline | |
: ( '\r' '\n'? | '\n' ) -> skip | |
; | |
BlockComment | |
: '/*' .*? '*/' -> skip | |
; | |
LineComment | |
: ('//'|'#') ~[\r\n]* -> skip | |
; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment