Appendix B. VHDL Syntax

In this appendix we present the full set of syntax rules for VHDL using the EBNF notation introduced in Chapter 1. The form of EBNF used in this book differs from that of the VHDL Language Reference Manual (LRM) in order to make the syntax rules more intelligible to the VHDL user. The LRM includes a separate syntax rule for each minor syntactic category. In this book, we condense the grammar into a smaller number of rules, each of which defines a larger part of the grammar. We introduce the EBNF symbols “(”, “)” and “...” as part of this simplification. Our aim is to avoid the large amount of searching required when using the LRM rules to resolve a question of grammar.

Those parts of the syntax rules that were introduced in VHDL-2008 are underlined in this appendix. A model written using earlier versions of the language may not use these features. In addition, there are some entirely new rules introduced in VHDL-2008 that have no predecessors in earlier versions. We identify these rules by underlining the rule name on the left-hand side of the “⇐”symbol.

Some of the rules refer to the syntax rules for the PSL. Such references are identified by the italicized prefix “PSL_”. The PSL syntax rules are not included here. The interested reader should refer to the PSL standard or to books on PSL for details.

Index to Syntax Rules

absolute_pathname 858

access_type_definition 848

actual_part 856

aggregate 858

alias_declaration 847

architecture_body 844

array_type_definition 848

assertion_statement 853

association_list 856

attribute_declaration 847

attribute_name 857

attribute_specification 847

based_integer 858

based_literal 858

binding_indication 848

bit_string_literal 858

block_configuration 844

block_declarative_item 850

block_statement 850

case_generate_statement 852

case_statement 855

character_literal 858

choices 858

component_configuration 844

component_declaration 847

component_instantiation_statement 852

component_specification 847

concurrent_assertion_statement 851

concurrent_conditional_signal_assignment 851

concurrent_procedure_call_statement 851

concurrent_selected_signal_assignment 851

concurrent_signal_assignment_statement 851

concurrent_simple_signal_assignment 851

concurrent_statement 850

condition 856

conditional_force_assignment 853

conditional_signal_assignment 853

conditional_variable_assignment 854

conditional_waveform_assignment 853

configuration_declaration 844

configuration_specification 847

constant_declaration 846

context_declaration 844

context_reference 843

decimal_literal 858

delay_mechanism 854

design_file 843

design_unit 843

disconnection_specification 848

discrete_range 850

entity_class 847

entity_declaration 843

entity_declarative_item 844

entity_name_list 847

enumeration_type_definition 848

exit_statement 855

expression 856

external_name 857

external_pathname 857

factor 857

file_declaration 847

file_type_definition 848

floating_type_definition 848

for_generate_statement 852

formal_part 856

function_call 857

function_specification 846

generate_statement 852

generate_statement_body 852

group_declaration 848

group_template_declaration 848

identifier 858

if_generate_statement 852

if_statement 854

integer 858

integer_type_definition 848

interface_constant_declaration 855

interface_file_declaration 855

interface_list 855

interface_package_declaration 856

interface_signal_declaration 855

interface_subprogram_declaration 856

interface_type_declaration 855

interface_variable_declaration 855

label 858

library_clause 843

library_unit 843

literal 858

logical_expression 856

loop_statement 855

mode 855

name 857

next_statement 855

null_statement 855

operator_symbol 857

package_body 845

package_body_declarative_item 845

package_declaration 845

package_declarative_item 845

package_instantiation_declaration 845

package_pathname 858

pathname_element 858

physical_literal 858

physical_type_definition 848

primary 857

procedure_call_statement 854

procedure_specification 846

process_declarative_item 851

process_statement 851

protected_type_body 849

protected_type_body_declarative_item 849

protected_type_declaration 849

protected_type_declarative_item 849

qualified_expression 857

record_type_definition 848

relation 856

relative_pathname 858

report_statement 853

return_statement 855

selected_name 857

selected_signal_assignment 853, 854

selected_variable_assignment 854

selected_waveform_assignment 853

sequential_statement 852

shift_expression 856

signal_assignment_statement 853

signal_declaration 847

signature 857

simple_expression 857

simple_signal_assignment 853

simple_variable_assignment 854

string_literal 858

subprogram_body 846

subprogram_declaration 846

subprogram_declarative_item 846

