Lex $foo as a single token, instead of using '$' IDENT
Previously, bindings were parsed as the combination of two tokens: '$' IDENT This meant that using a keyword as variable name (e.g. $then, $label) did not work. Attempts were made to allow $keyword to work by adding some '$' Keyword rules in the parser, but this did not allow $keyword in all places: jq --arg label foo -n '$label' # ok jq -n '"foo" as $label | .' # error Treating $foo as a single token is much simpler, in my opinion. This patch also changes how LOC is lexed: "$__loc__" instead of as "__loc__" that gets combined with '$' in the parser. This patch also disallows having spaces after '$' when recalling a variable `$ foo' since that was probably just an unintentional side effect of the implementation, and it was not documented. Fixes #2675
This commit is contained in:
1 parent
c08ecbaf23
commit
193f432e08
7 files changed
+1574
-1608
No files matched your search
@@ -1770,3 +1770,25 @@ false
|
||||
1
|
||||
1
|
||||
|
||||
|
||||
# Using a keyword as variable/label name
|
||||
|
||||
123 as $label | $label
|
||||
null
|
||||
123
|
||||
|
||||
[ label $if | range(10) | ., (select(. == 5) | break $if) ]
|
||||
null
|
||||
[0,1,2,3,4,5]
|
||||
|
||||
reduce .[] as $then (4 as $else | $else; . as $elif | . + $then * $elif)
|
||||
[1,2,3]
|
||||
96
|
||||
|
||||
1 as $foreach | 2 as $and | 3 as $or | { $foreach, $and, $or, a }
|
||||
{"a":4,"b":5}
|
||||
{"foreach":1,"and":2,"or":3,"a":4}
|
||||
|
||||
[ foreach .[] as $try (1 as $catch | $catch - 1; . + $try; .) ]
|
||||
[10,9,8,7]
|
||||
[10,19,27,34]
|
||||
Reference in new issue
Block a user