2016-10-31 05:15:35 +03:00
|
|
|
justfile grammar
|
2016-10-31 05:16:33 +03:00
|
|
|
================
|
2016-10-31 05:15:35 +03:00
|
|
|
|
2016-10-31 05:40:11 +03:00
|
|
|
Justfiles are processed by a mildly context-sensitive tokenizer
|
2016-10-31 05:17:09 +03:00
|
|
|
and a recursive descent parser. The grammar is mostly LL(1),
|
|
|
|
although an extra token of lookahead is used to distinguish between
|
2016-11-18 18:03:34 +03:00
|
|
|
export assignments and recipes with parameters.
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
tokens
|
2016-10-31 05:16:33 +03:00
|
|
|
------
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
```
|
|
|
|
BACKTICK = `[^`\n\r]*`
|
|
|
|
COLON = :
|
|
|
|
COMMENT = #([^!].*)?$
|
2016-11-13 10:31:19 +03:00
|
|
|
NEWLINE = \n|\r\n
|
2016-10-31 05:15:35 +03:00
|
|
|
EQUALS = =
|
|
|
|
INTERPOLATION_START = {{
|
|
|
|
INTERPOLATION_END = }}
|
2017-02-11 07:15:25 +03:00
|
|
|
NAME = [a-zA-Z_][a-zA-Z0-9_-]*
|
2016-10-31 05:15:35 +03:00
|
|
|
PLUS = +
|
|
|
|
RAW_STRING = '[^'\r\n]*'
|
|
|
|
STRING = "[^"]*" # also processes \n \r \t \" \\ escapes
|
|
|
|
INDENT = emitted when indentation increases
|
|
|
|
DEDENT = emitted when indentation decreases
|
|
|
|
LINE = emitted before a recipe line
|
|
|
|
TEXT = recipe text, only matches in a recipe body
|
|
|
|
```
|
|
|
|
|
|
|
|
grammar
|
2016-10-31 05:16:33 +03:00
|
|
|
-------
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
```
|
|
|
|
justfile : item* EOF
|
|
|
|
|
|
|
|
item : recipe
|
|
|
|
| assignment
|
|
|
|
| export
|
2016-11-13 10:31:19 +03:00
|
|
|
| eol
|
2016-10-31 05:15:35 +03:00
|
|
|
|
2016-11-13 10:31:19 +03:00
|
|
|
eol : NEWLINE
|
|
|
|
| COMMENT NEWLINE
|
|
|
|
|
|
|
|
assignment : NAME '=' expression eol
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
export : 'export' assignment
|
|
|
|
|
|
|
|
expression : STRING
|
|
|
|
| RAW_STRING
|
|
|
|
| NAME
|
2016-11-12 10:11:10 +03:00
|
|
|
| BACKTICK
|
2016-10-31 05:15:35 +03:00
|
|
|
| expression '+' expression
|
|
|
|
|
2016-11-18 18:03:34 +03:00
|
|
|
recipe : '@'? NAME parameter* ('+' parameter)? ':' dependencies? body?
|
2016-10-31 05:15:35 +03:00
|
|
|
|
2016-11-18 18:03:34 +03:00
|
|
|
parameter : NAME
|
2016-11-12 20:15:13 +03:00
|
|
|
| NAME '=' STRING
|
|
|
|
| NAME '=' RAW_STRING
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
dependencies : NAME+
|
|
|
|
|
|
|
|
body : INDENT line+ DEDENT
|
|
|
|
|
2016-11-17 09:18:55 +03:00
|
|
|
line : LINE (TEXT | interpolation)+ NEWLINE
|
|
|
|
| NEWLINE
|
2016-10-31 05:15:35 +03:00
|
|
|
|
|
|
|
interpolation : '{{' expression '}}'
|
|
|
|
```
|