subprogram_instantiation_declaration 846

subprogram_specification 845

subtype_declaration 849

subtype_indication 849

term 857

tool_directive 858

type_declaration 846

type_definition 846

type_mark 850

use_clause 848

variable_assignment_statement 854

variable_declaration 847

wait_statement 853

waveform 854

Design File

design_file ⇐ design_unit {...}

design_unit ⇐{ library_clause I use_clause I context_reference}library_unit

library_unit ⇐

entity_declaration

| architecture_body

| package_declaration

| package_body

| package_instantiation_declaration

 

| configuration_declaration

| context_declaration

| PSL_Verification_Unit

 

library_clause ⇐ library identifier {, ... };

context_referencecontext selected_name ,{ ... } ;

Library Unit Declarations

entity_declaration ⇐entity identifier is[ generic ( generic_interface_list ) ; ][port ( port_interface_list ) ; ]{entity_declarative_item }

[ begin{ concurrent_assertion_statement| passive_concurrent_procedure_call_statement| passive_process_statement } ]| PSL_PSL_Directive

end [ entity ] [ identifier ] ;

entity_declarative_item ⇐

subprogram_declaration

| subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

| type_declaration

| subtype_declaration

| constant_declaration

| signal_declaration

| shared_variable_declaration

| file_declaration

| alias_declaration

 

| attribute_declaration

| attribute_specification

| disconnection_specification

| use_clause

| group_template_declaration

| group_declaration

| PSL_Property_Declaration

| PSL_Sequence_Declaration

| PSL_Clock_Declaration

 

architecture_body ⇐

architecture identifier of entity_name is{ block_declarative_item }

begin{ concurrent_statement }

end [ architecture ] [ identifier ] ;

configuration_declaration ⇐

configuration identifier of entity_name is{ use_clause | attribute_specification | group_declaration }{use vunit verification_unit_name {, ... };}block_configuration ⇐

end [ configuration ] [ identifier ] ;

block_configuration

for ( architecture_name| block_statement_label| generate_statement_label[ ( (static_discrete_range | static_expression | alternative_label ) ) ] ){ use_clause }{ block_configuration | component_configuration }

end for ;

component_configuration ⇐

for component_specification[ binding_indication ; ]{ use vunit verification_unit_name { , ...} ;}[ block_configuration ]

end for ;

context_declaration ⇐

context identifier is{ library_clause | use_clause | context_reference }

end [ context ] [ identifier ] ;

Declarations and Specifications

package_declaration ⇐

package identifier is[ generic ( generic_interface_list ) ;[ generic map ( generic_association_list ) ; ] ]{ package_declarative_item }

end [ package ] [ identifier ];

package_declarative_item ⇐

subprogram_declaration

 

| subprogram_instantiation_declaration

 

| package_declaration

 

| package_instantiation_declaration

 

| type_declaration

| subtype_declaration

| constant_declaration

| signal_declaration

| variable_declaration

| file_declaration

| alias_declaration

| component_declaration

| attribute_declaration

| attribute_specification

| disconnection_specification

| use_clause

| group_template_declaration

| group_declaration

| PSL_Property_Declaration

|PSL_Sequence_Declaration

package_body ⇐

package body identifier is{ package_body_declarative_item }

end [ package body ] [ identifier ];

package_body_declarative_item ⇐

subprogram_declaration

| subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

| type_declaration

| subtype_declaration

| constant_declaration

| variable_declaration

| file_declaration

| alias_declaration

| attribute_declaration

| attribute_specification

| use_clause

 

| group_template_declaration

| group_declaration

package_instantiation_declaration ⇐

package identifier is new uninstantiated_package_name[ generic map ( generic_association_list ) ];

subprogram_specification ⇐

procedure_specification | function_specification

procedure_specification ⇐

procedure identifier[ generic ( generic_interface_list )[ generic map ( generic_association_list ) ] ][ [parameter ] ( parameter_interface_list ) ]

function_specification ⇐

[ pure | impure ] function ( identifier | operator_symbol )[ generic ( generic_interface_list )[ generic map ( generic_association_list ) ] ][ [parameter ] ( parameter_interface_list ) ] return type_mark

subprogram_declaration ⇐ subprogram_specification ;

subprogram_body ⇐

subprogram_specification is{ subprogram_declarative_item }

