chipsalliance / verible

Verible is a suite of SystemVerilog developer tools, including a parser, style-linter, formatter and language server
https://chipsalliance.github.io/verible/
Other
1.3k stars 199 forks source link

Grammar railroad diagram #862

Open mingodad opened 3 years ago

mingodad commented 3 years ago

I've done a experimental tool to convert bison grammars to a kind of EBNF understood by https://www.bottlecaps.de/rr/ui to generate railroad diagrams see bellow the converted verilog/parser/verilog.y and with some hand made changes to allow view it at https://www.bottlecaps.de/rr/ui the order of the rules could be changed to a better view of the railroad diagrams. Copy and paste the EBNF bellow on https://www.bottlecaps.de/rr/ui tab Edit Grammar then switch to the tab View Diagram.

/*
From https://raw.githubusercontent.com/google/verible/master/verilog/parser/verilog.y
*/

source_text ::=
    description_list
    | /* empty */

GenericIdentifier ::=
    SymbolIdentifier
    | EscapedIdentifier
    | MacroIdentifier
    | KeywordIdentifier
    | unary_builtin_function
    | binary_builtin_function

KeywordIdentifier ::=
    TK_branch
    | TK_access
    | TK_exclude
    | TK_flow
    | TK_from
    | TK_ground
    | TK_connect
    | TK_ddx
    | TK_ddt
    | TK_idt
    | TK_idtmod
    | TK_split
    | TK_merged
    | TK_timer
    | TK_above
    | TK_discrete
    | TK_initial_step
    | TK_final_step
    | TK_sample
    | TK_bool

preprocessor_directive ::=
    preprocessor_control_flow
    | preprocessor_action

preprocessor_if_header ::=
    PP_ifdef PP_Identifier
    | PP_ifndef PP_Identifier

preprocessor_elsif_header ::=
    PP_elsif PP_Identifier

preprocessor_control_flow ::=
    preprocessor_if_header
    | preprocessor_elsif_header
    | PP_else
    | PP_endif

preprocessor_action ::=
    PP_undef PP_Identifier
    | PP_include preprocess_include_argument
    | PP_define PP_Identifier PP_define_body
    | PP_define PP_Identifier '(' macro_formals_list_opt ')' PP_define_body

macro_formals_list_opt ::=
    macro_formals_list
    | /* empty */

macro_formals_list ::=
    macro_formals_list ',' macro_formal_parameter
    | macro_formal_parameter

macro_formal_parameter ::=
    PP_Identifier
    | PP_Identifier '=' PP_default_text

preprocess_include_argument ::=
    string_literal
    | MacroIdentifier
    | MacroGenericItem
    | MacroCall

MacroGenericItem ::=
    MacroCallItem
    | MacroIdItem

MacroCallItem ::=
    MacroCallId '(' macro_args_opt MacroCallCloseToEndLine

MacroCall ::=
    MacroCallId '(' macro_args_opt ')'

macro_args_opt ::=
    macro_args_opt ',' macro_arg_opt
    | macro_arg_opt

macro_arg_opt ::=
    MacroArg
    | /* empty */

procedural_assertion_statement ::=
    concurrent_assertion_statement
    | immediate_assertion_statement

assertion_item ::=
    concurrent_assertion_item
    | deferred_immediate_assertion_item

assignment_pattern ::=
    TK_LP expression_list_proper '}'
    | TK_LP structure_or_array_pattern_expression_list '}'
    | TK_LP expression '{' expression_list_proper '}' '}'
    | TK_LP '}'

structure_or_array_pattern_expression_list ::=
    structure_or_array_pattern_expression_list ',' structure_or_array_pattern_expression
    | structure_or_array_pattern_expression

structure_or_array_pattern_expression ::=
    structure_or_array_pattern_key ':' expression

structure_or_array_pattern_key ::=
    expression
    | simple_type
    | TK_default

simple_type ::=
    integer_atom_type
    | integer_vector_type

block_identifier_opt ::=
    unqualified_id ':'
    | /* empty */

interface_class_declaration ::=
    TK_interface TK_class GenericIdentifier module_parameter_port_list_opt declaration_extends_list_opt ';' interface_class_item_list_opt TK_endclass label_opt

declaration_extends_list_opt ::=
    declaration_extends_list
    | /* empty */

declaration_extends_list ::=
    TK_extends class_id
    | declaration_extends_list ',' class_id

implements_interface_list_opt ::=
    implements_interface_list
    | /* empty */

implements_interface_list ::=
    implements_interface_list ',' class_id
    | TK_implements class_id

interface_class_item_list_opt ::=
    interface_class_item_list
    | /* empty */

interface_class_item_list ::=
    interface_class_item_list interface_class_item
    | interface_class_item

interface_class_item ::=
    type_declaration
    | any_param_declaration
    | interface_class_method
    | ';'

interface_class_method ::=
    TK_pure TK_virtual method_prototype ';'

method_prototype ::=
    task_prototype
    | function_prototype

class_declaration ::=
    TK_virtual_opt TK_class lifetime_opt GenericIdentifier module_parameter_port_list_opt class_declaration_extends_opt implements_interface_list_opt ';' class_items_opt TK_endclass label_opt

class_constraint ::=
    constraint_prototype
    | constraint_declaration

class_declaration_extends_opt ::=
    TK_extends class_id
    | /* empty */

unqualified_id ::=
    GenericIdentifier parameter_value_opt

qualified_id ::=
    qualified_id TK_SCOPE_RES unqualified_id
    | unqualified_id TK_SCOPE_RES unqualified_id
    | TK_Sunit TK_SCOPE_RES unqualified_id
    | qualified_id TK_SCOPE_RES TK_new
    | unqualified_id TK_SCOPE_RES TK_new

class_id ::=
    qualified_id
    | unqualified_id

class_items_opt ::=
    class_items
    | /* empty */

class_items ::=
    class_items class_item
    | class_item

class_constructor_prototype ::=
    TK_function TK_new tf_port_list_paren_opt

class_constructor ::=
    class_constructor_prototype ';' tf_item_or_statement_or_null_list_opt TK_endfunction endnew_opt

class_item ::=
    method_property_qualifier_list_not_starting_with_virtual class_constructor
    | class_constructor
    | TK_virtual method_qualifier_list_opt class_constructor
    | method_property_qualifier_list_not_starting_with_virtual const_opt var_opt data_type list_of_variable_decl_assignments ';'
    | data_type list_of_variable_decl_assignments ';'
    | TK_const class_item_qualifier_list_opt data_type list_of_variable_decl_assignments ';'
    | interface_data_declaration
    | net_type_declaration
    | package_import_declaration
    | method_property_qualifier_list_not_starting_with_virtual task_declaration
    | task_declaration
    | TK_virtual method_qualifier_list_opt task_declaration
    | method_property_qualifier_list_not_starting_with_virtual function_declaration
    | function_declaration
    | TK_virtual method_qualifier_list_opt function_declaration
    | TK_pure TK_virtual class_item_qualifier_list_opt method_prototype ';'
    | TK_extern method_qualifier_list_opt method_prototype ';'
    | TK_extern method_qualifier_list_opt class_constructor_prototype ';'
    | class_declaration
    | interface_class_declaration
    | class_constraint
    | type_declaration
    | any_param_declaration
    | covergroup_declaration
    | ';'
    | macro_call_or_item
    | preprocessor_balanced_class_items
    | preprocessor_action
    | error ';'
    | error TK_endfunction
    | error TK_endtask
    | error TK_endgroup

interface_data_declaration ::=
    interface_type list_of_variable_decl_assignments ';'

preprocessor_balanced_class_items ::=
    preprocessor_if_header class_items_opt preprocessor_elsif_class_items_opt preprocessor_else_class_item_opt PP_endif

preprocessor_elsif_class_items_opt ::=
    preprocessor_elsif_class_items
    | /* empty */

preprocessor_elsif_class_items ::=
    preprocessor_elsif_class_items preprocessor_elsif_class_item
    | preprocessor_elsif_class_item

preprocessor_elsif_class_item ::=
    preprocessor_elsif_header class_items_opt

preprocessor_else_class_item_opt ::=
    preprocessor_else_class_item
    | /* empty */

preprocessor_else_class_item ::=
    PP_else class_items_opt

macro_call_or_item ::=
    MacroGenericItem
    | MacroCall ';'

class_item_qualifier ::=
    TK_static
    | TK_protected
    | TK_local

class_item_qualifier_list_opt ::=
    class_item_qualifier_list
    | /* empty */

class_item_qualifier_list ::=
    class_item_qualifier_list class_item_qualifier
    | class_item_qualifier

class_new ::=
    TK_new '(' argument_list_opt ')'
    | TK_new reference
    | TK_new

action_block ::=
    statement_or_null
    | statement_or_null TK_else statement_or_null
    | TK_else statement_or_null

concurrent_assertion_item ::=
    block_identifier_opt concurrent_assertion_statement

concurrent_assertion_statement ::=
    assert_property_statement
    | assume_property_statement
    | cover_property_statement
    | cover_sequence_statement
    | restrict_property_statement

assert_property_statement ::=
    TK_assert TK_property '(' property_spec ')' action_block

assume_property_statement ::=
    TK_assume TK_property '(' property_spec ')' action_block

cover_property_statement ::=
    TK_cover TK_property '(' property_spec ')' statement_or_null

expect_property_statement ::=
    TK_expect '(' property_spec ')' action_block

cover_sequence_statement ::=
    TK_cover TK_sequence '(' sequence_spec ')' statement_or_null

restrict_property_statement ::=
    TK_restrict TK_property '(' property_spec ')' ';'

deferred_immediate_assertion_item ::=
    block_identifier_opt deferred_immediate_assertion_statement

immediate_assertion_statement ::=
    simple_immediate_assertion_statement
    | deferred_immediate_assertion_statement

simple_immediate_assertion_statement ::=
    TK_assert '(' expression ')' action_block
    | TK_assume '(' expression ')' action_block
    | TK_cover '(' expression ')' statement_or_null

deferred_immediate_assertion_statement ::=
    TK_assert final_or_zero '(' expression ')' action_block
    | TK_assume final_or_zero '(' expression ')' action_block
    | TK_cover final_or_zero '(' expression ')' statement_or_null

final_or_zero ::=
    TK_final
    | '#' TK_DecNumber

constraint_block ::=
    '{' constraint_block_item_list_opt '}'

constraint_block_item ::=
    constraint_expression_no_preprocessor
    | preprocessor_balanced_constraint_block_item

constraint_primary_list ::=
    constraint_primary_list ',' constraint_primary
    | constraint_primary

constraint_block_item_list ::=
    constraint_block_item_list constraint_block_item
    | constraint_block_item

constraint_block_item_list_opt ::=
    constraint_block_item_list
    | /* empty */

preprocessor_balanced_constraint_block_item ::=
    preprocessor_if_header constraint_block_item_list_opt preprocessor_elsif_constraint_block_items_opt preprocessor_else_constraint_block_item_opt PP_endif

preprocessor_elsif_constraint_block_items_opt ::=
    preprocessor_elsif_constraint_block_items
    | /* empty */

preprocessor_elsif_constraint_block_items ::=
    preprocessor_elsif_constraint_block_items preprocessor_elsif_constraint_block_item
    | preprocessor_elsif_constraint_block_item

preprocessor_elsif_constraint_block_item ::=
    preprocessor_elsif_header constraint_block_item_list_opt

preprocessor_else_constraint_block_item_opt ::=
    preprocessor_else_constraint_block_item
    | /* empty */

preprocessor_else_constraint_block_item ::=
    PP_else constraint_block_item_list_opt

constraint_declaration_package_item ::=
    TK_constraint class_id constraint_block

constraint_declaration ::=
    TK_static_opt TK_constraint GenericIdentifier constraint_block

constraint_expression_no_preprocessor ::=
    TK_soft expression_or_dist ';'
    | expression_or_dist ';'
    | expression TK_CONSTRAINT_IMPLIES constraint_set
    | TK_if '(' expression ')' constraint_set
    | TK_if '(' expression ')' constraint_set TK_else constraint_set
    | TK_foreach '(' reference ')' constraint_set
    | uniqueness_constraint ';'
    | TK_disable TK_soft constraint_primary ';'
    | TK_solve constraint_primary_list TK_before constraint_primary_list ';'

constraint_expression ::=
    constraint_expression_no_preprocessor
    | preprocessor_balanced_constraint_expressions

constraint_primary ::=
    reference

uniqueness_constraint ::=
    TK_unique '{' open_range_list '}'

constraint_expression_list ::=
    constraint_expression_list constraint_expression
    | constraint_expression

constraint_expression_list_opt ::=
    constraint_expression_list
    | /* empty */

preprocessor_balanced_constraint_expressions ::=
    preprocessor_if_header constraint_expression_list_opt preprocessor_elsif_constraint_expressions_opt preprocessor_else_constraint_expression_opt PP_endif

preprocessor_elsif_constraint_expressions_opt ::=
    preprocessor_elsif_constraint_expressions
    | /* empty */

preprocessor_elsif_constraint_expressions ::=
    preprocessor_elsif_constraint_expressions preprocessor_elsif_constraint_expression
    | preprocessor_elsif_constraint_expression

preprocessor_elsif_constraint_expression ::=
    preprocessor_elsif_header constraint_expression_list_opt

preprocessor_else_constraint_expression_opt ::=
    preprocessor_else_constraint_expression
    | /* empty */

preprocessor_else_constraint_expression ::=
    PP_else constraint_expression_list_opt

constraint_prototype ::=
    TK_static_opt TK_constraint GenericIdentifier ';'

constraint_set ::=
    constraint_expression
    | '{' constraint_expression_list '}'

const_opt ::=
    TK_const
    | /* empty */

var_opt ::=
    TK_var
    | /* empty */

data_declaration_base ::=
    data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_decl_assignment_opt ',' list_of_variable_decl_assignments ';'
    | data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_decl_assignment_opt ';'

data_declaration_modifiers_opt ::=
    const_opt var_opt lifetime_opt

data_declaration ::=
    data_declaration_modifiers_opt data_declaration_base

data_type_primitive ::=
    data_type_primitive_scalar decl_dimensions_opt

data_type_primitive_scalar ::=
    integer_vector_type signed_unsigned_opt
    | non_integer_type
    | struct_data_type
    | enum_data_type
    | integer_atom_type signed_unsigned_opt
    | TK_chandle
    | TK_string
    | TK_event

data_type_base ::=
    data_type_primitive
    | reference_or_call
    | type_reference

type_reference ::=
    TK_type '(' expression ')'

data_type ::=
    data_type_base

interface_type ::=
    TK_virtual interface_opt GenericIdentifier parameter_value_opt
    | TK_virtual interface_opt GenericIdentifier parameter_value_opt '.' member_name

interface_opt ::=
    TK_interface
    | /* empty */

delay3_or_drive_opt ::=
    delay3
    | drive_strength
    | /* empty */

scope_or_if_res ::=
    TK_SCOPE_RES
    | '.'

type_identifier_or_implicit_followed_by_id_and_dimensions_opt ::=
    GenericIdentifier delay3 decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | GenericIdentifier drive_strength decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | GenericIdentifier decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | GenericIdentifier scope_or_if_res GenericIdentifier delay3_or_drive_opt decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | GenericIdentifier decl_dimensions_opt
    | delay3 decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | drive_strength decl_dimensions_opt GenericIdentifier decl_dimensions_opt

