just/GRAMMAR.md
Casey Rodarmor b66a979c08
Add set export to export all variables as environment variables (#767)
Add a setting that exports all variables by default, regardless of
whether they use the `export` keyword. This includes assignments as well
as parameters.

Just does dependency analysis of variable uses, allowing variables to be
used out of order in assignments, as long as there are no circular
dependencies.

However, use of environment variable is not known to Just, so exported
variables are only exported to child scopes, to avoid ordering dependencies,
since dependency analysis cannot be done.
2021-03-25 17:00:32 -07:00

99 lines
2.2 KiB
Markdown

justfile grammar
================
Justfiles are processed by a mildly context-sensitive tokenizer
and a recursive descent parser. The grammar is LL(k), for an
unknown but hopefully reasonable value of k.
tokens
------
```
BACKTICK = `[^`\n\r]*`
COMMENT = #([^!].*)?$
DEDENT = emitted when indentation decreases
EOF = emitted at the end of the file
INDENT = emitted when indentation increases
LINE = emitted before a recipe line
NAME = [a-zA-Z_][a-zA-Z0-9_-]*
NEWLINE = \n|\r\n
RAW_STRING = '[^'\r\n]*'
STRING = "[^"]*" # also processes \n \r \t \" \\ escapes
TEXT = recipe text, only matches in a recipe body
```
grammar syntax
--------------
```
| alternation
() grouping
_? option (0 or 1 times)
_* repetition (0 or more times)
_+ repetition (1 or more times)
```
grammar
-------
```
justfile : item* EOF
item : recipe
| alias
| assignment
| export
| setting
| eol
eol : NEWLINE
| COMMENT NEWLINE
alias : 'alias' NAME ':=' NAME
assignment : NAME ':=' expression eol
export : 'export' assignment
setting : 'set' 'export'
| 'set' 'shell' ':=' '[' string (',' string)* ','? ']'
expression : 'if' condition '{' expression '}' else '{' expression '}'
| value '+' expression
| value
condition : expression '==' expression
| expression '!=' expression
value : NAME '(' sequence? ')'
| STRING
| RAW_STRING
| BACKTICK
| NAME
| '(' expression ')'
string : STRING
| RAW_STRING
sequence : expression ',' sequence
| expression ','?
recipe : '@'? NAME parameter* variadic? ':' dependency* body?
parameter : NAME
| NAME '=' value
variadic : '*' parameter
| '+' parameter
dependency : NAME
| '(' NAME expression* ')
body : INDENT line+ DEDENT
line : LINE (TEXT | interpolation)+ NEWLINE
| NEWLINE
interpolation : '{{' expression '}}'
```