Grammar - The HAC Language
Description: The HAC Language

Next: Function Index, Previous: Keywords, Up: Top

## Appendix B Grammar

> "Yacc" owes much to a most stimulating collection of users, who have goaded me beyond my inclination, and frequently beyond my ability in their endless search for "one more feature". Their irritating unwillingness to learn how to do things my way has usually led to my doing things their way; most of the time, they have been right.
> – S. C. Johnson, "Yacc guide acknowledgements

This appendix describes the HAC language's grammar. The grammar is context-free and LR(1), so traditional yacc and bison (LALR(1)) parser generators will work with it.

        0 $accept: module $end
        1 module: embedded_module
        2 embedded_module: imports_optional top_root
        3 imports_optional: imports
        4                 | /* empty */
        5 imports: imports import_item
        6        | import_item
        7 import_item: IMPORT
        8            | EMBEDFILE '{' embedded_module '}'
        9 top_root: body
       10         | /* empty */
       11 body: body body_item
       12     | body_item
       13 body_item: namespace_item
       14          | definition
       15          | prototype_declaration
       16 namespace_item: namespace_management
       17               | instance_item_extended
       18               | type_alias
       19 namespace_management: NAMESPACE ID '{' top_root '}'
       20                     | OPEN namespace_id RARROW ID ';'
       21                     | OPEN namespace_id ';'
       22 namespace_id: relative_id
       23 definition: defproc
       24           | defdatatype
       25           | defchan
       26           | defenum
       27 prototype_declaration: declare_proc_proto ';'
       28                      | declare_datatype_proto ';'
       29                      | declare_chan_proto ';'
       30                      | declare_enum ';'
       31 type_alias: optional_export optional_template_specification TYPEDEF physical_type_ref ID ';'
       32 template_specification: TEMPLATE template_formal_decl_list_in_angles
       33                       | TEMPLATE template_formal_decl_list_optional_in_angles template_formal_decl_nodefault_list_in_angles
       34 optional_template_specification: template_specification
       35                                | /* empty */
       36 optional_export: EXPORT
       37                | /* empty */
       38 def_or_proc: DEFINE
       39            | DEFPROC
       40 declare_proc_proto: optional_export optional_template_specification def_or_proc ID optional_port_formal_decl_list_in_parens
       41 defproc: declare_proc_proto '{' optional_definition_body '}'
       42 optional_port_formal_decl_list_in_parens: '(' port_formal_decl_list ')'
       43                                         | '(' ')'
       44 template_formal_decl_list_in_angles: '<' template_formal_decl_list '>'
       45 template_formal_decl_nodefault_list_in_angles: '<' template_formal_decl_nodefault_list '>'
       46 template_formal_decl_list_optional_in_angles: template_formal_decl_list_in_angles
       47                                             | '<' '>'
       48 template_formal_decl_list: template_formal_decl_list ';' template_formal_decl
       49                          | template_formal_decl
       50 template_formal_decl_nodefault_list: template_formal_decl_nodefault_list ';' template_formal_decl_nodefault
       51                                    | template_formal_decl_nodefault
       52 template_formal_decl: base_param_type template_formal_id_list
       53 template_formal_decl_nodefault: base_param_type template_formal_id_nodefault_list
       54 template_formal_id_list: template_formal_id_list ',' template_formal_id
       55                        | template_formal_id
       56 template_formal_id_nodefault_list: template_formal_id_nodefault_list ',' template_formal_id_nodefault
       57                                  | template_formal_id_nodefault
       58 template_formal_id_default: ID optional_dense_range_list '=' expr
       59 template_formal_id_nodefault: ID optional_dense_range_list
       60 template_formal_id: template_formal_id_default
       61                   | template_formal_id_nodefault
       62 port_formal_decl_list: port_formal_decl_list ';' port_formal_decl
       63                      | port_formal_decl
       64 port_formal_decl: physical_type_ref port_formal_id_list
       65 port_formal_id_list: port_formal_id_list ',' port_formal_id
       66                    | port_formal_id
       67 port_formal_id: ID optional_dense_range_list
       68 generic_type_ref: generic_id strict_relaxed_template_arguments optional_chan_dir
       69 optional_chan_dir: '?'
       70                  | '!'
       71                  | '?' '?'
       72                  | '!' '!'
       73                  | /* empty */
       74 physical_type_ref: generic_type_ref
       75                  | base_chan_type
       76                  | base_data_type_ref
       77 base_data_type_ref: base_data_type strict_relaxed_template_arguments
       78 data_type_ref: base_data_type_ref
       79              | generic_type_ref
       80 type_id: physical_type_ref
       81        | base_param_type
       82 base_param_type: PINT_TYPE
       83                | PBOOL_TYPE
       84                | PREAL_TYPE
       85 base_chan_type: chan_or_port data_type_ref_list_optional_in_parens
       86 chan_or_port: CHANNEL optional_chan_dir
       87 data_type_ref_list_optional_in_parens: '(' data_type_ref_list_optional ')'
       88 data_type_ref_list_optional: data_type_ref_list
       89                            | /* empty */
       90 data_type_ref_list: data_type_ref_list ',' data_type_ref
       91                   | data_type_ref
       92 base_data_type: INT_TYPE
       93               | BOOL_TYPE
       94 declare_datatype_proto: optional_export optional_template_specification DEFTYPE ID DEFINEOP data_type_ref optional_port_formal_decl_list_in_parens
       95 defdatatype: declare_datatype_proto '{' optional_datatype_body set_body get_body '}'
       96 set_body: SET '{' chp_body_optional '}'
       97 get_body: GET '{' chp_body_optional '}'
       98 declare_enum: ENUM ID
       99 defenum: ENUM ID '{' enum_member_list '}'
      100 enum_member_list: enum_member_list ',' ID
      101                 | ID
      102 declare_chan_proto: optional_export optional_template_specification DEFCHAN ID DEFINEOP base_chan_type optional_port_formal_decl_list_in_parens
      103 defchan: declare_chan_proto '{' optional_datatype_body send_body recv_body '}'
      104 send_body: SEND '{' chp_body_optional '}'
      105 recv_body: RECV '{' chp_body_optional '}'
      106 definition_body: definition_body definition_body_item
      107                | definition_body_item
      108 definition_body_item: instance_item_extended
      109                     | type_alias
      110 optional_definition_body: definition_body
      111                         | /* empty */
      112 optional_datatype_body: datatype_body
      113                       | /* empty */
      114 datatype_body: datatype_body datatype_body_item
      115              | datatype_body_item
      116 datatype_body_item: connection_body_item
      117                   | lang_spec
      118 connection_body: connection_body connection_body_item
      119                | connection_body_item
      120 connection_body_item_base: connection_statement
      121                          | nonempty_alias_list ';'
      122                          | instance_type_completion_statement
      123                          | instance_type_completion_connection_statement
      124 connection_body_item: connection_body_item_base
      125                     | loop_connections
      126                     | conditional_connections
      127 instance_management_list: instance_management_list instance_item_extended
      128                         | instance_item_extended
      129 instance_item_extended: instance_item
      130                       | language_body
      131 instance_item: type_instance_declaration
      132              | connection_body_item_base
      133              | loop_instantiation
      134              | conditional_instantiation
      135 loop_instantiation: '(' ';' ID ':' range ':' instance_management_list ')'
      136 conditional_instantiation: '[' guarded_instance_management_list ']'
      137 loop_connections: '(' ';' ID ':' range ':' connection_body ')'
      138 conditional_connections: '[' guarded_connection_body ']'
      139 type_instance_declaration: type_id instance_id_list ';'
      140 instance_id_list: instance_id_list ',' instance_id_item
      141                 | instance_id_item
      142 instance_id_item: ID optional_template_arguments_in_angles sparse_range_list
      143                 | ID optional_template_arguments_in_angles
      144                 | ID optional_template_arguments_in_angles connection_actuals_list
      145                 | ID optional_template_arguments_in_angles '=' alias_list
      146 connection_statement: member_index_expr connection_actuals_list ';'
      147 instance_type_completion_statement: index_expr complex_expr_optional_list_in_angles ';'
      148                                   | generic_id complex_expr_optional_list_in_angles ';'
      149 instance_type_completion_connection_statement: index_expr complex_expr_optional_list_in_angles connection_actuals_list ';'
      150                                              | generic_id complex_expr_optional_list_in_angles connection_actuals_list ';'
      151 nonempty_alias_list: nonempty_alias_list '=' complex_aggregate_reference
      152                    | complex_aggregate_reference '=' complex_aggregate_reference
      153 alias_list: alias_list '=' complex_aggregate_reference
      154           | complex_aggregate_reference
      155 connection_actuals_list: '(' complex_aggregate_reference_list ')'
      156 guarded_instance_management_list: guarded_instance_management_list_unmatched THICKBAR instance_management_else_clause
      157                                 | guarded_instance_management_list_unmatched
      158 guarded_instance_management_list_unmatched: guarded_instance_management_list_unmatched THICKBAR guarded_instance_management
      159                                           | guarded_instance_management
      160 guarded_instance_management: expr RARROW instance_management_list
      161 instance_management_else_clause: ELSE RARROW instance_management_list
      162 guarded_connection_body: guarded_connection_body_unmatched THICKBAR connection_body_else_clause
      163                        | guarded_connection_body_unmatched
      164 guarded_connection_body_unmatched: guarded_connection_body_unmatched THICKBAR guarded_connection_body_clause
      165                                  | guarded_connection_body_clause
      166 guarded_connection_body_clause: expr RARROW connection_body
      167 connection_body_else_clause: ELSE RARROW connection_body
      168 language_body: CHP_LANG '{' chp_body_optional '}'
      169              | HSE_LANG '{' hse_body_optional '}'
      170              | PRS_LANG optional_template_arguments_in_angles '{' prs_body_optional '}'
      171              | lang_spec
      172 lang_spec: SPEC_LANG '{' spec_body_optional '}'
      173 chp_body: full_chp_body_item_list
      174 chp_body_optional: chp_body
      175                  | /* empty */
      176 chp_body_or_skip: chp_body
      177                 | SKIP
      178 chp_sequence_group: '{' full_chp_body_item_list '}'
      179 full_chp_body_item_list: full_chp_body_item_list ';' full_chp_body_item
      180                        | full_chp_body_item
      181 full_chp_body_item: chp_concurrent_group
      182 chp_body_item: chp_statement_attributes chp_statement
      183              | chp_statement
      184 chp_statement_attributes: '$' '(' chp_statement_attr_list ')'
      185 chp_statement_attr_list: chp_statement_attr_list ';' chp_statement_attr
      186                        | chp_statement_attr
      187 chp_statement_attr: ID '=' expr
      188 chp_statement: chp_loop
      189              | chp_do_until
      190              | chp_selection
      191              | chp_wait
      192              | chp_binary_assignment
      193              | chp_bool_assignment
      194              | chp_send
      195              | chp_recv
      196              | chp_peek
      197              | LOG expr_list_in_parens
      198              | chp_metaloop_selection
      199              | chp_metaloop_statement
      200              | function_call_expr
      201 chp_loop: BEGINLOOP chp_body ']'
      202 chp_do_until: BEGINLOOP chp_unmatched_det_guarded_command_list ']'
      203 chp_wait: '[' chp_guard_expr ']'
      204 chp_selection: '[' chp_matched_det_guarded_command_list ']'
      205              | '[' chp_nondet_guarded_command_list ']'
      206 chp_metaloop_selection: '[' ':' ID ':' range ':' chp_guarded_command ']'
      207                       | '[' THICKBAR ID ':' range ':' chp_guarded_command ']'
      208 chp_metaloop_statement: '{' ',' ID ':' range ':' chp_body '}'
      209                       | '{' ';' ID ':' range ':' chp_body '}'
      210 chp_nondet_guarded_command_list: chp_nondet_guarded_command_list ':' chp_guarded_command
      211                                | chp_guarded_command ':' chp_guarded_command
      212 chp_matched_det_guarded_command_list: chp_unmatched_det_guarded_command_list THICKBAR chp_else_clause
      213                                     | chp_unmatched_det_guarded_command_list
      214 chp_unmatched_det_guarded_command_list: chp_unmatched_det_guarded_command_list THICKBAR chp_guarded_command
      215                                       | chp_guarded_command
      216 chp_guarded_command: chp_guard_expr RARROW chp_body_or_skip
      217 chp_guard_expr: chp_logical_or_expr
      218 chp_unary_bool_expr: chp_simple_bool_expr
      219                    | chp_not_expr
      220                    | '(' chp_logical_or_expr ')'
      221                    | chp_probe_expr
      222                    | function_call_expr
      223 chp_probe_expr: '#' member_index_expr
      224 chp_simple_bool_expr: member_index_expr
      225                     | BOOL_TRUE
      226                     | BOOL_FALSE
      227 chp_unary_expr: '-' chp_unary_expr
      228               | chp_unary_bool_expr
      229               | loop_expr
      230               | INT
      231               | FLOAT
      232 chp_mult_expr: chp_unary_expr
      233              | chp_mult_expr muldiv_op chp_unary_expr
      234 chp_add_expr: chp_mult_expr
      235             | chp_add_expr_only
      236 chp_add_expr_only: chp_add_expr '+' chp_mult_expr
      237                  | chp_add_expr '-' chp_mult_expr
      238 chp_paren_add_expr: '(' chp_add_expr_only ')'
      239                   | chp_mult_expr
      240 chp_shift_expr: chp_paren_add_expr
      241               | chp_shift_expr EXTRACT chp_add_expr
      242               | chp_shift_expr INSERT chp_add_expr
      243 chp_relational_expr: chp_shift_expr relational_op chp_shift_expr
      244                    | chp_unary_bool_expr
      245 chp_bitwise_and_expr: chp_relational_expr
      246                     | chp_bitwise_and_expr '&' chp_relational_expr
      247 chp_bitwise_xor_expr: chp_bitwise_and_expr
      248                     | chp_bitwise_xor_expr '^' chp_bitwise_and_expr
      249 chp_bitwise_or_expr: chp_bitwise_xor_expr
      250                    | chp_bitwise_or_expr '|' chp_bitwise_xor_expr
      251 chp_logical_and_expr: chp_bitwise_or_expr
      252                     | chp_logical_and_expr LOGICAL_AND chp_bitwise_or_expr
      253 chp_logical_or_expr: chp_logical_and_expr
      254                    | chp_logical_or_expr LOGICAL_OR chp_logical_and_expr
      255 chp_not_expr: '~' chp_unary_bool_expr
      256 chp_else_clause: ELSE RARROW chp_body_or_skip
      257 chp_binary_assignment: member_index_expr ASSIGN expr
      258 chp_bool_assignment: member_index_expr '+'
      259                    | member_index_expr '-'
      260 chp_concurrent_item: chp_body_item
      261                    | chp_sequence_group
      262 chp_concurrent_group: chp_concurrent_group ',' chp_concurrent_item
      263                     | chp_concurrent_item
      264 chp_send: member_index_expr '!' connection_actuals_list
      265         | member_index_expr '!'
      266 chp_recv: member_index_expr '?' member_index_expr_list_in_parens_optional
      267 chp_peek: member_index_expr '#' member_index_expr_list_in_parens
      268 hse_body_optional: hse_body
      269                  | /* empty */
      270 hse_body: full_hse_body_item_list
      271 full_hse_body_item_list: full_hse_body_item_list ';' full_hse_body_item
      272                        | full_hse_body_item
      273 full_hse_body_item: hse_body_item
      274 hse_body_item: hse_loop
      275              | hse_do_until
      276              | hse_wait
      277              | hse_selection
      278              | hse_assignment
      279              | SKIP
      280 hse_loop: BEGINLOOP hse_body ']'
      281 hse_do_until: BEGINLOOP hse_matched_det_guarded_command_list ']'
      282 hse_wait: '[' expr ']'
      283 hse_selection: '[' hse_matched_det_guarded_command_list ']'
      284              | '[' hse_nondet_guarded_command_list ']'
      285 hse_guarded_command: expr RARROW hse_body
      286 hse_else_clause: ELSE RARROW hse_body
      287 hse_nondet_guarded_command_list: hse_nondet_guarded_command_list ':' hse_guarded_command
      288                                | hse_guarded_command ':' hse_guarded_command
      289 hse_matched_det_guarded_command_list: hse_unmatched_det_guarded_command_list THICKBAR hse_else_clause
      290                                     | hse_unmatched_det_guarded_command_list
      291 hse_unmatched_det_guarded_command_list: hse_unmatched_det_guarded_command_list THICKBAR hse_guarded_command
      292                                       | hse_guarded_command
      293 hse_assignment: unary_assignment
      294 prs_body_optional: prs_body
      295                  | /* empty */
      296 prs_body: prs_body prs_body_item
      297         | prs_body_item
      298 prs_body_item: single_prs
      299              | prs_loop
      300              | prs_conditional
      301              | prs_macro
      302              | TREE_LANG optional_template_arguments_in_angles '{' prs_body_optional '}'
      303              | SUBCKT_LANG optional_template_arguments_in_angles '{' prs_body_optional '}'
      304 prs_macro: prs_literal mandatory_member_index_expr_list_in_parens
      305 prs_loop: '(' ':' ID ':' range ':' prs_body ')'
      306 prs_conditional: '[' prs_guarded_list ']'
      307 prs_guarded_list: prs_guarded_list_unmatched THICKBAR prs_else_clause
      308                 | prs_guarded_list_unmatched
      309 prs_guarded_list_unmatched: prs_guarded_list_unmatched THICKBAR prs_guarded_body
      310                           | prs_guarded_body
      311 prs_guarded_body: expr RARROW prs_body_optional
      312 prs_else_clause: ELSE RARROW prs_body
      313 single_prs: prs_rule_attribute_list_in_brackets prs_expr prs_arrow prs_literal_base dir
      314           | prs_expr prs_arrow prs_literal_base dir
      315 prs_rule_attribute_list_in_brackets: '[' prs_rule_attribute_list ']'
      316 prs_rule_attribute_list: prs_rule_attribute_list ';' prs_rule_attribute
      317                        | prs_rule_attribute
      318 prs_rule_attribute: ID '=' expr_list
      319 prs_arrow: RARROW
      320          | IMPLIES
      321          | HASH_ARROW
      322 dir: '+'
      323    | '-'
      324 prs_expr: prs_or
      325 prs_paren_expr: '(' prs_expr ')'
      326 prs_literal_base: relative_member_index_expr
      327                 | '@' ID optional_dense_range_list
      328 prs_literal: prs_literal_base expr_list_in_angles_optional
      329 prs_unary_expr: prs_literal
      330               | prs_paren_expr
      331               | prs_and_loop
      332               | prs_or_loop
      333 prs_not: '~' prs_unary_expr
      334        | prs_unary_expr
      335 prs_and: prs_and '&' prs_operator_attribute_optional prs_not
      336        | prs_not
      337 prs_or: prs_or '|' prs_and
      338       | prs_and
      339 prs_operator_attribute: '{' dir prs_expr '}'
      340 prs_operator_attribute_optional: prs_operator_attribute
      341                                | /* empty */
      342 prs_and_loop: '(' '&' ':' ID ':' range ':' prs_expr ')'
      343 prs_or_loop: '(' '|' ':' ID ':' range ':' prs_expr ')'
      344 spec_body_optional: spec_body
      345                   | /* empty */
      346 spec_body: spec_body spec_item
      347          | spec_item
      348 spec_item: spec_directive
      349 spec_directive: ID expr_list_in_angles_optional grouped_reference_list_in_parens
      350 grouped_reference_list_in_parens: '(' grouped_reference_list ')'
      351 grouped_reference_list: grouped_reference_list ',' grouped_reference
      352                       | grouped_reference
      353 grouped_reference: '{' mandatory_member_index_expr_list '}'
      354                  | member_index_expr
      355 paren_expr: '(' expr ')'
      356 literal: INT
      357        | FLOAT
      358        | string
      359        | BOOL_TRUE
      360        | BOOL_FALSE
      361 string: string STRING
      362       | STRING
      363 id_expr: generic_id
      364 generic_id: relative_id
      365           | absolute_id
      366 absolute_id: SCOPE relative_id
      367 relative_id: qualified_id
      368            | ID
      369 qualified_id: qualified_id SCOPE ID
      370             | ID SCOPE ID
      371 mandatory_member_index_expr_list_in_parens: '(' mandatory_member_index_expr_list ')'
      372 mandatory_member_index_expr_list: mandatory_member_index_expr_list ',' member_index_expr
      373                                 | member_index_expr
      374 member_index_expr_list: member_index_expr_list ',' optional_member_index_expr
      375                       | optional_member_index_expr
      376 optional_member_index_expr: member_index_expr
      377                           | /* empty */
      378 member_index_expr: id_expr
      379                  | index_expr
      380                  | member_expr
      381 relative_member_index_expr: ID
      382                           | local_index_expr
      383                           | local_member_expr
      384 local_index_expr: local_member_expr sparse_range_list
      385                 | ID sparse_range_list
      389 index_expr: member_expr sparse_range_list
      390           | id_expr sparse_range_list
      394 simple_expr: member_index_expr
      395            | literal
      396 unary_expr: simple_expr
      397           | function_call_expr
      398           | paren_expr
      399           | loop_expr
      400           | '-' unary_expr
      401           | '!' unary_expr
      402           | '~' unary_expr
      403 function_call_expr: member_index_expr connection_actuals_list
      404 multiplicative_expr: unary_expr
      405                    | multiplicative_expr muldiv_op unary_expr
      406 muldiv_op: '*'
      407          | '/'
      408          | '%'
      409 additive_expr: multiplicative_expr
      410              | additive_expr '+' multiplicative_expr
      411              | additive_expr '-' multiplicative_expr
      412 shift_expr: additive_expr
      413           | shift_expr EXTRACT additive_expr
      414           | shift_expr INSERT additive_expr
      415 relational_equality_expr: shift_expr
      416                         | '(' relational_equality_expr '<' shift_expr ')'
      417                         | '(' relational_equality_expr '>' shift_expr ')'
      418                         | relational_equality_expr LE shift_expr
      419                         | relational_equality_expr GE shift_expr
      420                         | relational_equality_expr EQUAL shift_expr
      421                         | relational_equality_expr NOTEQUAL shift_expr
      422                         | '(' relational_equality_expr '=' shift_expr ')'
      423 relational_op: '<'
      424              | '>'
      425              | LE
      426              | GE
      427              | EQUAL
      428              | NOTEQUAL
      429 and_expr: relational_equality_expr
      430         | and_expr '&' relational_equality_expr
      431 exclusive_or_expr: and_expr
      432                  | exclusive_or_expr '^' and_expr
      433 inclusive_or_expr: exclusive_or_expr
      434                  | inclusive_or_expr '|' exclusive_or_expr
      435 logical_and_expr: inclusive_or_expr
      436                 | logical_and_expr LOGICAL_AND inclusive_or_expr
      437 logical_or_expr: logical_and_expr
      438                | logical_or_expr LOGICAL_OR logical_and_expr
      439 unary_assignment: member_index_expr PLUSPLUS
      440                 | member_index_expr MINUSMINUS
      441 loop_expr: '(' loop_assoc_op ':' ID ':' range ':' expr ')'
      442 loop_assoc_op: '+'
      443              | '*'
      444              | '&'
      445              | '|'
      446              | '^'
      447              | LOGICAL_AND
      448              | LOGICAL_OR
      449 expr: logical_or_expr
      450 strict_relaxed_template_arguments: complex_expr_optional_list_in_angles optional_template_arguments_in_angles
      451                                  | /* empty */
      452 optional_template_arguments_in_angles: complex_expr_optional_list_in_angles
      453                                      | /* empty */
      454 expr_list_in_angles_optional: expr_list_in_angles
      455                             | /* empty */
      456 expr_list_in_angles: '<' expr_list '>'
      457 complex_expr_optional_list_in_angles: '<' complex_expr_optional_list '>'
      458 complex_expr_optional_list: complex_expr_optional_list ',' optional_complex_expr
      459                           | optional_complex_expr
      460 optional_complex_expr: array_concatenation
      461                      | /* empty */
      462 member_index_expr_list_in_parens_optional: member_index_expr_list_in_parens
      463                                          | /* empty */
      464 member_index_expr_list_in_parens: '(' member_index_expr_list ')'
      465 expr_list_in_parens: '(' expr_list ')'
      466 expr_list: expr_list ',' expr
      467          | expr
      468 range: expr RANGE expr
      469      | expr
      470 optional_dense_range_list: dense_range_list
      471                          | /* empty */
      472 dense_range_list: dense_range_list bracketed_dense_range
      473                 | bracketed_dense_range
      474 sparse_range_list: sparse_range_list bracketed_sparse_range
      475                  | bracketed_sparse_range
      476 bracketed_dense_range: '[' expr ']'
      477 bracketed_sparse_range: '[' range ']'
      478 complex_aggregate_reference: array_concatenation
      479 array_concatenation: array_concatenation '#' complex_expr_term
      480                    | complex_expr_term
      481 complex_expr_term: array_construction
      482                  | expr
      483 array_construction: '{' mandatory_complex_aggregate_reference_list '}'
      484 optional_complex_aggregate_reference: complex_aggregate_reference
      485                                     | /* empty */
      486 mandatory_complex_aggregate_reference_list: mandatory_complex_aggregate_reference_list ',' complex_aggregate_reference
      487                                           | complex_aggregate_reference
      488 complex_aggregate_reference_list: complex_aggregate_reference_list ',' optional_complex_aggregate_reference
      489                                 | optional_complex_aggregate_reference