type_identifier_followed_by_id ::=
    unqualified_id decl_dimensions_opt GenericIdentifier
    | qualified_id decl_dimensions_opt GenericIdentifier
    | unqualified_id '.' member_name decl_dimensions_opt GenericIdentifier
    | TK_interface '.' member_name GenericIdentifier
    | TK_interface GenericIdentifier

type_identifier_or_implicit_basic_followed_by_id ::=
    unqualified_id GenericIdentifier
    | qualified_id GenericIdentifier
    | unqualified_id
    | unqualified_id '.' member_name GenericIdentifier
    | TK_interface '.' member_name GenericIdentifier
    | TK_interface GenericIdentifier

type_identifier_or_implicit_basic_followed_by_id_and_dimensions_opt ::=
    qualified_id decl_dimensions_opt class_id decl_dimensions_opt
    | unqualified_id decl_dimensions_opt class_id decl_dimensions_opt
    | unqualified_id '.' member_name decl_dimensions_opt class_id decl_dimensions_opt
    | unqualified_id decl_dimensions_opt
    | qualified_id decl_dimensions_opt

data_type_or_implicit ::=
    decl_dimensions delay3_or_drive_opt
    | signing decl_dimensions_opt delay3_or_drive_opt
    | GenericIdentifier decl_dimensions_opt delay3_or_drive_opt
    | GenericIdentifier TK_SCOPE_RES GenericIdentifier decl_dimensions_opt delay3_or_drive_opt

data_type_or_implicit_followed_by_id_and_dimensions_opt ::=
    data_type_primitive GenericIdentifier decl_dimensions_opt
    | type_identifier_or_implicit_followed_by_id_and_dimensions_opt
    | signing decl_dimensions_opt delay3_or_drive_opt GenericIdentifier decl_dimensions_opt
    | decl_dimensions delay3_or_drive_opt GenericIdentifier decl_dimensions_opt
    | TK_void GenericIdentifier decl_dimensions_opt

data_type_or_implicit_basic_followed_by_id ::=
    data_type_primitive GenericIdentifier
    | type_identifier_or_implicit_basic_followed_by_id
    | signing decl_dimensions_opt GenericIdentifier
    | decl_dimensions GenericIdentifier
    | TK_void GenericIdentifier

data_type_or_implicit_basic_followed_by_id_and_dimensions_opt ::=
    data_type_primitive class_id decl_dimensions_opt
    | type_identifier_or_implicit_basic_followed_by_id_and_dimensions_opt
    | signing decl_dimensions_opt class_id decl_dimensions_opt
    | decl_dimensions class_id decl_dimensions_opt
    | TK_void class_id decl_dimensions_opt

description ::=
    module_or_interface_declaration
    | udp_primitive
    | config_declaration
    | nature_declaration
    | package_declaration
    | discipline_declaration
    | package_item_no_pp
    | TKK_attribute '(' GenericIdentifier ',' TK_StringLiteral ',' TK_StringLiteral ')'
    | bind_directive
    | preprocessor_balanced_description_items
    | preprocessor_action
    | library_source

description_list_opt ::=
    description_list
    | /* empty */

description_list ::=
    description
    | description_list description

library_source ::=
    PD_LIBRARY_SYNTAX_BEGIN library_description_list_opt PD_LIBRARY_SYNTAX_END

library_description_list_opt ::=
    library_description_list
    | /* empty */

library_description_list ::=
    library_description_list library_description
    | library_description

library_description ::=
    library_declaration
    | include_statement
    | config_declaration
    | ';'

preprocessor_balanced_description_items ::=
    preprocessor_if_header description_list_opt preprocessor_elsif_description_items_opt preprocessor_else_description_item_opt PP_endif

preprocessor_elsif_description_items_opt ::=
    preprocessor_elsif_description_items
    | /* empty */

preprocessor_elsif_description_items ::=
    preprocessor_elsif_description_items preprocessor_elsif_description_item
    | preprocessor_elsif_description_item

preprocessor_elsif_description_item ::=
    preprocessor_elsif_header description_list_opt

preprocessor_else_description_item_opt ::=
    preprocessor_else_description_item
    | /* empty */

preprocessor_else_description_item ::=
    PP_else description_list_opt

endnew_opt ::=
    ':' TK_new
    | /* empty */

dynamic_array_new ::=
    TK_new '[' expression ']'
    | TK_new '[' expression ']' '(' expression ')'

for_step_opt ::=
    for_step
    | /* empty */

for_step ::=
    for_step ',' assignment_statement
    | assignment_statement

assignment_statement ::=
    assignment_statement_no_expr
    | inc_or_dec_expression

assignment_statement_no_expr ::=
    lpvalue '=' expression
    | assign_modify_statement

function_prototype ::=
    TK_function lifetime_opt function_return_type_and_id tf_port_list_paren_opt

function_return_type_and_id ::=
    data_type_or_implicit_basic_followed_by_id_and_dimensions_opt
    | interface_type class_id

function_declaration ::=
    TK_function lifetime_opt function_return_type_and_id '(' tf_port_list_opt ')' ';' block_item_or_statement_or_null_list_opt TK_endfunction endfunction_label_opt
    | TK_function lifetime_opt function_return_type_and_id ';' function_item_list statement_or_null_list_opt TK_endfunction endfunction_label_opt
    | TK_function lifetime_opt function_return_type_and_id ';' statement_or_null_list_opt TK_endfunction endfunction_label_opt

endfunction_label_opt ::=
    label_opt
    | ':' TK_new

implicit_class_handle ::=
    TK_this
    | TK_super

inc_or_dec_expression ::=
    TK_INCR lpvalue
    | lpvalue TK_INCR
    | TK_DECR lpvalue
    | lpvalue TK_DECR

integer_atom_type ::=
    TK_byte
    | TK_shortint
    | TK_int
    | TK_longint
    | TK_integer
    | TK_time

integer_vector_type ::=
    TK_reg
    | TK_bit
    | TK_logic

join_keyword ::=
    TK_join
    | TK_join_none
    | TK_join_any

jump_statement ::=
    TK_break ';'
    | TK_continue ';'
    | TK_return ';'
    | TK_return expression ';'

loop_statement ::=
    TK_for '(' for_initialization_opt ';' expression_opt ';' for_step_opt ')' statement_or_null
    | TK_forever statement_or_null
    | repeat_control statement_or_null
    | TK_while '(' expression ')' statement_or_null
    | TK_do statement_or_null TK_while '(' expression ')' ';'
    | TK_foreach '(' reference ')' statement_or_null

for_initialization_opt ::=
    for_initialization
    | /* empty */

for_initialization ::=
    for_initialization ',' for_init_decl_or_assign
    | for_init_decl_or_assign

for_init_decl_or_assign ::=
    lpvalue '=' expression
    | data_type GenericIdentifier '=' expression
    | TK_var data_type GenericIdentifier '=' expression

list_of_variable_decl_assignments ::=
    variable_decl_assignment
    | list_of_variable_decl_assignments ',' variable_decl_assignment

variable_decl_assignment ::=
    GenericIdentifier decl_dimensions_opt trailing_decl_assignment_opt

trailing_decl_assignment_opt ::=
    trailing_decl_assignment
    | /* empty */

trailing_decl_assignment ::=
    '=' dynamic_array_new
    | '=' expression
    | '=' class_new

method_qualifier_list_opt ::=
    method_qualifier_list
    | /* empty */

method_qualifier_list ::=
    method_qualifier_list method_qualifier
    | method_qualifier

method_property_qualifier_list_not_starting_with_virtual ::=
    method_property_qualifier_list_not_starting_with_virtual method_property_qualifier
    | property_qualifier

method_qualifier ::=
    TK_virtual
    | TK_pure TK_virtual
    | class_item_qualifier

method_property_qualifier ::=
    TK_virtual
    | class_item_qualifier
    | random_qualifier

modport_declaration ::=
    TK_modport modport_item_list ';'

modport_item_list ::=
    modport_item
    | modport_item_list ',' modport_item

modport_item ::=
    GenericIdentifier '(' modport_ports_list ')'

modport_ports_list ::=
    modport_simple_ports_declaration_last
    | modport_tf_ports_declaration_last
    | modport_clocking_declaration_last

dpi_spec_string ::=
    TK_StringLiteral

dpi_import_property_opt ::=
    dpi_import_property
    | /* empty */

dpi_import_property ::=
    TK_context
    | TK_pure

dpi_import_export ::=
    dpi_import_item
    | dpi_export_item

dpi_export_item ::=
    TK_export dpi_spec_string GenericIdentifier '=' modport_tf_port ';'
    | TK_export dpi_spec_string modport_tf_port ';'

import_export ::=
    TK_export
    | TK_import

dpi_import_item ::=
    TK_import dpi_spec_string dpi_import_property_opt GenericIdentifier '=' method_prototype ';'
    | TK_import dpi_spec_string dpi_import_property_opt method_prototype ';'

modport_ports_declaration_trailing_comma ::=
    modport_simple_ports_declaration_trailing_comma
    | modport_tf_ports_declaration_trailing_comma
    | modport_clocking_declaration_trailing_comma

modport_simple_ports_declaration_trailing_comma ::=
    modport_simple_ports_declaration_last ','

modport_tf_ports_declaration_trailing_comma ::=
    modport_tf_ports_declaration_last ','

modport_clocking_declaration_trailing_comma ::=
    modport_clocking_declaration_last ','

modport_tf_ports_declaration_begin ::=
    import_export
    | modport_ports_declaration_trailing_comma import_export

modport_tf_ports_declaration_last ::=
    modport_tf_ports_declaration_begin modport_tf_port
    | modport_tf_ports_declaration_trailing_comma modport_tf_port

modport_clocking_declaration_begin ::=
    TK_clocking
    | modport_ports_declaration_trailing_comma TK_clocking

modport_clocking_declaration_last ::=
    modport_clocking_declaration_begin GenericIdentifier

modport_simple_ports_declaration_begin ::=
    port_direction
    | modport_ports_declaration_trailing_comma port_direction

modport_simple_ports_declaration_last ::=
    modport_simple_ports_declaration_begin modport_simple_port
    | modport_simple_ports_declaration_trailing_comma modport_simple_port

modport_simple_port ::=
    '.' member_name '(' expression ')'
    | GenericIdentifier

modport_tf_port ::=
    task_prototype
    | function_prototype
    | GenericIdentifier

non_integer_type ::=
    TK_real
    | TK_realtime
    | TK_shortreal

macro_digits ::=
    MacroCall
    | MacroIdentifier

based_number ::=
    dec_based_number
    | bin_based_number
    | oct_based_number
    | hex_based_number

dec_based_number ::=
    TK_DecBase TK_DecDigits
    | TK_DecBase TK_XZDigits
    | TK_DecBase macro_digits

bin_based_number ::=
    TK_BinBase TK_BinDigits
    | TK_BinBase macro_digits

oct_based_number ::=
    TK_OctBase TK_OctDigits
    | TK_OctBase macro_digits

hex_based_number ::=
    TK_HexBase TK_HexDigits
    | TK_HexBase macro_digits

number ::=
    based_number
    | TK_DecNumber
    | constant_dec_number based_number
    | TK_UnBasedNumber
    | constant_dec_number TK_UnBasedNumber

constant_dec_number ::=
    TK_DecNumber
    | MacroNumericWidth

open_range_list ::=
    open_range_list ',' value_range
    | value_range

package_declaration ::=
    TK_package lifetime_opt GenericIdentifier ';' package_item_list_opt TK_endpackage label_opt

module_package_import_list_opt ::=
    package_import_list
    | /* empty */

package_import_list ::=
    package_import_declaration
    | package_import_list package_import_declaration

package_import_declaration ::=
    TK_import package_import_item_list ';'

package_export_declaration ::=
    TK_export '*' TK_SCOPE_RES '*' ';'
    | TK_export package_import_item_list ';'

package_import_item ::=
    scope_prefix GenericIdentifier
    | scope_prefix '*'

package_import_item_list ::=
    package_import_item_list ',' package_import_item
    | package_import_item

package_item ::=
    package_item_no_pp
    | preprocessor_balanced_package_items
    | preprocessor_action

package_item_no_pp ::=
    package_or_generate_item_declaration
    | timeunits_declaration
    | type_declaration
    | data_declaration
    | net_type_declaration
    | interface_data_declaration
    | clocking_declaration
    | let_declaration
    | constraint_declaration_package_item
    | package_import_declaration
    | package_export_declaration
    | timescale_directive
    | misc_directive
    | module_item_directive
    | macro_call_or_item
    | error ';'
    | any_param_declaration
    | TK_initial statement_item

preprocessor_balanced_package_items ::=
    preprocessor_if_header package_item_list_opt preprocessor_elsif_package_items_opt preprocessor_else_package_item_opt PP_endif

preprocessor_elsif_package_items_opt ::=
    preprocessor_elsif_package_items
    | /* empty */

preprocessor_elsif_package_items ::=
    preprocessor_elsif_package_items preprocessor_elsif_package_item
    | preprocessor_elsif_package_item

preprocessor_elsif_package_item ::=
    preprocessor_elsif_header package_item_list_opt

preprocessor_else_package_item_opt ::=
    preprocessor_else_package_item
    | /* empty */

preprocessor_else_package_item ::=
    PP_else package_item_list_opt

package_item_list ::=
    package_item_list package_item
    | package_item

package_item_list_opt ::=
    package_item_list
    | /* empty */

misc_directive ::=
    DR_resetall
    | DR_celldefine
    | DR_endcelldefine
    | DR_unconnected_drive pull01
    | DR_nounconnected_drive
    | DR_default_nettype net_type_or_none
    | DR_suppress_faults
    | DR_nosuppress_faults
    | DR_enable_portfaults
    | DR_disable_portfaults
    | DR_delay_mode_distributed
    | DR_delay_mode_path
    | DR_delay_mode_unit
    | DR_delay_mode_zero
    | DR_default_decay_time decay_value_simple
    | DR_default_trireg_strength TK_DecNumber
    | DR_pragma
    | DR_uselib
    | DR_begin_keywords TK_StringLiteral
    | DR_end_keywords

net_type_or_none ::=
    net_type
    | GenericIdentifier

module_item_directive ::=
    DR_protect
    | DR_endprotect

port_direction ::=
    dir
    | TK_ref

tf_port_direction ::=
    port_direction
    | TK_const TK_ref

tf_port_direction_opt ::=
    tf_port_direction
    | /* empty */

property_qualifier ::=
    class_item_qualifier
    | random_qualifier

property_spec ::=
    event_control_opt property_spec_disable_iff_opt property_expr

sequence_spec ::=
    event_control_opt property_spec_disable_iff_opt sequence_expr

property_spec_disable_iff ::=
    TK_disable TK_iff '(' expression_or_dist ')'

property_spec_disable_iff_opt ::=
    property_spec_disable_iff
    | /* empty */

random_qualifier_opt ::=
    random_qualifier
    | /* empty */

random_qualifier ::=
    TK_rand
    | TK_randc

signing ::=
    TK_signed
    | TK_unsigned

statement ::=
    statement_item
    | unqualified_id ':' statement_item

