2016-10-30 19:15:35 -07:00
|
|
|
justfile grammar
|
2016-10-30 19:16:33 -07:00
|
|
|
================
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2016-10-30 19:40:11 -07:00
|
|
|
Justfiles are processed by a mildly context-sensitive tokenizer
|
Gargantuan refactor (#522)
- Instead of changing the current directory with `env::set_current_dir`
to be implicitly inherited by subprocesses, we now use
`Command::current_dir` to set it explicitly. This feels much better,
since we aren't dependent on the implicit state of the process's
current directory.
- Subcommand execution is much improved.
- Added a ton of tests for config parsing, config execution, working
dir, and search dir.
- Error messages are improved. Many more will be colored.
- The Config is now onwed, instead of borrowing from the arguments and
the `clap::ArgMatches` object. This is a huge ergonomic improvement,
especially in tests, and I don't think anyone will notice.
- `--edit` now uses `$VISUAL`, `$EDITOR`, or `vim`, in that order,
matching git, which I think is what most people will expect.
- Added a cute `tmptree!{}` macro, for creating temporary directories
populated with directories and files for tests.
- Admitted that grammer is LL(k) and I don't know what `k` is.
2019-11-09 21:43:20 -08:00
|
|
|
and a recursive descent parser. The grammar is LL(k), for an
|
|
|
|
unknown but hopefully reasonable value of k.
|
2016-10-30 19:15:35 -07:00
|
|
|
|
|
|
|
tokens
|
2016-10-30 19:16:33 -07:00
|
|
|
------
|
2016-10-30 19:15:35 -07:00
|
|
|
|
|
|
|
```
|
2021-04-05 21:28:37 -07:00
|
|
|
BACKTICK = `[^`]*`
|
|
|
|
INDENTED_BACKTICK = ```[^(```)]*```
|
|
|
|
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 = '[^']*'
|
|
|
|
INDENTED_RAW_STRING = '''[^(''')]*'''
|
|
|
|
STRING = "[^"]*" # also processes \n \r \t \" \\ escapes
|
|
|
|
INDENTED_STRING = """[^("""]*""" # also processes \n \r \t \" \\ escapes
|
2022-10-08 13:53:30 -07:00
|
|
|
LINE_PREFIX = @-|-@|@|-
|
2021-04-05 21:28:37 -07:00
|
|
|
TEXT = recipe text, only matches in a recipe body
|
2017-11-30 08:44:06 -08:00
|
|
|
```
|
|
|
|
|
|
|
|
grammar syntax
|
|
|
|
--------------
|
|
|
|
|
|
|
|
```
|
|
|
|
| alternation
|
|
|
|
() grouping
|
|
|
|
_? option (0 or 1 times)
|
|
|
|
_* repetition (0 or more times)
|
|
|
|
_+ repetition (1 or more times)
|
2016-10-30 19:15:35 -07:00
|
|
|
```
|
|
|
|
|
|
|
|
grammar
|
2016-10-30 19:16:33 -07:00
|
|
|
-------
|
2016-10-30 19:15:35 -07:00
|
|
|
|
|
|
|
```
|
|
|
|
justfile : item* EOF
|
|
|
|
|
2023-12-29 12:16:31 -08:00
|
|
|
item : alias
|
2016-10-30 19:15:35 -07:00
|
|
|
| assignment
|
2023-12-29 12:16:31 -08:00
|
|
|
| eol
|
2016-10-30 19:15:35 -07:00
|
|
|
| export
|
2023-12-29 12:16:31 -08:00
|
|
|
| import
|
|
|
|
| module
|
|
|
|
| recipe
|
2019-11-11 19:47:49 -08:00
|
|
|
| setting
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2016-11-12 23:31:19 -08:00
|
|
|
eol : NEWLINE
|
|
|
|
| COMMENT NEWLINE
|
|
|
|
|
2019-04-18 11:48:02 -07:00
|
|
|
alias : 'alias' NAME ':=' NAME
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2019-04-18 11:48:02 -07:00
|
|
|
assignment : NAME ':=' expression eol
|
2019-04-11 12:57:19 -07:00
|
|
|
|
2016-10-30 19:15:35 -07:00
|
|
|
export : 'export' assignment
|
|
|
|
|
2022-10-25 16:57:20 -07:00
|
|
|
setting : 'set' 'allow-duplicate-recipes' boolean?
|
2024-05-14 18:39:42 -07:00
|
|
|
| 'set' 'allow-duplicate-variables' boolean?
|
2023-10-11 22:04:46 -07:00
|
|
|
| 'set' 'dotenv-filename' ':=' string
|
2022-10-25 16:57:20 -07:00
|
|
|
| 'set' 'dotenv-load' boolean?
|
2023-10-11 22:04:46 -07:00
|
|
|
| 'set' 'dotenv-path' ':=' string
|
2021-03-28 22:38:07 -07:00
|
|
|
| 'set' 'export' boolean?
|
2022-10-19 19:00:09 -07:00
|
|
|
| 'set' 'fallback' boolean?
|
2022-10-25 16:57:20 -07:00
|
|
|
| 'set' 'ignore-comments' boolean?
|
2021-04-24 18:29:58 -07:00
|
|
|
| 'set' 'positional-arguments' boolean?
|
2024-01-12 12:38:23 -08:00
|
|
|
| 'set' 'quiet' boolean?
|
2021-03-25 17:00:32 -07:00
|
|
|
| 'set' 'shell' ':=' '[' string (',' string)* ','? ']'
|
2023-10-11 21:24:37 -07:00
|
|
|
| 'set' 'tempdir ':=' string
|
2022-10-25 16:57:20 -07:00
|
|
|
| 'set' 'windows-powershell' boolean?
|
2022-08-28 22:26:02 -07:00
|
|
|
| 'set' 'windows-shell' ':=' '[' string (',' string)* ','? ']'
|
2019-11-11 19:47:49 -08:00
|
|
|
|
2023-12-29 12:16:31 -08:00
|
|
|
import : 'import' '?'? string?
|
|
|
|
|
|
|
|
module : 'mod' '?'? NAME string?
|
|
|
|
|
2021-03-28 22:38:07 -07:00
|
|
|
boolean : ':=' ('true' | 'false')
|
|
|
|
|
2021-05-15 12:10:30 -07:00
|
|
|
expression : 'if' condition '{' expression '}' 'else' '{' expression '}'
|
2024-05-14 18:55:32 -07:00
|
|
|
| 'assert' '(' condition ',' expression ')'
|
2022-06-25 02:39:06 -07:00
|
|
|
| value '/' expression
|
2020-10-26 18:16:42 -07:00
|
|
|
| value '+' expression
|
2017-11-30 08:44:06 -08:00
|
|
|
| value
|
|
|
|
|
2020-10-26 18:16:42 -07:00
|
|
|
condition : expression '==' expression
|
|
|
|
| expression '!=' expression
|
|
|
|
|
2019-04-18 11:48:02 -07:00
|
|
|
value : NAME '(' sequence? ')'
|
2016-11-11 23:11:10 -08:00
|
|
|
| BACKTICK
|
2021-04-05 21:28:37 -07:00
|
|
|
| INDENTED_BACKTICK
|
2017-12-02 05:37:10 -08:00
|
|
|
| NAME
|
2021-04-05 21:28:37 -07:00
|
|
|
| string
|
2019-04-11 23:58:08 -07:00
|
|
|
| '(' expression ')'
|
2017-12-02 05:37:10 -08:00
|
|
|
|
2024-07-04 17:43:17 -07:00
|
|
|
string : 'x'? STRING
|
|
|
|
| 'x'? INDENTED_STRING
|
|
|
|
| 'x'? RAW_STRING
|
|
|
|
| 'x'? INDENTED_RAW_STRING
|
2019-11-11 19:47:49 -08:00
|
|
|
|
2019-04-18 11:48:02 -07:00
|
|
|
sequence : expression ',' sequence
|
2017-12-02 05:37:10 -08:00
|
|
|
| expression ','?
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2024-01-12 18:44:13 -08:00
|
|
|
recipe : attributes* '@'? NAME parameter* variadic? ':' dependency* body?
|
2022-10-25 16:32:36 -07:00
|
|
|
|
2024-01-12 18:44:13 -08:00
|
|
|
attributes : '[' attribute* ']' eol
|
|
|
|
|
|
|
|
attribute : NAME ( '(' string ')' )?
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2021-05-26 16:43:34 -07:00
|
|
|
parameter : '$'? NAME
|
2021-05-26 16:08:05 -07:00
|
|
|
| '$'? NAME '=' value
|
2016-10-30 19:15:35 -07:00
|
|
|
|
2020-06-13 01:49:13 -07:00
|
|
|
variadic : '*' parameter
|
|
|
|
| '+' parameter
|
|
|
|
|
2019-12-07 04:03:03 -08:00
|
|
|
dependency : NAME
|
2021-05-15 12:20:02 -07:00
|
|
|
| '(' NAME expression* ')'
|
2016-10-30 19:15:35 -07:00
|
|
|
|
|
|
|
body : INDENT line+ DEDENT
|
|
|
|
|
2022-10-08 13:53:30 -07:00
|
|
|
line : LINE LINE_PREFIX? (TEXT | interpolation)+ NEWLINE
|
2016-11-16 22:18:55 -08:00
|
|
|
| NEWLINE
|
2016-10-30 19:15:35 -07:00
|
|
|
|
|
|
|
interpolation : '{{' expression '}}'
|
|
|
|
```
|