github.com/hashicorp/hcl/v2@v2.20.0/hclsyntax/spec.md (about) 1 # HCL Native Syntax Specification 2 3 This is the specification of the syntax and semantics of the native syntax 4 for HCL. HCL is a system for defining configuration languages for applications. 5 The HCL information model is designed to support multiple concrete syntaxes 6 for configuration, but this native syntax is considered the primary format 7 and is optimized for human authoring and maintenance, as opposed to machine 8 generation of configuration. 9 10 The language consists of three integrated sub-languages: 11 12 - The _structural_ language defines the overall hierarchical configuration 13 structure, and is a serialization of HCL bodies, blocks and attributes. 14 15 - The _expression_ language is used to express attribute values, either as 16 literals or as derivations of other values. 17 18 - The _template_ language is used to compose values together into strings, 19 as one of several types of expression in the expression language. 20 21 In normal use these three sub-languages are used together within configuration 22 files to describe an overall configuration, with the structural language 23 being used at the top level. The expression and template languages can also 24 be used in isolation, to implement features such as REPLs, debuggers, and 25 integration into more limited HCL syntaxes such as the JSON profile. 26 27 ## Syntax Notation 28 29 Within this specification a semi-formal notation is used to illustrate the 30 details of syntax. This notation is intended for human consumption rather 31 than machine consumption, with the following conventions: 32 33 - A naked name starting with an uppercase letter is a global production, 34 common to all of the syntax specifications in this document. 35 - A naked name starting with a lowercase letter is a local production, 36 meaningful only within the specification where it is defined. 37 - Double and single quotes (`"` and `'`) are used to mark literal character 38 sequences, which may be either punctuation markers or keywords. 39 - The default operator for combining items, which has no punctuation, 40 is concatenation. 41 - The symbol `|` indicates that any one of its left and right operands may 42 be present. 43 - The `*` symbol indicates zero or more repetitions of the item to its left. 44 - The `?` symbol indicates zero or one of the item to its left. 45 - Parentheses (`(` and `)`) are used to group items together to apply 46 the `|`, `*` and `?` operators to them collectively. 47 48 The grammar notation does not fully describe the language. The prose may 49 augment or conflict with the illustrated grammar. In case of conflict, prose 50 has priority. 51 52 ## Source Code Representation 53 54 Source code is unicode text expressed in the UTF-8 encoding. The language 55 itself does not perform unicode normalization, so syntax features such as 56 identifiers are sequences of unicode code points and so e.g. a precombined 57 accented character is distinct from a letter associated with a combining 58 accent. (String literals have some special handling with regard to Unicode 59 normalization which will be covered later in the relevant section.) 60 61 UTF-8 encoded Unicode byte order marks are not permitted. Invalid or 62 non-normalized UTF-8 encoding is always a parse error. 63 64 ## Lexical Elements 65 66 ### Comments and Whitespace 67 68 Comments and Whitespace are recognized as lexical elements but are ignored 69 except as described below. 70 71 Whitespace is defined as a sequence of zero or more space characters 72 (U+0020). Newline sequences (either U+000A or U+000D followed by U+000A) 73 are _not_ considered whitespace but are ignored as such in certain contexts. 74 Horizontal tab characters (U+0009) are also treated as whitespace, but are 75 counted only as one "column" for the purpose of reporting source positions. 76 77 Comments serve as program documentation and come in two forms: 78 79 - _Line comments_ start with either the `//` or `#` sequences and end with 80 the next newline sequence. A line comment is considered equivalent to a 81 newline sequence. 82 83 - _Inline comments_ start with the `/*` sequence and end with the `*/` 84 sequence, and may have any characters within except the ending sequence. 85 An inline comment is considered equivalent to a whitespace sequence. 86 87 Comments and whitespace cannot begin within other comments, or within 88 template literals except inside an interpolation sequence or template directive. 89 90 ### Identifiers 91 92 Identifiers name entities such as blocks, attributes and expression variables. 93 Identifiers are interpreted as per [UAX #31][uax31] Section 2. Specifically, 94 their syntax is defined in terms of the `ID_Start` and `ID_Continue` 95 character properties as follows: 96 97 ```ebnf 98 Identifier = ID_Start (ID_Continue | '-')*; 99 ``` 100 101 The Unicode specification provides the normative requirements for identifier 102 parsing. Non-normatively, the spirit of this specification is that `ID_Start` 103 consists of Unicode letter and certain unambiguous punctuation tokens, while 104 `ID_Continue` augments that set with Unicode digits, combining marks, etc. 105 106 The dash character `-` is additionally allowed in identifiers, even though 107 that is not part of the unicode `ID_Continue` definition. This is to allow 108 attribute names and block type names to contain dashes, although underscores 109 as word separators are considered the idiomatic usage. 110 111 [uax31]: http://unicode.org/reports/tr31/ "Unicode Identifier and Pattern Syntax" 112 113 ### Keywords 114 115 There are no globally-reserved words, but in some contexts certain identifiers 116 are reserved to function as keywords. These are discussed further in the 117 relevant documentation sections that follow. In such situations, the 118 identifier's role as a keyword supersedes any other valid interpretation that 119 may be possible. Outside of these specific situations, the keywords have no 120 special meaning and are interpreted as regular identifiers. 121 122 ### Operators and Delimiters 123 124 The following character sequences represent operators, delimiters, and other 125 special tokens: 126 127 ``` 128 + && == < : { [ ( ${ 129 - || != > ? } ] ) %{ 130 * ! <= = . 131 / >= => , 132 % ... 133 ``` 134 135 ### Numeric Literals 136 137 A numeric literal is a decimal representation of a 138 real number. It has an integer part, a fractional part, 139 and an exponent part. 140 141 ```ebnf 142 NumericLit = decimal+ ("." decimal+)? (expmark decimal+)?; 143 decimal = '0' .. '9'; 144 expmark = ('e' | 'E') ("+" | "-")?; 145 ``` 146 147 ## Structural Elements 148 149 The structural language consists of syntax representing the following 150 constructs: 151 152 - _Attributes_, which assign a value to a specified name. 153 - _Blocks_, which create a child body annotated by a type and optional labels. 154 - _Body Content_, which consists of a collection of attributes and blocks. 155 156 These constructs correspond to the similarly-named concepts in the 157 language-agnostic HCL information model. 158 159 ```ebnf 160 ConfigFile = Body; 161 Body = (Attribute | Block | OneLineBlock)*; 162 Attribute = Identifier "=" Expression Newline; 163 Block = Identifier (StringLit|Identifier)* "{" Newline Body "}" Newline; 164 OneLineBlock = Identifier (StringLit|Identifier)* "{" (Identifier "=" Expression)? "}" Newline; 165 ``` 166 167 ### Configuration Files 168 169 A _configuration file_ is a sequence of characters whose top-level is 170 interpreted as a Body. 171 172 ### Bodies 173 174 A _body_ is a collection of associated attributes and blocks. The meaning of 175 this association is defined by the calling application. 176 177 ### Attribute Definitions 178 179 An _attribute definition_ assigns a value to a particular attribute name within 180 a body. Each distinct attribute name may be defined no more than once within a 181 single body. 182 183 The attribute value is given as an expression, which is retained literally 184 for later evaluation by the calling application. 185 186 ### Blocks 187 188 A _block_ creates a child body that is annotated with a block _type_ and 189 zero or more block _labels_. Blocks create a structural hierarchy which can be 190 interpreted by the calling application. 191 192 Block labels can either be quoted literal strings or naked identifiers. 193 194 ## Expressions 195 196 The expression sub-language is used within attribute definitions to specify 197 values. 198 199 ```ebnf 200 Expression = ( 201 ExprTerm | 202 Operation | 203 Conditional 204 ); 205 ``` 206 207 ### Types 208 209 The value types used within the expression language are those defined by the 210 syntax-agnostic HCL information model. An expression may return any valid 211 type, but only a subset of the available types have first-class syntax. 212 A calling application may make other types available via _variables_ and 213 _functions_. 214 215 ### Expression Terms 216 217 Expression _terms_ are the operands for unary and binary expressions, as well 218 as acting as expressions in their own right. 219 220 ```ebnf 221 ExprTerm = ( 222 LiteralValue | 223 CollectionValue | 224 TemplateExpr | 225 VariableExpr | 226 FunctionCall | 227 ForExpr | 228 ExprTerm Index | 229 ExprTerm GetAttr | 230 ExprTerm Splat | 231 "(" Expression ")" 232 ); 233 ``` 234 235 The productions for these different term types are given in their corresponding 236 sections. 237 238 Between the `(` and `)` characters denoting a sub-expression, newline 239 characters are ignored as whitespace. 240 241 ### Literal Values 242 243 A _literal value_ immediately represents a particular value of a primitive 244 type. 245 246 ```ebnf 247 LiteralValue = ( 248 NumericLit | 249 "true" | 250 "false" | 251 "null" 252 ); 253 ``` 254 255 - Numeric literals represent values of type _number_. 256 - The `true` and `false` keywords represent values of type _bool_. 257 - The `null` keyword represents a null value of the dynamic pseudo-type. 258 259 String literals are not directly available in the expression sub-language, but 260 are available via the template sub-language, which can in turn be incorporated 261 via _template expressions_. 262 263 ### Collection Values 264 265 A _collection value_ combines zero or more other expressions to produce a 266 collection value. 267 268 ```ebnf 269 CollectionValue = tuple | object; 270 tuple = "[" ( 271 (Expression (("," | Newline) Expression)* ","?)? 272 ) "]"; 273 object = "{" ( 274 (objectelem (( "," | Newline) objectelem)* ","?)? 275 ) "}"; 276 objectelem = (Identifier | Expression) ("=" | ":") Expression; 277 ``` 278 279 Only tuple and object values can be directly constructed via native syntax. 280 Tuple and object values can in turn be converted to list, set and map values 281 with other operations, which behaves as defined by the syntax-agnostic HCL 282 information model. 283 284 When specifying an object element, an identifier is interpreted as a literal 285 attribute name as opposed to a variable reference. To populate an item key 286 from a variable, use parentheses to disambiguate: 287 288 - `{foo = "baz"}` is interpreted as an attribute literally named `foo`. 289 - `{(foo) = "baz"}` is interpreted as an attribute whose name is taken 290 from the variable named `foo`. 291 292 Between the open and closing delimiters of these sequences, newline sequences 293 are ignored as whitespace. 294 295 There is a syntax ambiguity between _for expressions_ and collection values 296 whose first element starts with an identifier named `for`. The _for expression_ 297 interpretation has priority, so to write a key literally named `for` 298 or an expression derived from a variable named `for` you must use parentheses 299 or quotes to disambiguate: 300 301 - `[for, foo, baz]` is a syntax error. 302 - `[(for), foo, baz]` is a tuple whose first element is the value of variable 303 `for`. 304 - `{for = 1, baz = 2}` is a syntax error. 305 - `{"for" = 1, baz = 2}` is an object with an attribute literally named `for`. 306 - `{baz = 2, for = 1}` is equivalent to the previous example, and resolves the 307 ambiguity by reordering. 308 - `{(for) = 1, baz = 2}` is an object with a key with the same value as the 309 variable `for`. 310 311 ### Template Expressions 312 313 A _template expression_ embeds a program written in the template sub-language 314 as an expression. Template expressions come in two forms: 315 316 - A _quoted_ template expression is delimited by quote characters (`"`) and 317 defines a template as a single-line expression with escape characters. 318 - A _heredoc_ template expression is introduced by a `<<` sequence and 319 defines a template via a multi-line sequence terminated by a user-chosen 320 delimiter. 321 322 In both cases the template interpolation and directive syntax is available for 323 use within the delimiters, and any text outside of these special sequences is 324 interpreted as a literal string. 325 326 In _quoted_ template expressions any literal string sequences within the 327 template behave in a special way: literal newline sequences are not permitted 328 and instead _escape sequences_ can be included, starting with the 329 backslash `\`: 330 331 ``` 332 \n Unicode newline control character 333 \r Unicode carriage return control character 334 \t Unicode tab control character 335 \" Literal quote mark, used to prevent interpretation as end of string 336 \\ Literal backslash, used to prevent interpretation as escape sequence 337 \uNNNN Unicode character from Basic Multilingual Plane (NNNN is four hexadecimal digits) 338 \UNNNNNNNN Unicode character from supplementary planes (NNNNNNNN is eight hexadecimal digits) 339 ``` 340 341 The _heredoc_ template expression type is introduced by either `<<` or `<<-`, 342 followed by an identifier. The template expression ends when the given 343 identifier subsequently appears again on a line of its own. 344 345 If a heredoc template is introduced with the `<<-` symbol, any literal string 346 at the start of each line is analyzed to find the minimum number of leading 347 spaces, and then that number of prefix spaces is removed from all line-leading 348 literal strings. The final closing marker may also have an arbitrary number 349 of spaces preceding it on its line. 350 351 ```ebnf 352 TemplateExpr = quotedTemplate | heredocTemplate; 353 quotedTemplate = (as defined in prose above); 354 heredocTemplate = ( 355 ("<<" | "<<-") Identifier Newline 356 (content as defined in prose above) 357 Identifier Newline 358 ); 359 ``` 360 361 A quoted template expression containing only a single literal string serves 362 as a syntax for defining literal string _expressions_. In certain contexts 363 the template syntax is restricted in this manner: 364 365 ```ebnf 366 StringLit = '"' (quoted literals as defined in prose above) '"'; 367 ``` 368 369 The `StringLit` production permits the escape sequences discussed for quoted 370 template expressions as above, but does _not_ permit template interpolation 371 or directive sequences. 372 373 ### Variables and Variable Expressions 374 375 A _variable_ is a value that has been assigned a symbolic name. Variables are 376 made available for use in expressions by the calling application, by populating 377 the _global scope_ used for expression evaluation. 378 379 Variables can also be created by expressions themselves, which always creates 380 a _child scope_ that incorporates the variables from its parent scope but 381 (re-)defines zero or more names with new values. 382 383 The value of a variable is accessed using a _variable expression_, which is 384 a standalone `Identifier` whose name corresponds to a defined variable: 385 386 ```ebnf 387 VariableExpr = Identifier; 388 ``` 389 390 Variables in a particular scope are immutable, but child scopes may _hide_ 391 a variable from an ancestor scope by defining a new variable of the same name. 392 When looking up variables, the most locally-defined variable of the given name 393 is used, and ancestor-scoped variables of the same name cannot be accessed. 394 395 No direct syntax is provided for declaring or assigning variables, but other 396 expression constructs implicitly create child scopes and define variables as 397 part of their evaluation. 398 399 ### Functions and Function Calls 400 401 A _function_ is an operation that has been assigned a symbolic name. Functions 402 are made available for use in expressions by the calling application, by 403 populating the _function table_ used for expression evaluation. 404 405 The namespace of functions is distinct from the namespace of variables. A 406 function and a variable may share the same name with no implication that they 407 are in any way related. 408 409 A function can be executed via a _function call_ expression: 410 411 ```ebnf 412 FunctionCall = Identifier "(" arguments ")"; 413 Arguments = ( 414 () || 415 (Expression ("," Expression)* ("," | "...")?) 416 ); 417 ``` 418 419 The definition of functions and the semantics of calling them are defined by 420 the language-agnostic HCL information model. The given arguments are mapped 421 onto the function's _parameters_ and the result of a function call expression 422 is the return value of the named function when given those arguments. 423 424 If the final argument expression is followed by the ellipsis symbol (`...`), 425 the final argument expression must evaluate to either a list or tuple value. 426 The elements of the value are each mapped to a single parameter of the 427 named function, beginning at the first parameter remaining after all other 428 argument expressions have been mapped. 429 430 Within the parentheses that delimit the function arguments, newline sequences 431 are ignored as whitespace. 432 433 ### For Expressions 434 435 A _for expression_ is a construct for constructing a collection by projecting 436 the items from another collection. 437 438 ```ebnf 439 ForExpr = forTupleExpr | forObjectExpr; 440 forTupleExpr = "[" forIntro Expression forCond? "]"; 441 forObjectExpr = "{" forIntro Expression "=>" Expression "..."? forCond? "}"; 442 forIntro = "for" Identifier ("," Identifier)? "in" Expression ":"; 443 forCond = "if" Expression; 444 ``` 445 446 The punctuation used to delimit a for expression decide whether it will produce 447 a tuple value (`[` and `]`) or an object value (`{` and `}`). 448 449 The "introduction" is equivalent in both cases: the keyword `for` followed by 450 either one or two identifiers separated by a comma which define the temporary 451 variable names used for iteration, followed by the keyword `in` and then 452 an expression that must evaluate to a value that can be iterated. The 453 introduction is then terminated by the colon (`:`) symbol. 454 455 If only one identifier is provided, it is the name of a variable that will 456 be temporarily assigned the value of each element during iteration. If both 457 are provided, the first is the key and the second is the value. 458 459 Tuple, object, list, map, and set types are iterable. The type of collection 460 used defines how the key and value variables are populated: 461 462 - For tuple and list types, the _key_ is the zero-based index into the 463 sequence for each element, and the _value_ is the element value. The 464 elements are visited in index order. 465 - For object and map types, the _key_ is the string attribute name or element 466 key, and the _value_ is the attribute or element value. The elements are 467 visited in the order defined by a lexicographic sort of the attribute names 468 or keys. 469 - For set types, the _key_ and _value_ are both the element value. The elements 470 are visited in an undefined but consistent order. 471 472 The expression after the colon and (in the case of object `for`) the expression 473 after the `=>` are both evaluated once for each element of the source 474 collection, in a local scope that defines the key and value variable names 475 specified. 476 477 The results of evaluating these expressions for each input element are used 478 to populate an element in the new collection. In the case of tuple `for`, the 479 single expression becomes an element, appending values to the tuple in visit 480 order. In the case of object `for`, the pair of expressions is used as an 481 attribute name and value respectively, creating an element in the resulting 482 object. 483 484 In the case of object `for`, it is an error if two input elements produce 485 the same result from the attribute name expression, since duplicate 486 attributes are not possible. If the ellipsis symbol (`...`) appears 487 immediately after the value expression, this activates the grouping mode in 488 which each value in the resulting object is a _tuple_ of all of the values 489 that were produced against each distinct key. 490 491 - `[for v in ["a", "b"]: v]` returns `["a", "b"]`. 492 - `[for i, v in ["a", "b"]: i]` returns `[0, 1]`. 493 - `{for i, v in ["a", "b"]: v => i}` returns `{a = 0, b = 1}`. 494 - `{for i, v in ["a", "a", "b"]: v => i}` produces an error, because attribute 495 `a` is defined twice. 496 - `{for i, v in ["a", "a", "b"]: v => i...}` returns `{a = [0, 1], b = [2]}`. 497 498 If the `if` keyword is used after the element expression(s), it applies an 499 additional predicate that can be used to conditionally filter elements from 500 the source collection from consideration. The expression following `if` is 501 evaluated once for each source element, in the same scope used for the 502 element expression(s). It must evaluate to a boolean value; if `true`, the 503 element will be evaluated as normal, while if `false` the element will be 504 skipped. 505 506 - `[for i, v in ["a", "b", "c"]: v if i < 2]` returns `["a", "b"]`. 507 508 If the collection value, element expression(s) or condition expression return 509 unknown values that are otherwise type-valid, the result is a value of the 510 dynamic pseudo-type. 511 512 ### Index Operator 513 514 The _index_ operator returns the value of a single element of a collection 515 value. It is a postfix operator and can be applied to any value that has 516 a tuple, object, map, or list type. 517 518 ```ebnf 519 Index = "[" Expression "]"; 520 ``` 521 522 The expression delimited by the brackets is the _key_ by which an element 523 will be looked up. 524 525 If the index operator is applied to a value of tuple or list type, the 526 key expression must be an non-negative integer number representing the 527 zero-based element index to access. If applied to a value of object or map 528 type, the key expression must be a string representing the attribute name 529 or element key. If the given key value is not of the appropriate type, a 530 conversion is attempted using the conversion rules from the HCL 531 syntax-agnostic information model. 532 533 An error is produced if the given key expression does not correspond to 534 an element in the collection, either because it is of an unconvertable type, 535 because it is outside the range of elements for a tuple or list, or because 536 the given attribute or key does not exist. 537 538 If either the collection or the key are an unknown value of an 539 otherwise-suitable type, the return value is an unknown value whose type 540 matches what type would be returned given known values, or a value of the 541 dynamic pseudo-type if type information alone cannot determine a suitable 542 return type. 543 544 Within the brackets that delimit the index key, newline sequences are ignored 545 as whitespace. 546 547 The HCL native syntax also includes a _legacy_ index operator that exists 548 only for compatibility with the precursor language HIL: 549 550 ```ebnf 551 LegacyIndex = '.' digit+ 552 ``` 553 554 This legacy index operator must be supported by parser for compatibility but 555 should not be used in new configurations. This allows an attribute-access-like 556 syntax for indexing, must still be interpreted as an index operation rather 557 than attribute access. 558 559 The legacy syntax does not support chaining of index operations, like 560 `foo.0.0.bar`, because the interpretation of `0.0` as a number literal token 561 takes priority and thus renders the resulting sequence invalid. 562 563 ### Attribute Access Operator 564 565 The _attribute access_ operator returns the value of a single attribute in 566 an object value. It is a postfix operator and can be applied to any value 567 that has an object type. 568 569 ```ebnf 570 GetAttr = "." Identifier; 571 ``` 572 573 The given identifier is interpreted as the name of the attribute to access. 574 An error is produced if the object to which the operator is applied does not 575 have an attribute with the given name. 576 577 If the object is an unknown value of a type that has the attribute named, the 578 result is an unknown value of the attribute's type. 579 580 ### Splat Operators 581 582 The _splat operators_ allow convenient access to attributes or elements of 583 elements in a tuple, list, or set value. 584 585 There are two kinds of "splat" operator: 586 587 - The _attribute-only_ splat operator supports only attribute lookups into 588 the elements from a list, but supports an arbitrary number of them. 589 590 - The _full_ splat operator additionally supports indexing into the elements 591 from a list, and allows any combination of attribute access and index 592 operations. 593 594 ```ebnf 595 Splat = attrSplat | fullSplat; 596 attrSplat = "." "*" GetAttr*; 597 fullSplat = "[" "*" "]" (GetAttr | Index)*; 598 ``` 599 600 The splat operators can be thought of as shorthands for common operations that 601 could otherwise be performed using _for expressions_: 602 603 - `tuple.*.foo.bar[0]` is approximately equivalent to 604 `[for v in tuple: v.foo.bar][0]`. 605 - `tuple[*].foo.bar[0]` is approximately equivalent to 606 `[for v in tuple: v.foo.bar[0]]` 607 608 Note the difference in how the trailing index operator is interpreted in 609 each case. This different interpretation is the key difference between the 610 _attribute-only_ and _full_ splat operators. 611 612 Splat operators have one additional behavior compared to the equivalent 613 _for expressions_ shown above: if a splat operator is applied to a value that 614 is _not_ of tuple, list, or set type, the value is coerced automatically into 615 a single-value list of the value type: 616 617 - `any_object.*.id` is equivalent to `[any_object.id]`, assuming that `any_object` 618 is a single object. 619 - `any_number.*` is equivalent to `[any_number]`, assuming that `any_number` 620 is a single number. 621 622 If applied to a null value that is not tuple, list, or set, the result is always 623 an empty tuple, which allows conveniently converting a possibly-null scalar 624 value into a tuple of zero or one elements. It is illegal to apply a splat 625 operator to a null value of tuple, list, or set type. 626 627 ### Operations 628 629 Operations apply a particular operator to either one or two expression terms. 630 631 ```ebnf 632 Operation = unaryOp | binaryOp; 633 unaryOp = ("-" | "!") ExprTerm; 634 binaryOp = ExprTerm binaryOperator ExprTerm; 635 binaryOperator = compareOperator | arithmeticOperator | logicOperator; 636 compareOperator = "==" | "!=" | "<" | ">" | "<=" | ">="; 637 arithmeticOperator = "+" | "-" | "*" | "/" | "%"; 638 logicOperator = "&&" | "||"; 639 ``` 640 641 The unary operators have the highest precedence. 642 643 The binary operators are grouped into the following precedence levels: 644 645 ``` 646 Level Operators 647 6 * / % 648 5 + - 649 4 > >= < <= 650 3 == != 651 2 && 652 1 || 653 ``` 654 655 Higher values of "level" bind tighter. Operators within the same precedence 656 level have left-to-right associativity. For example, `x / y * z` is equivalent 657 to `(x / y) * z`. 658 659 ### Comparison Operators 660 661 Comparison operators always produce boolean values, as a result of testing 662 the relationship between two values. 663 664 The two equality operators apply to values of any type: 665 666 ``` 667 a == b equal 668 a != b not equal 669 ``` 670 671 Two values are equal if they are of identical types and their values are 672 equal as defined in the HCL syntax-agnostic information model. The equality 673 operators are commutative and opposite, such that `(a == b) == !(a != b)` 674 and `(a == b) == (b == a)` for all values `a` and `b`. 675 676 The four numeric comparison operators apply only to numbers: 677 678 ``` 679 a < b less than 680 a <= b less than or equal to 681 a > b greater than 682 a >= b greater than or equal to 683 ``` 684 685 If either operand of a comparison operator is a correctly-typed unknown value 686 or a value of the dynamic pseudo-type, the result is an unknown boolean. 687 688 ### Arithmetic Operators 689 690 Arithmetic operators apply only to number values and always produce number 691 values as results. 692 693 ``` 694 a + b sum (addition) 695 a - b difference (subtraction) 696 a * b product (multiplication) 697 a / b quotient (division) 698 a % b remainder (modulo) 699 -a negation 700 ``` 701 702 Arithmetic operations are considered to be performed in an arbitrary-precision 703 number space. 704 705 If either operand of an arithmetic operator is an unknown number or a value 706 of the dynamic pseudo-type, the result is an unknown number. 707 708 ### Logic Operators 709 710 Logic operators apply only to boolean values and always produce boolean values 711 as results. 712 713 ``` 714 a && b logical AND 715 a || b logical OR 716 !a logical NOT 717 ``` 718 719 If either operand of a logic operator is an unknown bool value or a value 720 of the dynamic pseudo-type, the result is an unknown bool value. 721 722 ### Conditional Operator 723 724 The conditional operator allows selecting from one of two expressions based on 725 the outcome of a boolean expression. 726 727 ```ebnf 728 Conditional = Expression "?" Expression ":" Expression; 729 ``` 730 731 The first expression is the _predicate_, which is evaluated and must produce 732 a boolean result. If the predicate value is `true`, the result of the second 733 expression is the result of the conditional. If the predicate value is 734 `false`, the result of the third expression is the result of the conditional. 735 736 The second and third expressions must be of the same type or must be able to 737 unify into a common type using the type unification rules defined in the 738 HCL syntax-agnostic information model. This unified type is the result type 739 of the conditional, with both expressions converted as necessary to the 740 unified type. 741 742 If the predicate is an unknown boolean value or a value of the dynamic 743 pseudo-type then the result is an unknown value of the unified type of the 744 other two expressions. 745 746 If either the second or third expressions produce errors when evaluated, 747 these errors are passed through only if the erroneous expression is selected. 748 This allows for expressions such as 749 `length(some_list) > 0 ? some_list[0] : default` (given some suitable `length` 750 function) without producing an error when the predicate is `false`. 751 752 ## Templates 753 754 The template sub-language is used within template expressions to concisely 755 combine strings and other values to produce other strings. It can also be 756 used in isolation as a standalone template language. 757 758 ```ebnf 759 Template = ( 760 TemplateLiteral | 761 TemplateInterpolation | 762 TemplateDirective 763 )* 764 TemplateDirective = TemplateIf | TemplateFor; 765 ``` 766 767 A template behaves like an expression that always returns a string value. 768 The different elements of the template are evaluated and combined into a 769 single string to return. If any of the elements produce an unknown string 770 or a value of the dynamic pseudo-type, the result is an unknown string. 771 772 An important use-case for standalone templates is to enable the use of 773 expressions in alternative HCL syntaxes where a native expression grammar is 774 not available. For example, the HCL JSON profile treats the values of JSON 775 strings as standalone templates when attributes are evaluated in expression 776 mode. 777 778 ### Template Literals 779 780 A template literal is a literal sequence of characters to include in the 781 resulting string. When the template sub-language is used standalone, a 782 template literal can contain any unicode character, with the exception 783 of the sequences that introduce interpolations and directives, and for the 784 sequences that escape those introductions. 785 786 The interpolation and directive introductions are escaped by doubling their 787 leading characters. The `${` sequence is escaped as `$${` and the `%{` 788 sequence is escaped as `%%{`. 789 790 When the template sub-language is embedded in the expression language via 791 _template expressions_, additional constraints and transforms are applied to 792 template literals as described in the definition of template expressions. 793 794 The value of a template literal can be modified by _strip markers_ in any 795 interpolations or directives that are adjacent to it. A strip marker is 796 a tilde (`~`) placed immediately after the opening `{` or before the closing 797 `}` of a template sequence: 798 799 - `hello ${~ "world" }` produces `"helloworld"`. 800 - `%{ if true ~} hello %{~ endif }` produces `"hello"`. 801 802 When a strip marker is present, any spaces adjacent to it in the corresponding 803 string literal (if any) are removed before producing the final value. Space 804 characters are interpreted as per Unicode's definition. 805 806 Stripping is done at syntax level rather than value level. Values returned 807 by interpolations or directives are not subject to stripping: 808 809 - `${"hello" ~}${" world"}` produces `"hello world"`, and not `"helloworld"`, 810 because the space is not in a template literal directly adjacent to the 811 strip marker. 812 813 ### Template Interpolations 814 815 An _interpolation sequence_ evaluates an expression (written in the 816 expression sub-language), converts the result to a string value, and 817 replaces itself with the resulting string. 818 819 ```ebnf 820 TemplateInterpolation = ("${" | "${~") Expression ("}" | "~}"; 821 ``` 822 823 If the expression result cannot be converted to a string, an error is 824 produced. 825 826 ### Template If Directive 827 828 The template `if` directive is the template equivalent of the 829 _conditional expression_, allowing selection of one of two sub-templates based 830 on the value of a predicate expression. 831 832 ```ebnf 833 TemplateIf = ( 834 ("%{" | "%{~") "if" Expression ("}" | "~}") 835 Template 836 ( 837 ("%{" | "%{~") "else" ("}" | "~}") 838 Template 839 )? 840 ("%{" | "%{~") "endif" ("}" | "~}") 841 ); 842 ``` 843 844 The evaluation of the `if` directive is equivalent to the conditional 845 expression, with the following exceptions: 846 847 - The two sub-templates always produce strings, and thus the result value is 848 also always a string. 849 - The `else` clause may be omitted, in which case the conditional's third 850 expression result is implied to be the empty string. 851 852 ### Template For Directive 853 854 The template `for` directive is the template equivalent of the _for expression_, 855 producing zero or more copies of its sub-template based on the elements of 856 a collection. 857 858 ```ebnf 859 TemplateFor = ( 860 ("%{" | "%{~") "for" Identifier ("," Identifier) "in" Expression ("}" | "~}") 861 Template 862 ("%{" | "%{~") "endfor" ("}" | "~}") 863 ); 864 ``` 865 866 The evaluation of the `for` directive is equivalent to the _for expression_ 867 when producing a tuple, with the following exceptions: 868 869 - The sub-template always produces a string. 870 - There is no equivalent of the "if" clause on the for expression. 871 - The elements of the resulting tuple are all converted to strings and 872 concatenated to produce a flat string result. 873 874 ### Template Interpolation Unwrapping 875 876 As a special case, a template that consists only of a single interpolation, 877 with no surrounding literals, directives or other interpolations, is 878 "unwrapped". In this case, the result of the interpolation expression is 879 returned verbatim, without conversion to string. 880 881 This special case exists primarily to enable the native template language 882 to be used inside strings in alternative HCL syntaxes that lack a first-class 883 template or expression syntax. Unwrapping allows arbitrary expressions to be 884 used to populate attributes when strings in such languages are interpreted 885 as templates. 886 887 - `${true}` produces the boolean value `true` 888 - `${"${true}"}` produces the boolean value `true`, because both the inner 889 and outer interpolations are subject to unwrapping. 890 - `hello ${true}` produces the string `"hello true"` 891 - `${""}${true}` produces the string `"true"` because there are two 892 interpolation sequences, even though one produces an empty result. 893 - `%{ for v in [true] }${v}%{ endfor }` produces the string `true` because 894 the presence of the `for` directive circumvents the unwrapping even though 895 the final result is a single value. 896 897 In some contexts this unwrapping behavior may be circumvented by the calling 898 application, by converting the final template result to string. This is 899 necessary, for example, if a standalone template is being used to produce 900 the direct contents of a file, since the result in that case must always be a 901 string. 902 903 ## Static Analysis 904 905 The HCL static analysis operations are implemented for some expression types 906 in the native syntax, as described in the following sections. 907 908 A goal for static analysis of the native syntax is for the interpretation to 909 be as consistent as possible with the dynamic evaluation interpretation of 910 the given expression, though some deviations are intentionally made in order 911 to maximize the potential for analysis. 912 913 ### Static List 914 915 The tuple construction syntax can be interpreted as a static list. All of 916 the expression elements given are returned as the static list elements, 917 with no further interpretation. 918 919 ### Static Map 920 921 The object construction syntax can be interpreted as a static map. All of the 922 key/value pairs given are returned as the static pairs, with no further 923 interpretation. 924 925 The usual requirement that an attribute name be interpretable as a string 926 does not apply to this static analysis, allowing callers to provide map-like 927 constructs with different key types by building on the map syntax. 928 929 ### Static Call 930 931 The function call syntax can be interpreted as a static call. The called 932 function name is returned verbatim and the given argument expressions are 933 returned as the static arguments, with no further interpretation. 934 935 ### Static Traversal 936 937 A variable expression and any attached attribute access operations and 938 constant index operations can be interpreted as a static traversal. 939 940 The keywords `true`, `false` and `null` can also be interpreted as 941 static traversals, behaving as if they were references to variables of those 942 names, to allow callers to redefine the meaning of those keywords in certain 943 contexts.