statement_or_null ::=
    statement
    | ';'

block_item_or_statement_or_null ::=
    block_item_decl
    | statement_or_null

block_item_or_statement_or_null_list ::=
    block_item_or_statement_or_null_list block_item_or_statement_or_null
    | block_item_or_statement_or_null

block_item_or_statement_or_null_list_opt ::=
    block_item_or_statement_or_null_list
    | /* empty */

stream_expression ::=
    expression

stream_expression_list ::=
    stream_expression_list ',' stream_expression
    | stream_expression

stream_operator ::=
    TK_LS
    | TK_RS

streaming_concatenation ::=
    '{' stream_operator slice_size_opt '{' stream_expression_list '}' '}'
    | '{' stream_operator slice_size MacroCall '}'
    | '{' stream_operator slice_size MacroIdentifier '}'
    | '{' stream_operator MacroCall '}'
    | '{' stream_operator MacroIdentifier '}'

slice_size_opt ::=
    slice_size
    | /* empty */

slice_size ::=
    expr_primary_no_groups
    | expr_primary_parens
    | reference_or_call
    | data_type_primitive

task_prototype ::=
    TK_task lifetime_opt GenericIdentifier tf_port_list_paren_opt

task_declaration ::=
    TK_task lifetime_opt task_declaration_id tf_port_list_paren_opt ';' tf_item_or_statement_or_null_list_opt TK_endtask label_opt

task_declaration_id ::=
    GenericIdentifier scope_or_if_res GenericIdentifier
    | GenericIdentifier

tf_port_declaration ::=
    tf_port_direction signed_unsigned_opt qualified_id decl_dimensions_opt list_of_tf_variable_identifiers ';'
    | tf_port_direction signed_unsigned_opt unqualified_id decl_dimensions_opt list_of_tf_variable_identifiers ';'
    | tf_port_direction signed_unsigned_opt decl_dimensions list_of_tf_variable_identifiers ';'
    | tf_port_direction signed_unsigned_opt list_of_tf_variable_identifiers ';'
    | tf_port_direction data_type_primitive list_of_tf_variable_identifiers ';'

list_of_tf_variable_identifiers ::=
    list_of_tf_variable_identifiers ',' tf_variable_identifier
    | tf_variable_identifier_first

tf_variable_identifier_first ::=
    unqualified_id decl_dimensions_opt trailing_assign_opt

tf_variable_identifier ::=
    GenericIdentifier decl_dimensions_opt trailing_assign_opt

tf_port_item ::=
    tf_port_direction_opt data_type_or_implicit_basic_followed_by_id_and_dimensions_opt tf_port_item_expr_opt
    | tf_port_direction_opt interface_type GenericIdentifier decl_dimensions_opt tf_port_item_expr_opt

tf_port_item_expr_opt ::=
    '=' expression
    | /* empty */

tf_port_list ::=
    tf_port_list_item_last
    | tf_port_list_preprocessor_last

tf_port_list_trailing_comma ::=
    tf_port_list ','

tf_port_list_item_last ::=
    tf_port_list_trailing_comma tf_port_item
    | tf_port_list_preprocessor_last tf_port_item
    | tf_port_item

tf_port_list_preprocessor_last ::=
    tf_port_list preprocessor_directive
    | tf_port_list_trailing_comma preprocessor_directive
    | preprocessor_directive

timescale_directive ::=
    DR_timescale time_literal '/' time_literal
    | DR_timescale MacroGenericItem

time_literal ::=
    TK_TimeLiteral
    | TK_DecNumber TK_timescale_unit

timeunits_declaration ::=
    TK_timeunit TK_TimeLiteral ';'
    | TK_timeunit TK_TimeLiteral '/' TK_TimeLiteral ';'
    | TK_timeprecision TK_TimeLiteral ';'
    | TK_timeunit_check TK_TimeLiteral ';'
    | TK_timeunit_check TK_TimeLiteral '/' TK_TimeLiteral ';'
    | TK_timeprecision_check TK_TimeLiteral ';'

value_range ::=
    expression
    | '[' expression ':' expression ']'

select_variable_dimension ::=
    '[' expression ':' expression ']'
    | '[' expression_or_null_list_opt ']'
    | '[' expression TK_PO_POS expression ']'
    | '[' expression TK_PO_NEG expression ']'

decl_variable_dimension ::=
    '[' expression ':' expression ']'
    | '[' expression_or_null_list_opt ']'
    | '[' expression TK_PO_POS expression ']'
    | '[' expression TK_PO_NEG expression ']'
    | '[' data_type_primitive ']'
    | lb_star_rb

lb_star_rb ::=
    '[' '*' ']'
    | TK_LBSTARRB
    | TK_LBSTAR ']'

any_param_declaration ::=
    TK_parameter param_type_followed_by_id_and_dimensions_opt trailing_assign ',' parameter_assign_list ';'
    | TK_parameter param_type_followed_by_id_and_dimensions_opt trailing_assign ';'
    | TK_localparam param_type_followed_by_id_and_dimensions_opt trailing_assign ',' localparam_assign_list ';'
    | TK_localparam param_type_followed_by_id_and_dimensions_opt trailing_assign ';'
    | TK_parameter TK_type type_assignment_list ';'
    | TK_localparam TK_type type_assignment_list ';'

instantiation_type ::=
    data_type
    | interface_type

instantiation_base ::=
    instantiation_type gate_instance_or_register_variable_list

data_declaration_or_module_instantiation ::=
    instantiation_base ';'
    | lifetime const_opt instantiation_base ';'
    | TK_var lifetime_opt instantiation_base ';'
    | TK_const var_opt lifetime_opt instantiation_base ';'

net_type_declaration ::=
    TK_nettype data_type unqualified_id ';'
    | TK_nettype data_type unqualified_id TK_with class_id ';'

block_item_decl ::=
    data_declaration_or_module_instantiation
    | net_type_declaration
    | package_import_declaration
    | any_param_declaration
    | type_declaration
    | let_declaration

type_declaration ::=
    TK_typedef data_type GenericIdentifier decl_dimensions_opt ';'
    | TK_typedef TK_class GenericIdentifier ';'
    | TK_typedef TK_interface TK_class GenericIdentifier ';'
    | TK_typedef interface_type GenericIdentifier ';'
    | TK_typedef TK_enum GenericIdentifier ';'
    | TK_typedef TK_struct GenericIdentifier ';'
    | TK_typedef TK_union GenericIdentifier ';'
    | TK_typedef GenericIdentifier ';'

enum_data_type ::=
    TK_enum '{' enum_name_list '}'
    | TK_enum data_type '{' enum_name_list '}'

enum_name_list ::=
    enum_name_list_preprocessor_last
    | enum_name_list_item_last

enum_name_list_trailing_comma ::=
    enum_name_list ','

enum_name_list_preprocessor_last ::=
    enum_name_list preprocessor_directive
    | enum_name_list_trailing_comma preprocessor_directive
    | preprocessor_directive

enum_name_list_item_last ::=
    enum_name_list_trailing_comma enum_name
    | enum_name_list_preprocessor_last enum_name
    | enum_name

pos_neg_number ::=
    number
    | '-' number

enum_name ::=
    GenericIdentifier
    | GenericIdentifier '[' pos_neg_number ']'
    | GenericIdentifier '[' pos_neg_number ':' pos_neg_number ']'
    | GenericIdentifier '=' expression
    | GenericIdentifier '[' pos_neg_number ']' '=' expression
    | GenericIdentifier '[' pos_neg_number ':' pos_neg_number ']' '=' expression

struct_data_type ::=
    TK_struct packed_signing_opt '{' struct_union_member_list '}'
    | TK_union TK_tagged_opt packed_signing_opt '{' struct_union_member_list '}'

packed_signing_opt ::=
    TK_packed signed_unsigned_opt
    | /* empty */

struct_union_member_list ::=
    struct_union_member_list struct_union_member
    | struct_union_member

struct_union_member ::=
    random_qualifier_opt data_type_or_implicit_followed_by_id_and_dimensions_opt trailing_assign_opt ';'
    | random_qualifier_opt data_type_or_implicit_followed_by_id_and_dimensions_opt trailing_assign_opt ',' list_of_variable_decl_assignments ';'
    | preprocessor_directive

case_item ::=
    expression_list_proper ':' statement_or_null
    | TK_default ':' statement_or_null
    | TK_default statement_or_null
    | preprocessor_directive

case_inside_item ::=
    open_range_list ':' statement_or_null
    | TK_default ':' statement_or_null
    | TK_default statement_or_null
    | preprocessor_directive

case_pattern_item ::=
    pattern TK_TAND expression ':' statement_or_null
    | pattern ':' statement_or_null
    | TK_default ':' statement_or_null
    | TK_default statement_or_null
    | preprocessor_directive

case_items ::=
    case_items case_item
    | case_item

case_inside_items ::=
    case_inside_items case_inside_item
    | case_inside_item

case_pattern_items ::=
    case_pattern_items case_pattern_item
    | case_pattern_item

charge_strength ::=
    '(' TK_small ')'
    | '(' TK_medium ')'
    | '(' TK_large ')'

charge_strength_opt ::=
    charge_strength
    | /* empty */

defparam_assign ::=
    reference '=' expression

defparam_assign_list ::=
    defparam_assign
    | decl_dimensions defparam_assign
    | defparam_assign_list ',' defparam_assign

delay1 ::=
    '#' delay_value_simple
    | '#' '(' delay_value ')'

delay3 ::=
    '#' delay_value_simple
    | '#' '(' delay_value ')'
    | '#' '(' delay_value ',' delay_value ')'
    | '#' '(' delay_value ',' delay_value ',' delay_value ')'

delay3_opt ::=
    delay3
    | /* empty */

delay_value_list ::=
    delay_value
    | delay_value_list ',' delay_value

delay_value ::=
    expression
    | expression ':' expression ':' expression

delay_value_simple ::=
    TK_DecNumber
    | TK_RealTime
    | delay_identifier
    | TK_TimeLiteral
    | TK_1step

delay_identifier ::=
    delay_identifier '.' GenericIdentifier
    | delay_scope

delay_scope ::=
    delay_scope TK_SCOPE_RES GenericIdentifier
    | GenericIdentifier

decay_value_simple ::=
    TK_DecNumber
    | TK_RealTime
    | TK_TimeLiteral
    | TK_infinite

optional_semicolon ::=
    ';'
    | /* empty */

discipline_declaration ::=
    TK_discipline GenericIdentifier optional_semicolon discipline_items_opt TK_enddiscipline

discipline_items_opt ::=
    discipline_items
    | /* empty */

discipline_items ::=
    discipline_items discipline_item
    | discipline_item

discipline_item ::=
    TK_domain TK_discrete ';'
    | TK_domain TK_continuous ';'
    | TK_potential GenericIdentifier ';'
    | TK_flow GenericIdentifier ';'

nature_declaration ::=
    TK_nature GenericIdentifier optional_semicolon nature_items TK_endnature

nature_items ::=
    nature_items nature_item
    | nature_item

nature_item ::=
    TK_units '=' TK_StringLiteral ';'
    | TK_abstol '=' expression ';'
    | TK_access '=' GenericIdentifier ';'
    | TK_idt_nature '=' GenericIdentifier ';'
    | TK_ddt_nature '=' GenericIdentifier ';'

library_declaration ::=
    TK_library SymbolIdentifier file_path_spec_list incdir_spec_opt ';'

incdir_spec_opt ::=
    incdir_spec
    | /* empty */

incdir_spec ::=
    '-' TK_incdir file_path_spec_list

include_statement ::=
    TK_include file_path_spec ';'

file_path_spec_list ::=
    file_path_spec_list ',' file_path_spec
    | file_path_spec

file_path_spec ::=
    TK_FILEPATH

config_declaration ::=
    TK_config GenericIdentifier ';' design_statement list_of_config_rule_statements_opt TK_endconfig label_opt

design_statement ::=
    TK_design lib_cell_identifiers_opt ';'

lib_cell_identifiers_opt ::=
    lib_cell_identifiers
    | /* empty */

lib_cell_identifiers ::=
    lib_cell_identifiers lib_cell_id
    | lib_cell_id

list_of_config_rule_statements_opt ::=
    list_of_config_rule_statements
    | /* empty */

list_of_config_rule_statements ::=
    list_of_config_rule_statements config_rule_statement
    | config_rule_statement

config_rule_statement ::=
    TK_default liblist_clause ';'
    | inst_clause liblist_clause ';'
    | inst_clause use_clause ';'
    | cell_clause liblist_clause ';'
    | cell_clause use_clause ';'
    | preprocessor_balanced_config_rule_statements

inst_clause ::=
    TK_instance reference

cell_clause ::=
    TK_cell lib_cell_id

liblist_clause ::=
    TK_liblist list_of_libraries_opt

use_clause ::=
    TK_use lib_cell_id opt_config
    | TK_use named_parameter_assignment_list opt_config

preprocessor_balanced_config_rule_statements ::=
    preprocessor_if_header list_of_config_rule_statements_opt preprocessor_elsif_config_rule_statements_opt preprocessor_else_config_rule_statement_opt PP_endif

preprocessor_elsif_config_rule_statements_opt ::=
    preprocessor_elsif_config_rule_statements
    | /* empty */

preprocessor_elsif_config_rule_statements ::=
    preprocessor_elsif_config_rule_statements preprocessor_elsif_config_rule_statement
    | preprocessor_elsif_config_rule_statement

preprocessor_elsif_config_rule_statement ::=
    preprocessor_elsif_header list_of_config_rule_statements_opt

preprocessor_else_config_rule_statement_opt ::=
    preprocessor_else_config_rule_statement
    | /* empty */

preprocessor_else_config_rule_statement ::=
    PP_else list_of_config_rule_statements_opt

named_parameter_assignment_list ::=
    named_parameter_assignment_list ',' named_parameter_assignment
    | named_parameter_assignment

named_parameter_assignment ::=
    '.' member_name '(' parameter_expr ')'
    | '.' member_name '(' ')'

opt_config ::=
    ':' TK_config
    | /* empty */

lib_cell_id ::=
    GenericIdentifier
    | GenericIdentifier '.' GenericIdentifier

list_of_libraries_opt ::=
    list_of_libraries
    | /* empty */

list_of_libraries ::=
    list_of_libraries GenericIdentifier
    | GenericIdentifier

drive_strength ::=
    '(' dr_strength0 ',' dr_strength1 ')'
    | '(' dr_strength1 ',' dr_strength0 ')'
    | '(' dr_strength0 ',' TK_highz1 ')'
    | '(' dr_strength1 ',' TK_highz0 ')'
    | '(' TK_highz1 ',' dr_strength0 ')'
    | '(' TK_highz0 ',' dr_strength1 ')'

drive_strength_opt ::=
    drive_strength
    | /* empty */

dr_strength0 ::=
    TK_supply0
    | TK_strong0
    | TK_pull0
    | TK_weak0

dr_strength1 ::=
    TK_supply1
    | TK_strong1
    | TK_pull1
    | TK_weak1

pull01 ::=
    TK_pull0
    | TK_pull1

event_control ::=
    '@' hierarchy_event_identifier
    | '@' '(' event_expression_list ')'
    | '@' '(' '*' ')'
    | '@' '*'