begin{ sequential_statement }

end [ procedure | function ] [ identifier | operator_symbol ];

subprogram_declarative_item ⇐

subprogram_declaration

| subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

| type_declaration

| subtype_declaration

| constant_declaration

| variable_declaration

| file_declaration

| alias_declaration

| attribute_declaration

| attribute_specification

| use_clause

 

| group_template_declaration

| group_declaration

subprogram_instantiation_declaration ⇐

( procedure | function ) identifier isnew uninstantiated_subprogram_name [ signature ][ generic map ( generic_association_list ) ];

type_declaration ⇐

type identifier is type_definition ;| type identifier ;

type_definition ⇐

enumeration_type_definition

| integer_type_definition

| floating_type_definition

| physical_type_definition

| array_type_definition

| record_type_definition

| access_type_definition

| file_type_definition

| protected_type_declaration

| protected_type_body

constant_declaration ⇐

constant identifier {, ...}: subtype_indication [ := expression ];

signal_declaration ⇐signal identifier {, ...}: subtype_indication [ register | bus ][ := expression ];

variable_declaration ⇐[ shared ] variable identifier {, ... }: subtype_indication [ := expression ];

file_declaration ⇐file identifier {, ...}: subtype_indication[ [open file_open_kind_expression ] is string_expression ] ;

alias_declaration ⇐alias ( identifier | character_literal | operator_symbol )[ : subtype_indication] is name [ signature ];

component_declaration ⇐component identifier [ is ][ generic ( generic_interface_list ) ;][port ( port_interface_list ) ; ]end component [ identifier ];

attribute_declaration ⇐ attribute identifier : type_mark ;

attribute_specification ⇐attribute identifier of entity_name_list : entity_class is expression ;

entity_name_list ⇐( (identifier | character_literal | operator_symbol ) [ signature ] ) { ,...} | others| all

entity_class ⇐

entity

| architecture

| configuration

| package

|procedure

| function

| type

| subtype

|constant

| signal

| variable

| file

|component

| label

| literal

| units

|group

| property

| sequence

 

configuration_specification ⇐

for component_specificationbinding_indication ;{ use vunit verification_unit_name {, ...};}

[ end for ; ]

component_specification ⇐

( instantiation_label {, ...} | others | all ): component_name

binding_indication ⇐

use ( entity entity_name [ ( architecture_identifier ) ] | configuration configuration_name| open )

[ generic map ( generic_association_list ) ]

[ port map ( port_association_list ) ]

disconnection_specification ⇐disconnect ( signal_name {, ...} |others | all ): type_markafter time_expression ;

group_template_declaration ⇐group identifier is ( ( entity_class [ <> ] ) {, ...} );

group_declaration ⇐group identifier : group_template_name ( ( name | character_literal ) {, ...} );

use_clause ⇐ use selected_name {, ...};

Type Definitions

enumeration_type_definition ⇐ ( ( identifier | character_literal ) {, ...})

