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.