event_control_opt ::=
    event_control
    | /* empty */

event_expression_list ::=
    event_expression
    | event_expression_list TK_or event_expression
    | event_expression_list ',' event_expression

event_expression ::=
    edge_operator expression
    | expression
    | edge_operator expression TK_iff expression
    | expression TK_iff expression

branch_probe_expression ::=
    GenericIdentifier '(' GenericIdentifier ',' GenericIdentifier ')'
    | GenericIdentifier '(' GenericIdentifier ')'

pattern_opt ::=
    pattern
    | /* empty */

pattern ::=
    '.' member_name
    | TK_DOTSTAR
    | expr_primary_no_groups
    | TK_tagged GenericIdentifier pattern_opt
    | TK_LP pattern_list '}'
    | TK_LP member_pattern_list '}'

pattern_list ::=
    pattern_list ',' pattern
    | pattern

member_pattern ::=
    GenericIdentifier ':' pattern

member_pattern_list ::=
    member_pattern_list ',' member_pattern
    | member_pattern

expression ::=
    equiv_impl_expr

equiv_impl_expr ::=
    cond_expr
    | cond_expr TK_LOGICAL_IMPLIES equiv_impl_expr
    | cond_expr TK_LOGEQUIV equiv_impl_expr

cond_expr ::=
    logor_expr
    | logor_expr '?' expression ':' cond_expr

inc_or_dec_or_primary_expr ::=
    postfix_expression
    | inc_or_dec_expression

unary_expr ::=
    unary_prefix_expr

unary_prefix_expr ::=
    inc_or_dec_or_primary_expr
    | unary_op unary_prefix_expr

unary_op ::=
    '+'
    | '-'
    | '~'
    | '&'
    | '!'
    | '|'
    | '^'
    | TK_NAND
    | TK_NOR
    | TK_NXOR

pow_expr ::=
    unary_expr
    | pow_expr TK_POW unary_expr

mul_expr ::=
    pow_expr
    | mul_expr '*' pow_expr
    | mul_expr '/' pow_expr
    | mul_expr '%' pow_expr

add_expr ::=
    mul_expr
    | add_expr '+' mul_expr
    | add_expr '-' mul_expr

shift_expr ::=
    add_expr
    | shift_expr TK_LS add_expr
    | shift_expr TK_RS add_expr
    | shift_expr TK_RSS add_expr

comp_expr ::=
    shift_expr
    | comp_expr '<' shift_expr
    | comp_expr '>' shift_expr
    | comp_expr TK_LE shift_expr
    | comp_expr TK_GE shift_expr
    | comp_expr TK_inside '{' open_range_list '}'
    | comp_expr TK_inside reference

logeq_expr ::=
    comp_expr
    | logeq_expr TK_EQ comp_expr
    | logeq_expr TK_NE comp_expr
    | logeq_expr TK_WILDCARD_EQ comp_expr
    | logeq_expr TK_WILDCARD_NE comp_expr

caseeq_expr ::=
    logeq_expr
    | caseeq_expr TK_CEQ logeq_expr
    | caseeq_expr TK_CNE logeq_expr

bitand_expr ::=
    caseeq_expr
    | bitand_expr '&' caseeq_expr
    | bitand_expr TK_NAND caseeq_expr

xor_expr ::=
    bitand_expr
    | xor_expr '^' bitand_expr
    | xor_expr TK_NXOR bitand_expr

bitor_expr ::=
    xor_expr
    | bitor_expr '|' xor_expr
    | bitor_expr TK_NOR xor_expr

with_exprs_suffix ::=
    with_exprs_suffix with_covergroup_expression_in_parens
    | bitor_expr

matches_expr ::=
    with_exprs_suffix
    | matches_expr TK_matches with_exprs_suffix

logand_expr ::=
    matches_expr
    | logand_expr TK_LAND bitor_expr

logor_expr ::=
    logand_expr
    | logor_expr TK_LOR logand_expr

expr_mintypmax ::=
    expr_mintypmax_trans_set

expr_mintypmax_trans_set ::=
    expr_mintypmax_trans_set TK_EG expr_mintypmax_generalized
    | expr_mintypmax_generalized

expr_mintypmax_generalized ::=
    expr_mintypmax_generalized ':' property_expr_or_assignment_list
    | property_expr_or_assignment_list

property_expr_or_assignment_list ::=
    property_expr_or_assignment_list ',' property_expr_or_assignment
    | property_expr_or_assignment

property_expr_or_assignment ::=
    property_expr
    | '[' expression ':' expression ']'
    | assignment_statement_no_expr

argument_list_opt ::=
    any_argument_list
    | /* empty */

any_argument_list ::=
    any_argument_list_trailing_comma
    | any_argument_list_preprocessor_last
    | any_argument_list_item_last

any_argument_list_trailing_comma ::=
    any_argument_list ','
    | ','

any_argument_list_item_last ::=
    any_argument
    | any_argument_list_trailing_comma any_argument
    | any_argument_list_preprocessor_last any_argument

any_argument_list_preprocessor_last ::=
    preprocessor_directive
    | any_argument_list preprocessor_directive

any_argument ::=
    expression
    | data_type_primitive
    | event_control
    | parameter_value_byname

expression_or_null_list_opt ::=
    expression_or_null_list_opt ',' expression_opt
    | expression_opt

expression_opt ::=
    expression
    | /* empty */

expression_list_proper ::=
    expression_list_proper ',' expression
    | expression

scope_prefix ::=
    GenericIdentifier TK_SCOPE_RES
    | TK_Sunit TK_SCOPE_RES

postfix_expression ::=
    reference_or_call
    | expr_primary

reference_or_call ::=
    local_root
    | local_root '(' argument_list_opt ')'
    | reference_or_call hierarchy_or_call_extension
    | reference_or_call select_variable_dimension

reference ::=
    local_root
    | reference hierarchy_extension
    | reference select_variable_dimension

expr_primary ::=
    expr_primary_no_groups
    | expr_primary_parens
    | expr_primary_braces
    | assignment_pattern

expr_primary_parens ::=
    '(' expr_mintypmax ')'

expr_primary_braces ::=
    '{' '}'
    | '{' value_range '{' expression_list_proper '}' '}'
    | range_list_in_braces
    | streaming_concatenation

range_list_in_braces ::=
    '{' open_range_list '}'

type_or_id_root ::=
    class_id
    | implicit_class_handle

local_root ::=
    TK_local_SCOPE type_or_id_root
    | TK_Sroot '.' type_or_id_root
    | type_or_id_root
    | MacroCall

string_literal ::=
    TK_StringLiteral
    | TK_EvalStringLiteral

expr_primary_no_groups ::=
    number
    | TK_RealTime
    | TK_TimeLiteral
    | string_literal
    | cast
    | randomize_call
    | select_condition
    | '$'
    | TK_null
    | system_tf_call
    | type_reference
    | MacroGenericItem

cast ::=
    casting_type "'" '(' expression ')'

casting_type ::=
    TK_DecNumber
    | expr_primary_parens
    | system_tf_call
    | data_type_base
    | signing
    | TK_const

randomize_call ::=
    TK_randomize identifier_list_in_parens_opt with_constraint_block_opt

identifier_list_in_parens_opt ::=
    '(' identifier_list ')'
    | '(' TK_null ')'
    | '(' ')'
    | /* empty */

identifier_list ::=
    identifier_list ',' reference
    | reference

with_constraint_block_opt ::=
    with_constraint_block
    | /* empty */

with_constraint_block ::=
    TK_with identifier_list_in_parens_opt constraint_block

unary_builtin_function ::=
    TK_acos
    | TK_acosh
    | TK_asin
    | TK_asinh
    | TK_atan
    | TK_atanh
    | TK_ceil
    | TK_cos
    | TK_cosh
    | TK_exp
    | TK_floor
    | TK_ln
    | TK_log
    | TK_sin
    | TK_sinh
    | TK_sqrt
    | TK_tan
    | TK_tanh
    | TK_abs

binary_builtin_function ::=
    TK_atan2
    | TK_hypot
    | TK_pow

function_item_list ::=
    function_item
    | function_item_list function_item

function_item ::=
    tf_port_declaration
    | block_item_decl

primitive_gate_instance ::=
    GenericIdentifier decl_dimensions_opt '(' any_port_list_opt ')'
    | '(' any_port_list_opt ')'
    | GenericIdentifier decl_dimensions

primitive_gate_instance_list ::=
    primitive_gate_instance_list ',' primitive_gate_instance
    | primitive_gate_instance

gate_instance_or_register_variable ::=
    GenericIdentifier decl_dimensions_opt trailing_decl_assignment_opt
    | GenericIdentifier decl_dimensions_opt '(' any_port_list_opt ')'
    | MacroCall

gate_instance_or_register_variable_list ::=
    gate_instance_or_register_variable_list ',' gate_instance_or_register_variable
    | gate_instance_or_register_variable

gatetype ::=
    TK_and
    | TK_nand
    | TK_or
    | TK_nor
    | TK_xor
    | TK_xnor
    | TK_buf
    | TK_bufif0
    | TK_bufif1
    | TK_not
    | TK_notif0
    | TK_notif1

switchtype ::=
    TK_nmos
    | TK_rnmos
    | TK_pmos
    | TK_rpmos
    | TK_cmos
    | TK_rcmos
    | TK_tran
    | TK_rtran
    | TK_tranif0
    | TK_tranif1
    | TK_rtranif0
    | TK_rtranif1

hierarchy_extension ::=
    '.' unqualified_id
    | '.' MacroCall

hierarchy_or_call_extension ::=
    '.' unqualified_id
    | '.' unqualified_id '(' argument_list_opt ')'
    | '.' MacroCall
    | '.' TK_new
    | '.' TK_new '(' argument_list_opt ')'
    | '.' TK_randomize '(' argument_list_opt ')' with_constraint_block_opt
    | '.' TK_randomize with_constraint_block_opt
    | '.' builtin_array_method '(' argument_list_opt ')' array_method_with_predicate_opt
    | '.' builtin_array_method array_method_with_predicate_opt

builtin_array_method ::=
    array_locator_method
    | array_ordering_method
    | array_reduction_method

array_locator_method ::=
    TK_find
    | TK_find_index
    | TK_find_first
    | TK_find_first_index
    | TK_find_last
    | TK_find_last_index
    | TK_unique
    | TK_unique_index
    | TK_min
    | TK_max

array_ordering_method ::=
    TK_sort
    | TK_rsort
    | TK_reverse
    | TK_shuffle

array_reduction_method ::=
    TK_sum
    | TK_product
    | TK_and
    | TK_or
    | TK_xor

array_method_with_predicate_opt ::=
    TK_with '(' expression ')'
    | /* empty */

hierarchy_event_identifier ::=
    hierarchy_event_identifier '.' hierarchy_segment
    | hierarchy_segment

hierarchy_segment ::=
    GenericIdentifier select_dimensions_opt

list_of_identifiers ::=
    GenericIdentifier
    | list_of_identifiers ',' GenericIdentifier

list_of_identifiers_unpacked_dimensions ::=
    list_of_identifiers_unpacked_dimensions ',' identifier_optional_unpacked_dimensions
    | identifier_optional_unpacked_dimensions

identifier_optional_unpacked_dimensions ::=
    GenericIdentifier decl_dimensions_opt

list_of_module_item_identifiers ::=
    list_of_module_item_identifiers ',' identifier_optional_unpacked_dimensions
    | unqualified_id decl_dimensions_opt

list_of_port_identifiers ::=
    GenericIdentifier
    | GenericIdentifier '=' expression
    | list_of_port_identifiers ',' GenericIdentifier
    | list_of_port_identifiers ',' GenericIdentifier '=' expression

identifier_opt ::=
    GenericIdentifier
    | /* empty */

preprocessor_list_of_ports_or_port_declarations_opt ::=
    list_of_ports_or_port_declarations_opt
    | list_of_ports_or_port_declarations_trailing_comma

list_of_ports_or_port_declarations_opt ::=
    list_of_ports_or_port_declarations
    | /* empty */

list_of_ports_or_port_declarations ::=
    list_of_ports_or_port_declarations_preprocessor_last
    | list_of_ports_or_port_declarations_item_last

list_of_ports_or_port_declarations_preprocessor_last ::=
    list_of_ports_or_port_declarations preprocessor_balanced_port_declarations
    | list_of_ports_or_port_declarations_trailing_comma preprocessor_balanced_port_declarations
    | preprocessor_balanced_port_declarations

list_of_ports_or_port_declarations_item_last ::=
    list_of_ports_or_port_declarations_preprocessor_last port_or_port_declaration
    | list_of_ports_or_port_declarations_trailing_comma port_or_port_declaration
    | port_or_port_declaration

list_of_ports_or_port_declarations_trailing_comma ::=
    list_of_ports_or_port_declarations ','

port_or_port_declaration ::=
    port
    | port_declaration

preprocessor_balanced_port_declarations ::=
    preprocessor_if_header preprocessor_list_of_ports_or_port_declarations_opt preprocessor_elsif_port_declarations_opt preprocessor_else_port_declarations_opt PP_endif
    | MacroGenericItem
    | preprocessor_action

preprocessor_elsif_port_declarations_opt ::=
    preprocessor_elsif_port_declarations
    | /* empty */

preprocessor_elsif_port_declarations ::=
    preprocessor_elsif_port_declarations preprocessor_elsif_port_declaration
    | preprocessor_elsif_port_declaration

preprocessor_elsif_port_declaration ::=
    preprocessor_elsif_header preprocessor_list_of_ports_or_port_declarations_opt

preprocessor_else_port_declarations_opt ::=
    preprocessor_else_port_declarations
    | /* empty */

preprocessor_else_port_declarations ::=
    PP_else preprocessor_list_of_ports_or_port_declarations_opt

dir ::=
    TK_input
    | TK_output
    | TK_inout

port_declaration ::=
    port_declaration_noattr

port_declaration_noattr ::=
    port_direction var_or_net_type_opt data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_assign_opt
    | net_type data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_assign_opt
    | port_direction TK_wreal GenericIdentifier trailing_assign_opt
    | data_type_primitive GenericIdentifier decl_dimensions_opt trailing_assign_opt
    | type_identifier_followed_by_id decl_dimensions_opt trailing_assign_opt

var_or_net_type_opt ::=
    net_type
    | TK_var
    | /* empty */

signed_unsigned_opt ::=
    signing
    | /* empty */

lpvalue ::=
    reference_or_call
    | range_list_in_braces
    | assignment_pattern
    | streaming_concatenation

cont_assign ::=
    lpvalue '=' expression

cont_assign_list ::=
    cont_assign_list ',' cont_assign
    | cont_assign

symbol_or_label ::=
    GenericIdentifier
    | MacroIdItem

module_or_interface_declaration ::=
    module_start lifetime_opt symbol_or_label module_package_import_list_opt module_parameter_port_list_opt module_port_list_opt module_attribute_foreign_opt ';' module_item_list_opt module_end label_opt

module_start ::=
    TK_module
    | TK_macromodule
    | TK_program
    | TK_interface

module_end ::=
    TK_endmodule
    | TK_endprogram
    | TK_endinterface

label_opt ::=
    ':' symbol_or_label
    | /* empty */