integer_type_definition ⇐range ( range_attribute_name| simple_expression (to | downto ) simple_expression

floating_type_definition ⇐range ( range_attribute_name| simple_expression (to |downto ) simple_expression

physical_type_definition ⇐range ( range_attribute_name| simple_expression ( to | downto ) simple_expressionunitsidentifier ;{ identifier = physical_literal ;}end units [ identifier ]

array_type_definition ⇐array ( ( type_mark range <> {, ...} ) of element_subtype_indication| array ( discrete_range {, ... } ) of element_subtype_indication

record_type_definition ⇐record( identifier {, ...}: subtype_indication ; ){ ... }end record [ identifier ]

access_type_definition ⇐ access subtype_indication

file_type_definition ⇐ file of type_mark

protected_type_declaration ⇐protected{ protected_type_declarative_item }end protected [ identifier ]

protected_type_declarative_item ⇐

subprogram_declaration

| subprogram_instantiation_declaration

| attribute_specification

| use_clause

protected_type_body ⇐protected body{ protected_type_body_declarative_item }end protected body [ identifier ]

protected_type_body_declarative_item ⇐

subprogram_declaration

| subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

| type_declaration

| subtype_declaration

| constant_declaration

| variable_declaration

| file_declaration

| alias_declaration

| attribute_declaration

| attribute_specification

| use_clause

 

| group_template_declaration

| group_declaration

| subtype_declaration ⇐ subtype identifier is subtype_indication ;

subtype_indication ⇐[ resolution_indication ] type_mark [ constraint ]

resolution_indication ⇐resolution_function_name|( resolution_indication| (record_element_identifier resolution_indication ){, ...})

constraint ⇐( range range_attribute_name| simple_expression ( to | downto) simple_expression )| array_constraint| record_constraint

array_constraint ⇐( discrete_range { , ... } ) [array_constraint record_constraint ]| ( open ) [ array_constraint | record_constraint ]

record_constraint ⇐( ( record_element_identifier ( array_constraint record_constraint ) ) {, ...} )

discrete_range ⇐discrete_subtype_indication| range_attribute_name| simple_expression ( to | downto ) simple_expression

type_mark ⇐ type_name | subtype_name

Concurrent Statements

concurrent_statement ⇐| block_statement| process_statement| concurrent_procedure_call_statement| concurrent_assertion_statement| concurrent_signal_assignment_statement| component_instantiation_statement| generate_statement| PSL_PSL_Directive

block_statement ⇐block_label :block [ ( guard_expression ) ] [is ][ generic ( generic_interface_list ) ;[ generic map ( generic_association_list ) ; ] ][ port ( port_interface_list ) ;[ port map ( port_association_list ) ; ] ]{ block_declarative_item }begin{ concurrent_statement }end block [ block_label ];

block_declarative_item ⇐

subprogram_declaration

I subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

I type_declaration

I subtype_declaration

I constant_declaration

I signal_declaration

I shared_variable_declaration

I file_declaration

I alias_declaration

I component_declaration

I attribute_declaration

I attribute_specification

I configuration_specification

I disconnection_specification

I use_clause

 

I group_template_declaration

I group_declaration

| PSL_Property_Declaration

| PSL_Sequence_Declaration

| PSL_Clock_Declaration

 

process_statement ⇐[ process_label : ][ postponed ] process [ ( ( signal_name {, ...} ) | all ) ] [ is ]{ process_declarative_item }begin{ sequential_statement }end [ postponed ] process [ process_label ];

process_declarative_item ⇐

subprogram_declaration

I subprogram_body

| subprogram_instantiation_declaration

 

| package_declaration

| package_body

| package_instantiation_declaration

 

I type_declaration

I subtype_declaration

I constant_declaration

I variable_declaration

I file_declaration

I alias_declaration

I attribute_declaration

I attribute_specification

I use_clause

 

I group_template_declaration

group_declaration

concurrent_procedure_call_statement ⇐[ label : ] [ postponed ] procedure_name [ ( parameter_association_list ) ];

concurrent_assertion_statement ⇐[ label : ] [postponed ] assert condition[ report expression ] [ severity expression ];

concurrent_signal_assignment_statement ⇐[ label : ] [ postponed ] concurrent_simple_signal_assignment| [ label : ] [ postponed ] concurrent_conditional_signal_assignment| [ label : ] [ postponed ] concurrent_selected_signal_assignment

concurrent_simple_signal_assignment ⇐target <= [ guarded ] delay_mechanism ] waveform ;

concurrent_conditional_signal_assignment ⇐target < = [ guarded ] [ delay_mechanism ]{ waveform when condition{ else waveform when condition }[ else waveform ];

concurrent_selected_signal_assignment ⇐with expression select [?]target <= [ guarded ] [ delay_mechanism ]{ waveform when choices ,}waveform when choices ;

component_instantiation_statement ⇐instantiation_label :( [component ] component_name| entity entity_name [ ( architecture_identifier ) ]| configuration configuration_name )[ generic map ( generic_association_list ) ][ port map ( port_association_list ) ];

generate_statement ⇐for_generate_statement | if_generate_statement | case_generate_statement

for_generate_statement ⇐generate_label :for identifier in discrete_range generategenerate_statement_bodyend generate [ generate_label ];

if_generate_statement ⇐generate_label :if [alternative_label : ] condition generategenerate_statement_body{ elsif [ alternative_label :] condition generategenerate_statement_body[ else [ alternative_label : ] generategenerate_statement_body ]end generate [ generate_label ];

case_generate_statementgenerate_label :case expression generate( when [ alternative_label : ] choices =>generate_statement_body ){ ... }end generate [ generate_label ];

generate_statement_body ⇐[ {block_declarative_item }begin ]{ concurrent_statement }[ end [ alternative_label ] ; ]

Sequential Statements

sequential_statement ⇐

wait_statement

| assertion_statement

| report_statement

| signal_assignment_statement

| variable_assignment_statement

| procedure_call_statement

| if_statement

| case_statement

| loop_statement

| next_statement

exit_statement

| return_statement

| null_statement

 

wait_statement ⇐[ label : ] wait [ on signal_name {, ...}][ until condition ][ for time_expression ];

assertion_statement ⇐

[ label :] assert condition[ report expression ] [ severity expression ];

report_statement ⇐[ label :] report expression [ severity expression ];

signal_assignment_statement ⇐[ label :] simple_signal_assignment| [ label :] conditional_signal_assignment| [label : ] selected_signal_assignment

simple_signal_assignment ⇐

( name | aggregate ) <= [ delay_mechanism ] waveform ;| name <= force [ in | out ] expression ;| name <= release [ in | out ];

conditional_signal_assignment ⇐conditional_waveform_assignment | conditional_force_assignment

conditional_waveform_assignment ⇐[ label :]( name | aggregate ) <= [ delay_mechanism ]waveform when condition{ else waveform when condition }[ else waveform ];

conditional_force_assignment ⇐[ label :]name >= force [ in | out ]{ expression when condition }{ else expression when condition }[ else expression ] ;

selected_signal_assignment ⇐selected_waveform_assignment | selected_force_assignment

selected_waveform_assignment ⇐[ label :] with expression select[?]( name | aggregate ) <= [ delay_mechanism ]{ waveform when choices, }waveform when choices ;

selected_signal_assignment ⇐[ label :]with expression select [?]name <= force [ in | out ]{ expression when choices , }expression when choices ;

delay_mechanism ⇐ transport | [ reject time_expression ] inertial

waveform ⇐( value_expression [ after time_expression ] | null [ after time_expression ] ) { , ... }| unaffected

variable_assignment_statement ⇐[ label : ] simple_variable_assignment| [label : ] conditional_variable_assignment| [ label : ] selected_variable_assignment

simple_variable_assignment ⇐( name | aggregate ) := expression ;

conditional_variable_assignment ⇐( name | aggregate ) :=expression when condition{ else expression when condition }[ else expression ] ;

selected_variable_assignment ⇐with expression select [?]( name | aggregate ) :={ expression when choices ,}expression when choices ;

procedure_call_statement ⇐[ label : ] procedure_name [ ( parameter_association_list ) ];

if_statement ⇐[ if_label :]if condition then{ sequential_statement }{ elsif condition then{ sequential_statement } }[ else{ sequential_statement } ]end if [ if_label ] ;

case_statement ⇐[ case_label : ]case [?] expression is( when choices => { sequential_statement } ){ ... }end case [?] [ case_label ] ;

loop_statement ⇐[ loop_label : ][ while condition | for identifier | in discrete_range ] loop{ sequential_statement end loop [ loop_label ] ;

next_statement ⇐ [ label : ] next [ loop_label ] [ when condition ] ;

exit_statement ⇐ [ label : ] exit [ loop_label ] [ when condition ] ;

return_statement ⇐ [ label : ] return [ expression ] ;

null_statement ⇐ [ label : ] null ;

Interfaces and Associations

interface_list ⇐( interface_constant_declaration| interface_signal_declaration| interface_variable_declaration| interface_file_declaration| interface_type_declaration| interface_subprogram_declaration| interface_package_declaration ) {; ... }

interface_constant_declaration ⇐[ constant ] identifier {, ... } : [in ] subtype_indication[ := static_expression]

interface_signal_declaration ⇐[ signal ] identifier {, ... } : [ mode ] subtype_indication [ bus ][ := static_expression ]

interface_variable_declaration ⇐[ variable ] identifier {, ... } : [ mode ] subtype_indication[ := static_expression ]

mode ⇐ in | out | inout | buffer | linkage

interface_file_declaration ⇐file identifier { , ... } : subtype_indication

interface_type_declarationtype identifier

interface_subprogram_declaration ⇐( procedure identifier[ [parameter ] ( parameter_interface_list )| [ pure | impure ] function ( identifier | operator_symbol )| [ parameter ] ( parameter_interface_list ) ] return type_mark) [ is ( subprogram_name | <> ) ]

interface_package_declaration ⇐package identifier is new uninstantiated_package_namegeneric map ( ( generic_association_list | <> | default ) )

association_list ⇐ ( [ formal_part => ] actual_part ) { , ... }

formal_part ⇐generic_name| port_name| parameter_name| function_name ( generic_name | port_name | parameter_name )| type_mark ( generic_name | port_name | parameter_name ) )

actual_part ⇐[ inertial ] expression| signal_name| variable_name| file_name| subtype_indication| subprogram_name| package_name| open| function_name ( ( signal_name | variable_name ) )| type_mark ( ( signal_name | variable_name ) )

Expressions and Names

condition ⇐ expression

expression ⇐ (?? primary ) | logical_expression

logical_expression ⇐

relation { and relation }

| relation [ nand relation ]

| relation { or relation }

| relation [ nor relation ]

| relation { xor relation }

| relation { xnor relation }

relation ⇐shift_expression[ ( = | /= | < | <= | > | >= | ?= | ?/= | ?< | ?<= | ?> | ?>= ) shift_expression

shift_expression ⇐simple_expression [ (sll | srl | sla | sra | rol | ror ) simple_expression ]

simple_expression ⇐ [ + | - ] term { ( + | - | & ) term }

term ⇐ factor { ( * | / | mod | rem ) factor }

factor ⇐| primary [ ** primary ]| abs primary| not primary| and primary| nand primary| or primary| nor primary| xor primary| xnor primary

primary ⇐

name

| literal

| aggregate

| function_call

| qualified_expression

| type_mark ( expression )

| new subtype_indication

| new qualified_expression

| ( expression )

 

function_call ⇐ function_name [ ( parameter_association_list ) ]

qualified_expression ⇐ type_mark ‘ ( expression ) | type_mark ‘ aggregate

name ⇐identifier| operator_symbol| character_literal| selected_name| ( name | function_call ) ( expression { , ...} )| ( name | function_call ) ( discrete_range )| attribute_name| external_name

selected_name ⇐( name | function_call ) . ( identifier | character_literal | operator_symbol | all )

operator_symbol ⇐ “ { graphic_character } ”

attribute_name ⇐( name | function_call ) [ signature ] ‘ identifier [ ( expression ) ]

signature ⇐ [ [ type_mark {, ... } ] [ return type_mark ] ]

external_name ⇐<< constant external_pathname : subtype_indication >>| << signal external_pathname : subtype_indication >>| << variable external_pathname : subtype_indication >>

external_pathname ⇐absolute_pathname relative_pathname package_pathname

absolute_pathname ⇐ . { pathname_element .} object_identifier

relative_pathname ⇐ { ∧ .} { pathname_element .} object_identifier

pathname_element ::=entity_identifier| component_instantiation_label| block_label| generate_statement_label [ ( static_expression ) ]| package_identifier

package_pathname ⇐ @ library_identifier . { package_identifier . } object_identifier

literal ⇐

decimal_literal

| based_literal

| physical_literal

| identifier

| character_literal

| string_literal

| bit_string_literal

| null

physical_literal ⇐ [ decimal_literal | based_literal ] unit_name

decimal_literal ⇐ integer [ . integer ] [ E [ + ] integer | E – integer ]

based_literal ⇐integer # based_integer [ . based_integer ] # [ E [ + ] integer| E – integer ]

integer ⇐ digit } [ _ ] ... }

based_integer ⇐ ( digit | letter ) { [ _ ] ... }

character_literal ⇐ ‘ graphic_character ‘

string_literal ⇐ “ { graphic_character } ”

bit_string_literal ⇐[ integer ] ( B | O | X | UB | UO | UX | SB | SO | SX | D )“ [ graphic_character { [ _ ] ...} ] ”

aggregate ⇐ ( ( [ choices => ] expression ) { , ... } )

choices ⇐ ( simple_expression | discrete_range | identifier | others ) { | ...}

label ⇐ identifier

identifier ⇐ letter { [ _ ] { letter | digit ) } | graphic_character { ... }

tool_directive ⇐ ‘ identifier { graphic_character }

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
52.14.109.61