module_attribute_foreign ::=
    TK_PSTAR GenericIdentifier TK_integer GenericIdentifier '=' TK_StringLiteral ';' TK_STARP

module_attribute_foreign_opt ::=
    module_attribute_foreign
    | /* empty */

module_port_list_opt ::=
    '(' list_of_ports_or_port_declarations_opt ')'
    | /* empty */

module_parameter_port_list_opt ::=
    '#' '(' module_parameter_port_list ')'
    | '#' '(' ')'
    | /* empty */

parameter_opt ::=
    TK_parameter
    | TK_localparam
    | /* empty */

module_parameter_port ::=
    parameter_opt param_type_followed_by_id_and_dimensions_opt trailing_assign_opt
    | parameter_opt TK_type type_assignment

type_assignment_list ::=
    type_assignment_list ',' type_assignment
    | type_assignment

type_assignment ::=
    GenericIdentifier '=' parameter_expr
    | GenericIdentifier

module_parameter_port_list ::=
    module_parameter_port_list_item_last
    | module_parameter_port_list_preprocessor_last

module_parameter_port_list_trailing_comma ::=
    module_parameter_port_list ','

module_parameter_port_list_preprocessor_last ::=
    module_parameter_port_list preprocessor_directive
    | module_parameter_port_list_trailing_comma preprocessor_directive
    | preprocessor_directive

module_parameter_port_list_item_last ::=
    module_parameter_port_list_trailing_comma module_parameter_port
    | module_parameter_port_list_preprocessor_last module_parameter_port
    | module_parameter_port

net_declaration ::=
    net_type net_variable_or_decl_assigns ';'
    | net_type data_type_or_implicit net_variable_or_decl_assigns ';'
    | TK_trireg charge_strength_opt decl_dimensions_opt delay3_opt list_of_identifiers ';'

module_port_declaration ::=
    TK_wreal delay3_opt net_variable_or_decl_assigns ';'
    | port_direction TK_wreal list_of_identifiers_unpacked_dimensions ';'
    | port_direction signed_unsigned_opt qualified_id decl_dimensions_opt list_of_identifiers_unpacked_dimensions ';'
    | port_direction signed_unsigned_opt unqualified_id decl_dimensions_opt list_of_identifiers_unpacked_dimensions ';'
    | port_direction signed_unsigned_opt decl_dimensions delay3_opt list_of_identifiers_unpacked_dimensions ';'
    | port_direction signed_unsigned_opt delay3 list_of_identifiers_unpacked_dimensions ';'
    | port_direction signed_unsigned_opt list_of_module_item_identifiers ';'
    | port_direction port_net_type signed_unsigned_opt decl_dimensions_opt list_of_identifiers_unpacked_dimensions ';'
    | dir var_type signed_unsigned_opt decl_dimensions_opt list_of_port_identifiers ';'

parameter_override ::=
    TK_defparam defparam_assign_list ';'

gate_instantiation ::=
    gatetype primitive_gate_instance_list ';'
    | gatetype delay3 primitive_gate_instance_list ';'
    | gatetype drive_strength primitive_gate_instance_list ';'
    | gatetype drive_strength delay3 primitive_gate_instance_list ';'
    | switchtype primitive_gate_instance_list ';'
    | switchtype delay3 primitive_gate_instance_list ';'
    | TK_pullup primitive_gate_instance_list ';'
    | TK_pulldown primitive_gate_instance_list ';'
    | TK_pullup '(' dr_strength1 ')' primitive_gate_instance_list ';'
    | TK_pullup '(' dr_strength1 ',' dr_strength0 ')' primitive_gate_instance_list ';'
    | TK_pullup '(' dr_strength0 ',' dr_strength1 ')' primitive_gate_instance_list ';'
    | TK_pulldown '(' dr_strength0 ')' primitive_gate_instance_list ';'
    | TK_pulldown '(' dr_strength1 ',' dr_strength0 ')' primitive_gate_instance_list ';'
    | TK_pulldown '(' dr_strength0 ',' dr_strength1 ')' primitive_gate_instance_list ';'

specify_block ::=
    TK_specify specify_item_list_opt TK_endspecify

specparam_declaration ::=
    TK_specparam specparam_decl ';'

generate_region ::=
    TK_generate generate_item_list_opt TK_endgenerate

continuous_assign ::=
    TK_assign drive_strength_opt delay3_opt cont_assign_list ';'
    | TK_assign drive_strength_opt delay3_opt macro_call_or_item

net_alias_assign_lvalue_list ::=
    net_alias_assign_lvalue_list '=' lpvalue
    | lpvalue '=' lpvalue

net_alias ::=
    TK_alias net_alias_assign_lvalue_list ';'

loop_generate_construct ::=
    TK_for '(' genvar_opt GenericIdentifier '=' expression ';' expression_opt ';' for_step_opt ')' generate_item

conditional_generate_construct ::=
    generate_if generate_item TK_else generate_item
    | generate_if generate_item
    | TK_case '(' expression ')' generate_case_items TK_endcase

always_construct ::=
    always_any statement

initial_construct ::=
    TK_initial statement

final_construct ::=
    TK_final statement

analog_construct ::=
    TK_analog analog_statement

module_common_item ::=
    module_or_generate_item_declaration
    | always_construct
    | initial_construct
    | final_construct
    | analog_construct
    | assertion_item
    | bind_directive
    | continuous_assign
    | net_alias
    | loop_generate_construct
    | conditional_generate_construct
    | system_tf_call ';'

genvar_declaration ::=
    TK_genvar list_of_identifiers ';'

module_or_generate_item_declaration ::=
    package_or_generate_item_declaration
    | clocking_declaration
    | TK_default TK_clocking GenericIdentifier ';'
    | TK_default TK_disable TK_iff expression_or_dist ';'
    | genvar_declaration

package_or_generate_item_declaration ::=
    class_declaration
    | interface_class_declaration
    | net_declaration
    | task_declaration
    | function_declaration
    | covergroup_declaration
    | assertion_item_declaration
    | modport_declaration
    | specparam_declaration
    | dpi_import_export
    | ';'

module_or_generate_item ::=
    parameter_override
    | gate_instantiation
    | block_item_decl
    | module_common_item

module_item ::=
    module_port_declaration
    | non_port_module_item
    | module_block
    | macro_call_or_item
    | preprocessor_balanced_module_items
    | preprocessor_action
    | module_item_directive
    | error ';'

module_block ::=
    begin module_item_list_opt end

preprocessor_balanced_module_items ::=
    preprocessor_if_header module_item_list_opt preprocessor_elsif_module_items_opt preprocessor_else_module_item_opt PP_endif

preprocessor_elsif_module_items_opt ::=
    preprocessor_elsif_module_items
    | /* empty */

preprocessor_elsif_module_items ::=
    preprocessor_elsif_module_items preprocessor_elsif_module_item
    | preprocessor_elsif_module_item

preprocessor_elsif_module_item ::=
    preprocessor_elsif_header module_item_list_opt

preprocessor_else_module_item_opt ::=
    preprocessor_else_module_item
    | /* empty */

preprocessor_else_module_item ::=
    PP_else module_item_list_opt

non_port_module_item ::=
    generate_region
    | module_or_generate_item
    | specify_block
    | timeunits_declaration
    | module_or_interface_declaration
    | TKK_attribute '(' GenericIdentifier ',' TK_StringLiteral ',' TK_StringLiteral ')' ';'

always_any ::=
    TK_always
    | TK_always_ff
    | TK_always_comb
    | TK_always_latch

generate_if ::=
    TK_if expression_in_parens

generate_case_items ::=
    generate_case_items generate_case_item
    | generate_case_item

generate_case_item ::=
    expression_list_proper ':' generate_item
    | TK_default ':' generate_item

generate_item ::=
    module_or_generate_item
    | generate_block
    | macro_call_or_item
    | preprocessor_balanced_generate_items
    | preprocessor_action
    | error ';'

preprocessor_balanced_generate_items ::=
    preprocessor_if_header generate_item_list_opt preprocessor_elsif_generate_items_opt preprocessor_else_generate_item_opt PP_endif

preprocessor_elsif_generate_items_opt ::=
    preprocessor_elsif_generate_items
    | /* empty */

preprocessor_elsif_generate_items ::=
    preprocessor_elsif_generate_items preprocessor_elsif_generate_item
    | preprocessor_elsif_generate_item

preprocessor_elsif_generate_item ::=
    preprocessor_elsif_header generate_item_list_opt

preprocessor_else_generate_item_opt ::=
    preprocessor_else_generate_item
    | /* empty */

preprocessor_else_generate_item ::=
    PP_else generate_item_list_opt

begin ::=
    TK_begin label_opt

end ::=
    TK_end label_opt

generate_block ::=
    begin generate_item_list_opt end
    | unqualified_id ':' TK_begin generate_item_list_opt end

generate_item_list ::=
    generate_item_list generate_item
    | generate_item

generate_item_list_opt ::=
    generate_item_list
    | /* empty */

module_item_list ::=
    module_item_list module_item
    | module_item

module_item_list_opt ::=
    module_item_list
    | /* empty */

genvar_opt ::=
    TK_genvar
    | /* empty */

net_decl_assign ::=
    GenericIdentifier '=' expression

net_variable_or_decl_assign ::=
    net_variable
    | net_decl_assign

net_variable_or_decl_assigns ::=
    net_variable_or_decl_assigns ',' net_variable_or_decl_assign
    | net_variable_or_decl_assign

bit_logic ::=
    TK_logic
    | TK_bit

bit_logic_opt ::=
    bit_logic
    | /* empty */

port_net_type ::=
    net_type
    | TK_logic

net_type ::=
    TK_wire
    | TK_tri
    | TK_tri1
    | TK_supply0
    | TK_wand
    | TK_triand
    | TK_tri0
    | TK_supply1
    | TK_wor
    | TK_trior
    | TK_wone
    | TK_uwire

var_type ::=
    TK_reg

param_type_followed_by_id_and_dimensions_opt ::=
    bit_logic_opt signed_unsigned_opt qualified_id decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | bit_logic_opt signed_unsigned_opt unqualified_id decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | bit_logic_opt signed_unsigned_opt unqualified_id decl_dimensions_opt
    | bit_logic_opt signed_unsigned_opt decl_dimensions GenericIdentifier decl_dimensions_opt
    | integer_atom_type signed_unsigned_opt decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | non_integer_type decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | TK_reg decl_dimensions_opt GenericIdentifier decl_dimensions_opt
    | TK_string decl_dimensions_opt GenericIdentifier decl_dimensions_opt

parameter_assign_list ::=
    parameter_assign
    | parameter_assign_list ',' parameter_assign

localparam_assign_list ::=
    localparam_assign
    | localparam_assign_list ',' localparam_assign

parameter_assign ::=
    GenericIdentifier '=' expression parameter_value_ranges_opt

localparam_assign ::=
    GenericIdentifier '=' expression

trailing_assign ::=
    '=' parameter_expr parameter_value_ranges_opt

trailing_assign_opt ::=
    trailing_assign
    | /* empty */

parameter_value_ranges_opt ::=
    parameter_value_ranges
    | /* empty */

parameter_value_ranges ::=
    parameter_value_ranges parameter_value_range
    | parameter_value_range

parameter_value_range ::=
    from_exclude '[' value_range_expression ':' value_range_expression ']'
    | from_exclude '[' value_range_expression ':' value_range_expression ')'
    | from_exclude '(' value_range_expression ':' value_range_expression ']'
    | from_exclude '(' value_range_expression ':' value_range_expression ')'
    | TK_exclude expression

value_range_expression ::=
    expression
    | TK_inf
    | '+' TK_inf
    | '-' TK_inf

from_exclude ::=
    TK_from
    | TK_exclude

parameter_value_opt ::=
    parameters
    | /* empty */

parameters ::=
    '#' '(' parameter_expr_list ')'
    | '#' '(' parameter_value_byname_list ')'
    | '#' '(' ')'
    | '#' TK_DecNumber
    | '#' TK_RealTime

parameter_expr_list ::=
    parameter_expr_list ',' parameter_expr
    | parameter_expr

parameter_value_byname ::=
    '.' member_name '(' parameter_expr ')'
    | '.' member_name '(' ')'
    | '.' member_name

parameter_value_byname_list ::=
    parameter_value_byname_list_item_last
    | parameter_value_byname_list_preprocessor_last
    | parameter_value_byname_list_trailing_comma

parameter_value_byname_list_trailing_comma ::=
    parameter_value_byname_list ','
    | ','

parameter_value_byname_list_preprocessor_last ::=
    parameter_value_byname_list preprocessor_directive
    | preprocessor_directive

parameter_value_byname_list_item_last ::=
    parameter_value_byname
    | parameter_value_byname_list_trailing_comma parameter_value_byname
    | parameter_value_byname_list_preprocessor_last parameter_value_byname

parameter_expr ::=
    expression
    | data_type_primitive
    | interface_type

port ::=
    port_expression trailing_assign_opt
    | '.' member_name '(' port_expression_opt ')'

any_port_list_opt ::=
    any_port_list
    | /* empty */

any_port_list ::=
    any_port_list_item_last
    | any_port_list_preprocessor_last
    | any_port_list_trailing_comma

any_port_list_trailing_comma ::=
    any_port_list ','
    | ','

any_port_list_item_last ::=
    any_port_list_trailing_comma any_port
    | any_port_list_preprocessor_last any_port
    | any_port

any_port_list_preprocessor_last ::=
    any_port_list preprocessor_directive
    | preprocessor_directive

any_port ::=
    port_named
    | expression

port_named ::=
    '.' member_name '(' expression ')'
    | '.' member_name '(' ')'
    | '.' member_name
    | TK_DOTSTAR

member_name ::=
    GenericIdentifier
    | builtin_array_method

port_expression_opt ::=
    port_expression
    | /* empty */

port_expression ::=
    port_reference
    | '{' port_reference_list '}'

port_reference ::=
    unqualified_id decl_dimensions_opt

port_reference_list ::=
    port_reference
    | port_reference_list ',' port_reference

select_dimensions_opt ::=
    select_dimensions
    | /* empty */

select_dimensions ::=
    select_variable_dimension
    | select_dimensions select_variable_dimension

decl_dimensions_opt ::=
    decl_dimensions
    | /* empty */

decl_dimensions ::=
    decl_variable_dimension
    | decl_dimensions decl_variable_dimension

net_variable ::=
    GenericIdentifier decl_dimensions_opt

specify_item ::=
    TK_specparam specparam_decl ';'
    | specify_simple_path_decl ';'
    | specify_edge_path_decl ';'
    | TK_if '(' expression ')' specify_simple_path_decl ';'
    | TK_if '(' expression ')' specify_edge_path_decl ';'
    | TK_ifnone specify_simple_path_decl ';'
    | TK_ifnone specify_edge_path_decl ';'
    | TK_Sfullskew '(' spec_reference_event ',' spec_reference_event ',' delay_value ',' delay_value spec_notifier_opt ')' ';'
    | TK_Snochange '(' spec_reference_event ',' spec_reference_event ',' delay_value ',' delay_value spec_notifier_opt ')' ';'
    | TK_Srecrem '(' spec_reference_event ',' spec_reference_event ',' delay_value ',' delay_value spec_notifier_opt ')' ';'
    | TK_Ssetuphold '(' spec_reference_event ',' spec_reference_event ',' delay_value ',' delay_value spec_notifier_opt ')' ';'
    | TK_Speriod '(' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Swidth '(' spec_reference_event ',' delay_value ')' ';'
    | TK_Shold '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Srecovery '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Sremoval '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Ssetup '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Sskew '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Stimeskew '(' spec_reference_event ',' spec_reference_event ',' delay_value spec_notifier_opt ')' ';'
    | TK_Swidth '(' spec_reference_event ',' delay_value ',' expression spec_notifier_opt ')' ';'
    | TK_pulsestyle_onevent specify_path_identifiers ';'
    | TK_pulsestyle_ondetect specify_path_identifiers ';'
    | TK_showcancelled specify_path_identifiers ';'
    | TK_noshowcancelled specify_path_identifiers ';'
    | preprocessor_directive

specify_item_list ::=
    specify_item
    | specify_item_list specify_item

specify_item_list_opt ::=
    /* empty */
    | specify_item_list

specify_edge_path_decl ::=
    specify_edge_path '=' '(' delay_value_list ')'
    | specify_edge_path '=' delay_value_simple

edge_operator ::=
    TK_posedge
    | TK_negedge
    | TK_edge

specify_edge_path ::=
    '(' specify_path_identifiers spec_polarity TK_EG '(' specify_path_identifiers polarity_operator expression ')' ')'
    | '(' specify_path_identifiers spec_polarity TK_SG '(' specify_path_identifiers polarity_operator expression ')' ')'
    | '(' edge_operator specify_path_identifiers spec_polarity TK_EG '(' specify_path_identifiers polarity_operator expression ')' ')'
    | '(' edge_operator specify_path_identifiers spec_polarity TK_SG '(' specify_path_identifiers polarity_operator expression ')' ')'

polarity_operator ::=
    TK_PO_POS
    | TK_PO_NEG
    | ':'

specify_simple_path_decl ::=
    specify_simple_path '=' '(' delay_value_list ')'
    | specify_simple_path '=' delay_value_simple

specify_simple_path ::=
    '(' specify_path_identifiers spec_polarity TK_EG specify_path_identifiers ')'
    | '(' specify_path_identifiers spec_polarity TK_SG specify_path_identifiers ')'

specify_path_identifiers ::=
    GenericIdentifier
    | GenericIdentifier '[' expr_primary ']'
    | specify_path_identifiers ',' GenericIdentifier
    | specify_path_identifiers ',' GenericIdentifier '[' expr_primary ']'

specparam ::=
    GenericIdentifier '=' expression
    | GenericIdentifier '=' expression ':' expression ':' expression

specparam_list ::=
    specparam
    | specparam_list ',' specparam

specparam_decl ::=
    specparam_list
    | decl_dimensions specparam_list

spec_polarity ::=
    '+'
    | '-'
    | /* empty */

spec_reference_event ::=
    edge_operator specify_terminal_descriptor
    | edge_operator specify_terminal_descriptor TK_TAND expression
    | TK_edge '[' edge_descriptor_list ']' specify_terminal_descriptor
    | TK_edge '[' edge_descriptor_list ']' specify_terminal_descriptor TK_TAND expression
    | specify_terminal_descriptor TK_TAND expression
    | specify_terminal_descriptor

edge_descriptor_list ::=
    edge_descriptor_list ',' TK_edge_descriptor
    | TK_edge_descriptor

specify_terminal_descriptor ::=
    reference

spec_notifier_opt ::=
    spec_notifier
    | /* empty */

spec_notifier ::=
    ','
    | ',' reference
    | spec_notifier ','
    | spec_notifier ',' reference
    | GenericIdentifier

case_any ::=
    TK_case
    | TK_casex
    | TK_casez

blocking_assignment ::=
    lpvalue '=' delay_or_event_control expression ';'
    | lpvalue '=' dynamic_array_new ';'
    | lpvalue '=' class_new ';'

nonblocking_assignment ::=
    lpvalue TK_LE delay_or_event_control_opt expression ';'

clocking_drive_only ::=
    lpvalue TK_LE cycle_delay expression ';'

procedural_continuous_assignment ::=
    TK_assign lpvalue '=' expression ';'
    | TK_assign macro_call_or_item
    | TK_deassign lpvalue ';'
    | TK_force lpvalue '=' expression ';'
    | TK_release lpvalue ';'

case_statement ::=
    unique_priority_opt case_any '(' expression ')' case_items TK_endcase
    | unique_priority_opt case_any '(' expression ')' TK_matches case_pattern_items TK_endcase
    | unique_priority_opt case_any '(' expression ')' TK_inside case_inside_items TK_endcase
    | unique_priority_opt TK_randcase case_items TK_endcase

conditional_statement ::=
    unique_priority_opt TK_if expression_in_parens statement_or_null
    | unique_priority_opt TK_if expression_in_parens statement_or_null TK_else statement_or_null

event_trigger ::=
    TK_TRIGGER reference ';'
    | TK_NONBLOCKING_TRIGGER delay_or_event_control_opt reference ';'

repeat_control ::=
    TK_repeat '(' expression ')'

delay_or_event_control ::=
    delay1
    | event_control
    | repeat_control event_control

delay_or_event_control_opt ::=
    delay_or_event_control
    | /* empty */

par_block ::=
    TK_fork label_opt block_item_or_statement_or_null_list_opt join_keyword label_opt

procedural_timing_control_statement ::=
    delay1 statement_or_null
    | event_control statement_or_null
    | cycle_delay statement_or_null

seq_block ::=
    begin block_item_or_statement_or_null_list_opt end

wait_statement ::=
    TK_wait '(' expression ')' statement_or_null
    | TK_wait TK_fork ';'

statement_item ::=
    blocking_assignment
    | nonblocking_assignment
    | procedural_continuous_assignment
    | case_statement
    | conditional_statement
    | assignment_statement ';'
    | disable_statement
    | event_trigger
    | loop_statement
    | jump_statement
    | par_block
    | procedural_timing_control_statement
    | seq_block
    | wait_statement
    | procedural_assertion_statement
    | expect_property_statement
    | clocking_drive_only
    | randsequence_statement
    | subroutine_call ';'
    | randomize_call ';'
    | TK_void "'" '(' expression ')' ';'
    | error ';'
    | MacroGenericItem
    | preprocessor_balanced_statements
    | preprocessor_action

preprocessor_balanced_statements ::=
    preprocessor_if_header block_item_or_statement_or_null_list_opt preprocessor_elsif_statements_opt preprocessor_else_statement_opt PP_endif

preprocessor_elsif_statements_opt ::=
    preprocessor_elsif_statements
    | /* empty */

preprocessor_elsif_statements ::=
    preprocessor_elsif_statements preprocessor_elsif_statement
    | preprocessor_elsif_statement

preprocessor_elsif_statement ::=
    preprocessor_elsif_header block_item_or_statement_or_null_list_opt

preprocessor_else_statement_opt ::=
    preprocessor_else_statement
    | /* empty */

preprocessor_else_statement ::=
    PP_else block_item_or_statement_or_null_list_opt

disable_statement ::=
    TK_disable reference ';'
    | TK_disable TK_fork ';'

assign_modify_statement ::=
    lpvalue TK_PLUS_EQ expression
    | lpvalue TK_MINUS_EQ expression
    | lpvalue TK_MUL_EQ expression
    | lpvalue TK_DIV_EQ expression
    | lpvalue TK_MOD_EQ expression
    | lpvalue TK_AND_EQ expression
    | lpvalue TK_OR_EQ expression
    | lpvalue TK_XOR_EQ expression
    | lpvalue TK_LS_EQ expression
    | lpvalue TK_RS_EQ expression
    | lpvalue TK_RSS_EQ expression

unique_priority_opt ::=
    TK_unique
    | TK_unique0
    | TK_priority
    | /* empty */

statement_or_null_list_opt ::=
    statement_or_null_list
    | /* empty */

statement_or_null_list ::=
    statement_or_null_list statement_or_null
    | statement_or_null

analog_statement ::=
    branch_probe_expression TK_CONTRIBUTE expression ';'

task_item ::=
    block_item_decl
    | tf_port_declaration

tf_item_or_statement_or_null ::=
    task_item
    | statement_or_null

tf_item_or_statement_or_null_list ::=
    tf_item_or_statement_or_null
    | tf_item_or_statement_or_null_list tf_item_or_statement_or_null

tf_item_or_statement_or_null_list_opt ::=
    tf_item_or_statement_or_null_list
    | /* empty */

tf_port_list_paren_opt ::=
    '(' tf_port_list_opt ')'
    | /* empty */

tf_port_list_opt ::=
    tf_port_list
    | /* empty */

udp_body ::=
    TK_table udp_entry_list TK_endtable
    | TK_table TK_endtable

udp_entry_list ::=
    udp_comb_entry_list
    | udp_sequ_entry_list
    | udp_unknown_list

udp_unknown_list ::=
    udp_unknown_list preprocessor_directive
    | preprocessor_directive

udp_comb_entry ::=
    udp_input_list ':' udp_output_sym ';'

udp_comb_entry_list ::=
    udp_comb_entry
    | udp_comb_entry_list udp_comb_entry
    | udp_comb_entry_list preprocessor_directive
    | udp_unknown_list udp_comb_entry

udp_sequ_entry_list ::=
    udp_sequ_entry
    | udp_sequ_entry_list udp_sequ_entry
    | udp_sequ_entry_list preprocessor_directive
    | udp_unknown_list udp_sequ_entry

udp_sequ_entry ::=
    udp_input_list ':' udp_input_sym ':' udp_output_sym ';'

udp_initial ::=
    TK_initial GenericIdentifier '=' number ';'

udp_init_opt ::=
    udp_initial
    | /* empty */

udp_input_list ::=
    udp_input_sym
    | udp_input_list udp_input_sym

udp_input_sym ::=
    '0'
    | '1'
    | 'x'
    | '?'
    | 'b'
    | '*'
    | '%'
    | 'f'
    | 'F'
    | 'l'
    | 'h'
    | 'B'
    | 'r'
    | 'R'
    | 'M'
    | 'n'
    | 'N'
    | 'p'
    | 'P'
    | 'Q'
    | 'q'
    | '_'
    | '+'
    | TK_DecNumber

udp_output_sym ::=
    '0'
    | '1'
    | 'x'
    | '-'
    | TK_DecNumber

udp_port_decl ::=
    TK_input list_of_identifiers ';'
    | TK_output GenericIdentifier ';'
    | TK_reg GenericIdentifier ';'
    | TK_reg TK_output GenericIdentifier ';'

udp_port_decls ::=
    udp_port_decl
    | udp_port_decls udp_port_decl

udp_port_list ::=
    GenericIdentifier
    | udp_port_list ',' GenericIdentifier

udp_initial_expr_opt ::=
    '=' expression
    | /* empty */

udp_input_declaration_list ::=
    TK_input GenericIdentifier
    | udp_input_declaration_list ',' TK_input GenericIdentifier

udp_primitive ::=
    TK_primitive GenericIdentifier '(' udp_port_list ')' ';' udp_port_decls udp_init_opt udp_body TK_endprimitive label_opt
    | TK_primitive GenericIdentifier '(' TK_output TK_reg_opt GenericIdentifier udp_initial_expr_opt ',' udp_input_declaration_list ')' ';' udp_body TK_endprimitive label_opt

lifetime ::=
    TK_automatic
    | TK_static

lifetime_opt ::=
    lifetime
    | /* empty */

TK_reg_opt ::=
    TK_reg
    | /* empty */

TK_static_opt ::=
    TK_static
    | /* empty */

TK_tagged_opt ::=
    TK_tagged
    | /* empty */

TK_virtual_opt ::=
    TK_virtual
    | /* empty */

bind_directive ::=
    TK_bind reference ':' bind_target_instance_list bind_instantiation ';'
    | TK_bind reference bind_instantiation ';'

bind_target_instance_list ::=
    bind_target_instance_list ',' bind_target_instance
    | bind_target_instance

bind_target_instance ::=
    reference

bind_instantiation ::=
    class_id gate_instance_or_register_variable_list

clocking_declaration ::=
    TK_default TK_clocking identifier_opt event_control ';' clocking_item_list_opt TK_endclocking label_opt
    | TK_clocking identifier_opt event_control ';' clocking_item_list_opt TK_endclocking label_opt
    | TK_global TK_clocking identifier_opt event_control ';' TK_endclocking label_opt

clocking_item_list_opt ::=
    clocking_item_list
    | /* empty */

clocking_item_list ::=
    clocking_item_list clocking_item
    | clocking_item

clocking_item ::=
    TK_default default_skew ';'
    | clocking_direction list_of_clocking_decl_assign ';'
    | assertion_item_declaration
    | let_declaration

default_skew ::=
    TK_input clocking_skew
    | TK_input clocking_skew TK_output clocking_skew
    | TK_output clocking_skew

clocking_skew_opt ::=
    clocking_skew
    | /* empty */

clocking_skew ::=
    edge_operator delay3_opt
    | delay3

clocking_direction ::=
    TK_input clocking_skew_opt
    | TK_input clocking_skew_opt TK_output clocking_skew_opt
    | TK_output clocking_skew_opt
    | TK_inout

list_of_clocking_decl_assign ::=
    list_of_clocking_decl_assign ',' clocking_decl_assign
    | clocking_decl_assign

clocking_decl_assign ::=
    GenericIdentifier trailing_assign_opt

assertion_item_declaration ::=
    property_declaration
    | sequence_declaration

let_declaration ::=
    TK_let GenericIdentifier let_port_list_in_parens_opt '=' expression ';'

let_port_list_in_parens_opt ::=
    '(' let_port_list ')'
    | '(' ')'
    | /* empty */

let_port_list ::=
    let_port_list ',' let_port_item
    | let_port_item

let_port_item ::=
    let_formal_type_followed_by_id decl_dimensions_opt
    | let_formal_type_followed_by_id decl_dimensions_opt '=' expression

let_formal_type_followed_by_id ::=
    data_type_or_implicit_basic_followed_by_id
    | TK_untyped GenericIdentifier

sequence_declaration ::=
    TK_sequence GenericIdentifier sequence_port_list_in_parens_opt ';' assertion_variable_declaration_list SemicolonEndOfAssertionVariableDeclarations sequence_expr optional_semicolon TK_endsequence label_opt
    | TK_sequence GenericIdentifier sequence_port_list_in_parens_opt SemicolonEndOfAssertionVariableDeclarations sequence_expr optional_semicolon TK_endsequence label_opt

sequence_port_list_in_parens_opt ::=
    '(' sequence_port_list_opt ')'
    | /* empty */

sequence_port_list_opt ::=
    sequence_port_list
    | /* empty */

sequence_port_list ::=
    sequence_port_list ',' sequence_port_item
    | sequence_port_item

sequence_port_item ::=
    local_sequence_lvar_port_direction_opt sequence_port_type_followed_by_id decl_dimensions_opt trailing_assign_opt

local_sequence_lvar_port_direction_opt ::=
    TK_local dir
    | TK_local
    | /* empty */

sequence_port_type_followed_by_id ::=
    data_type_or_implicit_basic_followed_by_id
    | TK_sequence GenericIdentifier
    | TK_untyped GenericIdentifier

property_declaration ::=
    TK_property GenericIdentifier property_port_list_in_parens_opt ';' assertion_variable_declaration_list SemicolonEndOfAssertionVariableDeclarations property_spec optional_semicolon TK_endproperty label_opt
    | TK_property GenericIdentifier property_port_list_in_parens_opt SemicolonEndOfAssertionVariableDeclarations property_spec optional_semicolon TK_endproperty label_opt

property_port_list_in_parens_opt ::=
    '(' property_port_list ')'
    | /* empty */

property_port_list ::=
    property_port_list ',' property_port_item
    | property_port_item

property_port_item ::=
    property_port_modifiers_opt property_formal_type_followed_by_id decl_dimensions_opt property_actual_arg_opt

property_port_modifiers_opt ::=
    TK_local TK_input
    | TK_local
    | /* empty */

property_formal_type_followed_by_id ::=
    data_type_or_implicit_basic_followed_by_id
    | TK_sequence GenericIdentifier
    | TK_untyped GenericIdentifier
    | TK_property GenericIdentifier

property_actual_arg_opt ::=
    '=' property_actual_arg
    | /* empty */

assertion_variable_declaration_list ::=
    assertion_variable_declaration_list ';' assertion_variable_declaration
    | assertion_variable_declaration

assertion_variable_declaration ::=
    var_opt data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_assign_opt
    | var_opt data_type_or_implicit_basic_followed_by_id_and_dimensions_opt trailing_assign_opt ',' net_variable_or_decl_assigns

property_actual_arg ::=
    edge_operator expression
    | property_expr

property_expr ::=
    sequence_expr

sequence_expr ::=
    property_implication_expr

property_prefix_expr ::=
    TK_accept_on '(' expression_or_dist ')' property_prefix_expr
    | TK_reject_on '(' expression_or_dist ')' property_prefix_expr
    | TK_sync_accept_on '(' expression_or_dist ')' property_prefix_expr
    | TK_sync_reject_on '(' expression_or_dist ')' property_prefix_expr
    | TK_nexttime property_prefix_expr
    | TK_nexttime '[' expression ']' property_prefix_expr
    | TK_s_nexttime property_prefix_expr
    | TK_s_nexttime '[' expression ']' property_prefix_expr
    | TK_always property_prefix_expr
    | TK_always '[' cycle_range ']' property_prefix_expr
    | TK_s_always '[' cycle_range ']' property_prefix_expr
    | TK_s_eventually property_prefix_expr
    | TK_eventually '[' cycle_range ']' property_prefix_expr
    | TK_s_eventually '[' cycle_range ']' property_prefix_expr
    | property_if_else_expr

property_if_else_expr ::=
    TK_if '(' expression_or_dist ')' property_prefix_expr TK_else property_prefix_expr
    | TK_if '(' expression_or_dist ')' property_prefix_expr
    | simple_sequence_expr

simple_sequence_expr ::=
    TK_first_match '(' sequence_expr_match_item_list ')'
    | property_case_statement
    | TK_strong '(' sequence_expr ')'
    | TK_weak '(' sequence_expr ')'
    | sequence_or_expr

property_case_statement ::=
    TK_case '(' expression_or_dist ')' property_case_item_list optional_semicolon TK_endcase

property_case_item_list ::=
    property_case_item_list ';' property_case_item
    | property_case_item

property_case_item ::=
    expression_or_dist_list ':' property_expr
    | TK_default ':' property_expr
    | TK_default property_expr

expression_or_dist_list ::=
    expression_or_dist_list ',' expression_or_dist
    | expression_or_dist

property_implication_expr ::=
    property_implication_expr property_operator property_prefix_expr
    | property_prefix_expr

property_operator ::=
    implication_operator
    | until_operator
    | followed_by_operator

implication_operator ::=
    TK_PIPEARROW
    | TK_PIPEARROW2
    | TK_implies
    | TK_iff

until_operator ::=
    TK_until
    | TK_until_with
    | TK_s_until
    | TK_s_until_with

followed_by_operator ::=
    TK_POUNDEQPOUND
    | TK_POUNDMINUSPOUND

system_tf_call ::=
    SystemTFIdentifier '(' argument_list_opt ')'
    | SystemTFIdentifier

sequence_match_item_list ::=
    sequence_match_item_list ',' sequence_match_item
    | sequence_match_item

sequence_expr_match_item_list ::=
    property_expr ',' sequence_match_item_list
    | property_expr

sequence_match_item ::=
    assignment_statement
    | subroutine_call

subroutine_call ::=
    reference_or_call
    | system_tf_call

sequence_or_expr ::=
    sequence_or_expr TK_or sequence_and_expr
    | sequence_and_expr

sequence_and_expr ::=
    sequence_and_expr TK_and sequence_unary_expr
    | sequence_unary_expr

sequence_unary_expr ::=
    sequence_intersect_expr
    | TK_not sequence_intersect_expr

sequence_intersect_expr ::=
    sequence_within_expr
    | sequence_intersect_expr TK_intersect sequence_within_expr

sequence_within_expr ::=
    sequence_throughout_expr
    | sequence_within_expr TK_within sequence_throughout_expr

sequence_throughout_expr ::=
    sequence_delay_range_expr
    | sequence_throughout_expr TK_throughout sequence_delay_range_expr

sequence_delay_range_expr ::=
    sequence_delay_repetition_list
    | cycle_delay_range sequence_delay_repetition_list

sequence_delay_repetition_list ::=
    sequence_delay_repetition_list cycle_delay_range sequence_expr_primary
    | sequence_expr_primary

cycle_delay ::=
    TK_POUNDPOUND TK_DecNumber
    | TK_POUNDPOUND GenericIdentifier
    | TK_POUNDPOUND '(' expression ')'

cycle_delay_range ::=
    TK_POUNDPOUND '[' cycle_range ']'
    | TK_POUNDPOUND TK_LBSTARRB
    | TK_POUNDPOUND TK_LBPLUSRB
    | TK_POUNDPOUND '(' expression ')'
    | TK_POUNDPOUND GenericIdentifier
    | TK_POUNDPOUND TK_DecNumber

cycle_range_or_expr ::=
    cycle_range
    | expression

cycle_range ::=
    expression ':' expression

dist_opt ::=
    TK_dist '{' dist_list '}'
    | /* empty */

dist_list ::=
    dist_item
    | dist_list ',' dist_item

dist_item ::=
    value_range dist_weight
    | value_range

dist_weight ::=
    TK_COLON_EQ expression
    | TK_COLON_DIV expression

sequence_expr_primary ::=
    sequence_repetition_expr

sequence_repetition_expr ::=
    expression_or_dist boolean_abbrev_opt

expression_or_dist ::=
    expression dist_opt

boolean_abbrev_opt ::=
    boolean_abbrev
    | /* empty */

boolean_abbrev ::=
    consecutive_repetition
    | nonconsecutive_repetition
    | goto_repetition

consecutive_repetition ::=
    TK_LBSTAR cycle_range_or_expr ']'
    | TK_LBSTARRB
    | TK_LBPLUSRB

nonconsecutive_repetition ::=
    TK_LBEQ cycle_range_or_expr ']'

goto_repetition ::=
    TK_LBRARROW cycle_range_or_expr ']'

covergroup_declaration ::=
    TK_covergroup GenericIdentifier tf_port_list_paren_opt coverage_event_opt ';' coverage_spec_or_option_list_opt TK_endgroup label_opt

coverage_spec_or_option_list_opt ::=
    coverage_spec_or_option_list
    | /* empty */

coverage_spec_or_option_list ::=
    coverage_spec_or_option_list coverage_spec_or_option
    | coverage_spec_or_option

coverage_spec_or_option ::=
    coverage_spec
    | coverage_option ';'
    | preprocessor_directive
    | macro_call_or_item

coverage_option ::=
    TK_option '.' GenericIdentifier '=' expression
    | TK_type_option '.' GenericIdentifier '=' expression

coverage_spec ::=
    cover_point
    | cover_cross

coverage_event_opt ::=
    coverage_event
    | /* empty */

coverage_event ::=
    event_control
    | TK_with__covergroup TK_function TK_sample '(' tf_port_list_opt ')'
    | TK_ATAT '(' block_event_expression ')'

block_event_expression ::=
    block_event_or_expr

block_event_or_expr ::=
    block_event_or_expr TK_or block_event_expr_primary
    | block_event_expr_primary

block_event_expr_primary ::=
    TK_begin reference
    | TK_end reference

cover_cross ::=
    data_type_or_implicit_basic_followed_by_id ':' TK_cross cross_item_list iff_expr_opt cross_body
    | TK_cross cross_item_list iff_expr_opt cross_body

cross_body ::=
    '{' cross_body_item_list_opt '}'
    | ';'

cross_body_item_list_opt ::=
    cross_body_item_list
    | /* empty */

cross_body_item_list ::=
    cross_body_item_list cross_body_item
    | cross_body_item

cross_item_list ::=
    cross_item_list ',' cross_item
    | cross_item ',' cross_item

cross_body_item ::=
    function_declaration
    | bins_selection ';'
    | coverage_option ';'

cross_item ::=
    reference

cover_point ::=
    data_type_or_implicit_basic_followed_by_id ':' TK_coverpoint property_expr bins_or_options_list_opt
    | TK_coverpoint property_expr bins_or_options_list_opt

iff_expr_opt ::=
    TK_iff '(' expression ')'
    | /* empty */

bins_or_options_list_opt ::=
    '{' bins_or_options_list '}'
    | ';'
    | '{' error '}'

bins_or_options_list ::=
    bins_or_options_list bins_or_options
    | bins_or_options

bins_or_options ::=
    coverage_option ';'
    | coverage_bin ';'
    | preprocessor_balanced_bins_or_options_list
    | macro_call_or_item
    | error ';'

bins_or_options_list_opt_pp ::=
    bins_or_options_list
    | /* empty */

preprocessor_balanced_bins_or_options_list ::=
    preprocessor_if_header bins_or_options_list_opt_pp preprocessor_elsif_bins_or_options_list_opt preprocessor_else_bins_or_options_opt PP_endif

preprocessor_elsif_bins_or_options_list_opt ::=
    preprocessor_elsif_bins_or_options_list
    | /* empty */

preprocessor_elsif_bins_or_options_list ::=
    preprocessor_elsif_bins_or_options_list preprocessor_elsif_bins_or_options
    | preprocessor_elsif_bins_or_options

preprocessor_elsif_bins_or_options ::=
    preprocessor_elsif_header bins_or_options_list_opt_pp

preprocessor_else_bins_or_options_opt ::=
    preprocessor_else_bins_or_options
    | /* empty */

preprocessor_else_bins_or_options ::=
    PP_else bins_or_options_list_opt_pp

coverage_bin ::=
    wildcard_opt bins_keyword GenericIdentifier covergroup_expression_bracketed_opt '=' coverage_bin_rhs iff_expr_opt

coverage_bin_rhs ::=
    set_covergroup_expression_or_covergroup_range_list_or_trans_list
    | TK_default
    | TK_default TK_sequence

wildcard_opt ::=
    TK_wildcard
    | /* empty */

bins_keyword ::=
    TK_bins
    | TK_illegal_bins
    | TK_ignore_bins

covergroup_expression_bracketed_opt ::=
    '[' expression ']'
    | '[' ']'
    | /* empty */

set_covergroup_expression_or_covergroup_range_list_or_trans_list ::=
    expression_list_proper

bins_selection ::=
    bins_keyword GenericIdentifier '=' select_expression

select_expression ::=
    property_expr

select_condition ::=
    TK_binsof '(' bins_expression ')'

bins_expression ::=
    reference

with_covergroup_expression_in_parens ::=
    TK_with__covergroup '(' with_covergroup_expression ')'

with_covergroup_expression ::=
    expression

randsequence_statement ::=
    TK_randsequence '(' identifier_opt ')' production_list TK_endsequence

production_list ::=
    production_list production
    | production

production ::=
    data_type_or_void_with_id tf_port_list_paren_opt ':' rs_rule_list ';'

data_type_or_void_with_id ::=
    data_type_or_implicit_basic_followed_by_id_and_dimensions_opt

rs_rule_list ::=
    rs_rule_list '|' rs_rule
    | rs_rule

rs_rule ::=
    rs_production_list_or_rand_join
    | rs_production_list_or_rand_join TK_COLON_EQ weight_specification
    | rs_production_list_or_rand_join TK_COLON_EQ weight_specification rs_code_block

rs_production_list_or_rand_join ::=
    rs_production_list
    | TK_rand TK_join expression_in_parens_opt production_items_list

expression_in_parens ::=
    '(' expression ')'
    | '(' error ')'

expression_in_parens_opt ::=
    expression_in_parens
    | /* empty */

rs_production_list ::=
    rs_production_list rs_prod
    | rs_prod

weight_specification ::=
    number
    | GenericIdentifier
    | '(' expression ')'

rs_code_block ::=
    '{' block_item_or_statement_or_null_list_opt '}'

production_items_list ::=
    production_items_list production_item
    | production_item production_item

rs_prod ::=
    production_item
    | rs_code_block
    | rs_if_else
    | rs_repeat
    | rs_case

production_item ::=
    GenericIdentifier '(' any_port_list ')'
    | GenericIdentifier

rs_if_else ::=
    TK_if '(' expression ')' production_item TK_else production_item
    | TK_if '(' expression ')' production_item

rs_repeat ::=
    repeat_control production_item

rs_case ::=
    TK_case '(' expression ')' rs_case_item_list TK_endcase

rs_case_item_list ::=
    rs_case_item_list rs_case_item
    | rs_case_item

rs_case_item ::=
    case_item_expression_list ':' production_item ';'
    | TK_default ':' production_item ';'
    | TK_default production_item ';'

case_item_expression_list ::=
    case_item_expression_list ',' case_item_expression
    | case_item_expression

case_item_expression ::=
    expression

// Tokens from https://raw.githubusercontent.com/google/verible/master/verilog/parser/verilog.lex

  /* keywords */
TK_1step ::= "1step"
TK_always ::= "always"
TK_and ::= "and"
TK_assign ::= "assign"
TK_begin ::= "begin"
TK_buf ::= "buf"
TK_bufif0 ::= "bufif0"
TK_bufif1 ::= "bufif1"
TK_case ::= "case"
TK_casex ::= "casex"
TK_casez ::= "casez"
TK_cmos ::= "cmos"
TK_deassign ::= "deassign"
TK_default ::= "default"
TK_defparam ::= "defparam"
TK_disable ::= "disable"
TK_edge ::= "edge"
TK_else ::= "else"
TK_end ::= "end"
TK_endcase ::= "endcase"
TK_endfunction ::= "endfunction"
TK_endmodule ::= "endmodule"
TK_endprimitive ::= "endprimitive"
TK_endspecify ::= "endspecify"
TK_endtable ::= "endtable"
SymbolIdentifier ::= "endtable"
TK_endtask ::= "endtask"
TK_event ::= "event"

  /* The find* functions built-in methods, but not keywords. */

TK_for ::= "for"
TK_force ::= "force"
TK_forever ::= "forever"
TK_fork ::= "fork"
TK_function ::= "function"
TK_highz0 ::= "highz0"
TK_highz1 ::= "highz1"
TK_if ::= "if"
TK_ifnone ::= "ifnone"
TK_initial ::= "initial"
TK_inout ::= "inout"
TK_input ::= "input"
TK_integer ::= "integer"
TK_join ::= "join"
TK_large ::= "large"
TK_macromodule ::= "macromodule"
TK_medium ::= "medium"
TK_module ::= "module"
TK_nand ::= "nand"
TK_negedge ::= "negedge"
TK_nmos ::= "nmos"
TK_nor ::= "nor"
TK_not ::= "not"
TK_notif0 ::= "notif0"
TK_notif1 ::= "notif1"
TK_or ::= "or"
TK_option ::= "option"
SymbolIdentifier ::= "option"
TK_output ::= "output"
TK_parameter ::= "parameter"
TK_pmos ::= "pmos"
TK_posedge ::= "posedge"
TK_primitive ::= "primitive"
TK_pull0 ::= "pull0"
TK_pull1 ::= "pull1"
TK_pulldown ::= "pulldown"
TK_pullup ::= "pullup"
TK_rcmos ::= "rcmos"
TK_real ::= "real"
TK_realtime ::= "realtime"
TK_reg ::= "reg"
TK_release ::= "release"
TK_repeat ::= "repeat"
TK_rnmos ::= "rnmos"
TK_rpmos ::= "rpmos"
TK_rtran ::= "rtran"
TK_rtranif0 ::= "rtranif0"
TK_rtranif1 ::= "rtranif1"
TK_sample ::= "sample"
TK_scalared ::= "scalared"
TK_small ::= "small"
TK_specify ::= "specify"
TK_specparam ::= "specparam"
TK_strong0 ::= "strong0"
TK_strong1 ::= "strong1"
TK_supply0 ::= "supply0"
TK_supply1 ::= "supply1"
TK_table ::= "table"
SymbolIdentifier ::= "table"
TK_task ::= "task"
TK_time ::= "time"
TK_tran ::= "tran"
TK_tranif0 ::= "tranif0"
TK_tranif1 ::= "tranif1"
TK_tri ::= "tri"
TK_tri0 ::= "tri0"
TK_tri1 ::= "tri1"
TK_triand ::= "triand"
TK_trior ::= "trior"
TK_trireg ::= "trireg"
TK_type_option ::= "type_option"
TK_vectored ::= "vectored"
TK_wait ::= "wait"
TK_wand ::= "wand"
TK_weak0 ::= "weak0"
TK_weak1 ::= "weak1"
TK_while ::= "while"
TK_wire ::= "wire"
TK_wor ::= "wor"
TK_xnor ::= "xnor"
TK_xor ::= "xor"

  /* The 1364-1995 timing checks. */
TK_Shold ::= "$hold"
TK_Snochange ::= "$nochange"
TK_Speriod ::= "$period"
TK_Srecovery ::= "$recovery"
TK_Ssetup ::= "$setup"
TK_Ssetuphold ::= "$setuphold"
TK_Sskew ::= "$skew"
TK_Swidth ::= "$width"
TKK_attribute ::= "$attribute"

TK_bool ::= "bool"
TK_automatic ::= "automatic"
TK_endgenerate ::= "endgenerate"
TK_generate ::= "generate"
TK_genvar ::= "genvar"
TK_localparam ::= "localparam"
TK_noshowcancelled ::= "noshowcancelled"
TK_pulsestyle_onevent ::= "pulsestyle_onevent"
TK_pulsestyle_ondetect ::= "pulsestyle_ondetect"
TK_showcancelled ::= "showcancelled"
TK_signed ::= "signed"
TK_unsigned ::= "unsigned"

  /* The new 1364-2001 timing checks. */
TK_Sfullskew ::= "$fullskew"
TK_Srecrem ::= "$recrem"
TK_Sremoval ::= "$removal"
TK_Stimeskew ::= "$timeskew"

TK_cell ::= "cell"
TK_config ::= "config"
TK_design ::= "design"
TK_endconfig ::= "endconfig"
TK_incdir ::= "incdir"
TK_include ::= "include"
TK_instance ::= "instance"
TK_liblist ::= "liblist"
TK_library ::= library
TK_use ::= "use"
TK_wone ::= "wone"
TK_uwire ::= "uwire"
TK_alias ::= "alias"
TK_always_comb ::= "always_comb"
TK_always_ff ::= "always_ff"
TK_always_latch ::= "always_latch"
TK_assert ::= "assert"
TK_assume ::= "assume"
TK_before ::= "before"
TK_bind ::= "bind"
TK_bins ::= "bins"
TK_binsof ::= "binsof"
TK_bit ::= "bit"
TK_break ::= "break"
TK_byte ::= "byte"
TK_chandle ::= "chandle"
TK_class ::= "class"
TK_clocking ::= "clocking"
TK_const ::= "const"
TK_constraint ::= "constraint"
TK_context ::= "context"
TK_continue ::= "continue"
TK_cover ::= "cover"
TK_covergroup ::= covergroup
TK_coverpoint ::= "coverpoint"
TK_cross ::= "cross"
TK_dist ::= "dist"
TK_do ::= "do"
TK_endclass ::= "endclass"
TK_endclocking ::= "endclocking"
TK_endgroup ::= "endgroup"
TK_endinterface ::= "endinterface"
TK_endpackage ::= "endpackage"
TK_endprogram ::= "endprogram"
TK_endproperty ::= "endproperty"
TK_endsequence ::= "endsequence"
TK_enum ::= "enum"
TK_expect ::= "expect"
TK_export ::= "export"
TK_extends ::= "extends"
TK_extern ::= "extern"
TK_final ::= "final"
TK_first_match ::= "first_match"
TK_foreach ::= "foreach"
TK_forkjoin ::= "forkjoin"
TK_iff ::= "iff"
TK_ignore_bins ::= "ignore_bins"
TK_illegal_bins ::= "illegal_bins"
TK_import ::= "import"
TK_inside ::= "inside"
TK_int ::= "int"
TK_interface ::= "interface"
TK_intersect ::= "intersect"
TK_join_any ::= "join_any"
TK_join_none ::= "join_none"
  /* yes, "local::" is an actual token according to the LRM. */
TK_local_SCOPE ::= "local::"
TK_local ::= "local"
TK_logic ::= "logic"
TK_longint ::= "longint"
TK_matches ::= "matches"
TK_modport ::= "modport"
TK_new ::= "new"
TK_null ::= "null"
TK_package ::= "package"
TK_packed ::= "packed"
TK_priority ::= "priority"
TK_program ::= "program"
TK_property ::= "property"
TK_protected ::= "protected"
TK_pure ::= "pure"
TK_rand ::= "rand"
TK_randc ::= "randc"
TK_randcase ::= "randcase"
TK_randomize ::= "randomize|std::randomize"
TK_randsequence ::= "randsequence"
TK_ref ::= "ref"
TK_return ::= "return"
TK_Sroot ::= "$root"
TK_sequence ::= "sequence"
TK_shortint ::= "shortint"
TK_shortreal ::= "shortreal"
TK_solve ::= "solve"
TK_static ::= "static"
TK_string ::= "string"
TK_struct ::= "struct"
TK_super ::= "super"
TK_tagged ::= "tagged"
TK_this ::= "this"
TK_throughout ::= "throughout"
TK_timeprecision ::= "timeprecision"
TK_timeunit ::= "timeunit"
TK_type ::= "type"
TK_typedef ::= "typedef"
TK_union ::= "union"
TK_unique ::= "unique"
TK_Sunit ::= "$unit"
TK_var ::= "var"
TK_virtual ::= "virtual"
TK_void ::= "void"
TK_wait_order ::= "wait_order"
TK_wildcard ::= "wildcard"
//<COVERGROUP>with { UpdateLocation(); return TK_with__covergroup; }
TK_with ::= "with"
TK_within ::= "within"
TK_timeprecision_check ::= "timeprecision_check"
TK_timeunit_check ::= "timeunit_check"
TK_accept_on ::= "accept_on"
TK_checker ::= "checker"
TK_endchecker ::= "endchecker"
TK_eventually ::= "eventually"
TK_global ::= "global"
TK_implies ::= "implies"
TK_let ::= "let"
TK_nexttime ::= "nexttime"
TK_reject_on ::= "reject_on"
TK_restrict ::= "restrict"
TK_s_always ::= "s_always"
TK_s_eventually ::= "s_eventually"
TK_s_nexttime ::= "s_nexttime"
TK_s_until ::= "s_until"
TK_s_until_with ::= "s_until_with"
TK_strong ::= "strong"
TK_sync_accept_on ::= "sync_accept_on"
TK_sync_reject_on ::= "sync_reject_on"
TK_unique0 ::= "unique0"
TK_until ::= "until"
TK_until_with ::= "until_with"
TK_untyped ::= "untyped"
TK_weak ::= "weak"
TK_implements ::= "implements"
TK_interconnect ::= "interconnect"
TK_nettype ::= "nettype"
TK_soft ::= "soft"
TK_above ::= "above"
TK_abs ::= "abs"
TK_absdelay ::= "absdelay"
TK_abstol ::= "abstol"
TK_access ::= "access"
TK_acos ::= "acos"
TK_acosh ::= "acosh"
TK_ac_stim ::= "ac_stim"
TK_aliasparam ::= "aliasparam"
TK_analog ::= "analog"
TK_analysis ::= "analysis"
TK_asin ::= "asin"
TK_asinh ::= "asinh"
TK_atan ::= "atan"
TK_atan2 ::= "atan2"
TK_atanh ::= "atanh"
TK_branch ::= "branch"
TK_ceil ::= "ceil"
TK_connect ::= "connect"
TK_connectmodule ::= "connectmodule"
TK_connectrules ::= "connectrules"
TK_continuous ::= "continuous"
TK_cos ::= "cos"
TK_cosh ::= "cosh"
TK_ddt ::= "ddt"
TK_ddt_nature ::= "ddt_nature"
TK_ddx ::= "ddx"
TK_discipline ::= "discipline"
TK_discrete ::= "discrete"
TK_domain ::= "domain"
SymbolIdentifier ::= "domain"
TK_driver_update ::= "driver_update"
TK_endconnectrules ::= "endconnectrules"
TK_enddiscipline ::= "enddiscipline"
TK_endnature ::= "endnature"
TK_endparamset ::= "endparamset"
TK_exclude ::= "exclude"
TK_exp ::= "exp"
TK_final_step ::= "final_step"
TK_flicker_noise ::= "flicker_noise"
TK_floor ::= "floor"
TK_flow ::= "flow"
TK_from ::= "from"
TK_ground ::= "ground"
TK_hypot ::= "hypot"
TK_idt ::= "idt"
TK_idtmod ::= "idtmod"
TK_idt_nature ::= "idt_nature"
TK_inf ::= "inf"
TK_infinite ::= "infinite"
TK_initial_step ::= "initial_step"
TK_laplace_nd ::= "laplace_nd"
TK_laplace_np ::= "laplace_np"
TK_laplace_zd ::= "laplace_zd"
TK_laplace_zp ::= "laplace_zp"
TK_last_crossing ::= "last_crossing"
TK_limexp ::= "limexp"
TK_ln ::= "ln"
TK_log ::= "log"
//<AFTER_DOT>max { UpdateLocation(); yy_pop_state(); return TK_max; }
TK_merged ::= "merged"
//<AFTER_DOT>min { UpdateLocation(); yy_pop_state(); return TK_min; }
TK_nature ::= "nature"
TK_net_resolution ::= "net_resolution"
TK_noise_table ::= "noise_table"
TK_paramset ::= "paramset"
TK_potential ::= "potential"
TK_pow ::= "pow"
TK_resolveto ::= "resolveto"
TK_sin ::= "sin"
TK_sinh ::= "sinh"
TK_slew ::= "slew"
TK_split ::= "split"
TK_sqrt ::= "sqrt"
TK_tan ::= "tan"
TK_tanh ::= "tanh"
TK_timer ::= "timer"
TK_transition ::= "transition"
TK_units ::= "units"
TK_white_noise ::= "white_noise"
TK_wreal ::= "wreal"
TK_zi_nd ::= "zi_nd"
TK_zi_np ::= "zi_np"
TK_zi_zd ::= "zi_zd"
TK_zi_zp ::= "zi_zp"

 /* Operators */
TK_DOTSTAR ::= ".*"
TK_LS ::= "<<"
TK_LS ::= "<<<"
TK_RS ::= ">>"
TK_RSS ::= ">>>"
TK_POW ::= "**"
TK_LE ::= "<="
TK_GE ::= ">="
TK_EG ::= "=>"
//"+=>"|"-=>"
TK_PIPEARROW ::= "|->"
TK_PIPEARROW2 ::= "|=>"
TK_SG ::= "*>"
TK_WILDCARD_EQ ::= "==?"
TK_EQ ::= "=="
TK_WILDCARD_NE ::= "!=?"
TK_NE ::= "!="
TK_CEQ ::= "==="
TK_CNE ::= "!=="
TK_LOR ::= "||"
TK_LAND ::= "&&"
TK_TAND ::= "&&&"
TK_NOR ::= "~|"
TK_NXOR ::= "~^"
TK_NXOR ::= "^~"
TK_NAND ::= "~&"
TK_NONBLOCKING_TRIGGER ::= "->>"
_TK_RARROW ::= "->"
TK_LOGEQUIV ::= "<->"
TK_PO_POS ::= "+:"
TK_PO_NEG ::= "-:"
TK_CONTRIBUTE ::= "<+"
TK_PLUS_EQ ::= "+="
TK_MINUS_EQ ::= "-="
TK_MUL_EQ ::= "*="
TK_DIV_EQ ::= "/="
TK_MOD_EQ ::= "%="
TK_AND_EQ ::= "&="
TK_OR_EQ ::= "|="
TK_XOR_EQ ::= "^="
TK_LS_EQ ::= "<<="
TK_RS_EQ ::= ">>="
TK_LS_EQ ::= "<<<="
TK_RSS_EQ ::= ">>>="
TK_INCR ::= "++"
TK_DECR ::= "--"
TK_LP ::= "'{"
TK_SCOPE_RES ::= "::"
TK_COLON_EQ ::= ":="
//yytext[0] ::= "://"
//yytext[0] ::= ":/*"
  /* Prevent ":/" from consuming the start of a comment. */
TK_COLON_DIV ::= ":/"
TK_POUNDMINUSPOUND ::= "#-#"
TK_POUNDEQPOUND ::= "#=#"
TK_POUNDPOUND ::= "##"
TK_LBSTARRB ::= "[*]"
TK_LBPLUSRB ::= "[+]"
TK_LBSTAR ::= "[*"
TK_LBEQ ::= "[="
TK_LBRARROW ::= "[->"
TK_ATAT ::= "@@"
hzeller commented 2 years ago

This is neat! You mention a tool you wrote to do the conversion - is it available somewhere so that we could maybe integrate this in the build-process to auto-generate documentation ?

(sorry for the delay, just seeing this :) )

mingodad commented 2 years ago

There is this online tool https://www.bottlecaps.de/convert/ form the same author of the railroad diagram tool.

mingodad commented 2 years ago

Also I extended bison/byacc/lemon here https://github.com/mingodad/lalr-parser-test to also generate an EBNF compatible with https://www.bottlecaps.de/rr/ui