#!/usr/bin/perl ################### ### Clause 6.1 ### ################### ### whitespace implemented in ### sub ALF_ReadLexical { local(@newdata) = @_; ### see IEEE1603_2003.datamodel.pl $ALF_uppercase = '[A-Z]'; $ALF_lowercase = '[a-z]'; $ALF_letter = "[A-Za-z]"; $ALF_digit = '[0-9]'; $ALF_special = '[&\|\^~\+\-\*/%\?!:;\,\"\'@=\\\.\$\_#\(\)<>\[\]\{\}]'; ### what about ‘smart’ quotes? ################### ### Clause 6.2 ### ################### ### comment implemented in ### sub ALF_ReadLexical { local(@newdata) = @_; ### see IEEE1603_2003.datamodel.pl ################### ### Clause 6.3 ### ################### $ALF_delimiter = '[\(\)\{\};\,:]'; ### (){};, are delimiters between lexical tokens ### [] are delimiters within the lexical token index ### : is a delimiter within the lexical token index or a delimiter between lexical tokens elsewhere ################### ### Clause 6.4 ### ################### $ALF_arithmetic_operator = '\*\*|[\+\-\*/%]'; $ALF_boolean_operator = '&&|\|\||~&|~\||~\^|[~!&\|\^]'; $ALF_relational_operator = '==|!=|>=|<=|[><]'; $ALF_shift_operator = '<<|>>'; $ALF_event_operator = '<\->|<~>|<&>|\->|~>|&>'; $ALF_meta_operator = '[=\?@]'; $ALF_operator = join('|', $ALF_event_operator, $ALF_shift_operator, $ALF_relational_operator, $ALF_boolean_operator, $ALF_arithmetic_operator, $ALF_meta_operator, ); ################### ### Clause 6.5 ### ################### $ALF_sign = '[\+\-]'; $ALF_unsigned_integer = '[0-9][0-9_]*'; $ALF_signed_integer = "$ALF_sign$ALF_unsigned_integer"; $ALF_integer = join('$|^', $ALF_unsigned_integer, $ALF_signed_integer, ); $ALF_mantissa = "\\.$ALF_unsigned_integer|$ALF_unsigned_integer\\.$ALF_unsigned_integer?"; $ALF_exponent = "[Ee]$ALF_sign?$ALF_unsigned_integer"; $ALF_unsigned_real = join('$|^', "($ALF_mantissa)($ALF_exponent)?", "$ALF_unsigned_integer$ALF_exponent", ); $ALF_signed_real = $ALF_sign.'('.join('|',split(/\$\|\^/,$ALF_unsigned_real)).')'; $ALF_real = join('$|^', $ALF_unsigned_real, $ALF_signed_real, ); $ALF_number = join('$|^', $ALF_unsigned_integer, $ALF_signed_integer, $ALF_unsigned_real, $ALF_signed_real, ); $ALF_unsigned_number = join('$|^', $ALF_unsigned_integer, $ALF_unsigned_real, ); $ALF_signed_number = join('$|^', $ALF_signed_integer, $ALF_signed_real, ); ################### ### Clause 6.6 ### ################### ### $ALF_index_value, $ALF_single_index, $ALF_multi_index, $ALF_index ### see Clause 6.13 to avoid forward reference ################### ### Clause 6.7 ### ################### $ALF_giga = "[Gg]$ALF_letter*"; $ALF_mega = "[Mm][Ee][Gg]$ALF_letter*"; $ALF_kilo = "[Kk]$ALF_letter*"; $ALF_unity = "1$ALF_letter*"; $ALF_milli = "[Mm]([Ee][^Gg]$ALF_letter*|[^Ee]$ALF_letter*|[Ee]\$|\$)"; $ALF_micro = "[Uu]$ALF_letter*"; $ALF_nano = "[Nn]$ALF_letter*"; $ALF_pico = "[Pp]$ALF_letter*"; $ALF_femto = "[Ff]$ALF_letter*"; $ALF_multiplier_prefix_symbol = join('$|^', $ALF_giga, $ALF_mega, $ALF_kilo, $ALF_unity, $ALF_milli, $ALF_micro, $ALF_nano, $ALF_pico, $ALF_femto, ); $ALF_multiplier_prefix_value = join('$|^', $ALF_unsigned_number, $ALF_multiplier_prefix_symbol, ); ################### ### Clause 6.8 ### ################### $ALF_numeric_bit_literal = '[0-1]'; $ALF_alphabetic_bit_literal = '[XxZzLlHhUuWw]'; $ALF_alphanumeric_bit_literal = join('',split(/\]\[/,$ALF_alphabetic_bit_literal.$ALF_numeric_bit_literal)); $ALF_symbolic_bit_literal = '[\?\*]'; $ALF_bit_literal = join('',split(/\]\[/,$ALF_alphanumeric_bit_literal.$ALF_symbolic_bit_literal)); ################### ### Clause 6.9 ### ################### $ALF_octal_digit = join('',split(/\]\[/,$ALF_bit_literal.'[2-7]')); $ALF_hexadecimal_digit = join('',split(/\]\[/,$ALF_octal_digit.'[8-9A-Fa-f]')); $ALF_binary_base = '\47[Bb]'; $ALF_octal_base = '\47[Oo]'; $ALF_decimal_base = '\47[Dd]'; $ALF_hexadecimal_base = '\47[Hh]'; $ALF_binary_based_literal = $ALF_binary_base.$ALF_bit_literal.join('',split(/\]\[/,$ALF_bit_literal.'[_]*')); $ALF_octal_based_literal = $ALF_octal_base.$ALF_octal_digit.join('',split(/\]\[/,$ALF_octal_digit.'[_]*')); $ALF_decimal_based_literal = $ALF_decimal_base.$ALF_digit.join('',split(/\]\[/,$ALF_digit.'[_]*')); $ALF_hexadecimal_based_literal = $ALF_hexadecimal_base.$ALF_hexadecimal_digit.join('',split(/\]\[/,$ALF_hexadecimal_digit.'[_]*')); $ALF_based_literal = join('$|^', $ALF_binary_based_literal, $ALF_octal_based_literal, $ALF_decimal_based_literal, $ALF_hexadecimal_based_literal, ); ################### ### Clause 6.10 ## ################### $ALF_boolean_value = join('$|^', $ALF_alphanumeric_bit_literal, $ALF_based_literal, $ALF_integer, ); ################### ### Clause 6.11 ## ################### ### $ALF_arithmetic_value ### see Clause 6.13 to avoid forward reference ################### ### Clause 6.12 ## ################### $ALF_bit_edge_literal = "($ALF_bit_literal)"."($ALF_bit_literal)"; $ALF_based_edge_literal = '('.join('|',split(/\$\|\^/,$ALF_based_literal)).')('.join('|',split(/\$\|\^/,$ALF_based_literal)).')'; $ALF_symbolic_edge_literal = '\?[~!\-]'; $ALF_edge_literal = join('$|^', $ALF_bit_edge_literal, $ALF_based_edge_literal, $ALF_symbolic_edge_literal, ); $ALF_edge_value = '\(('.join('|',split(/\$\|\^/,$ALF_edge_literal)).')\)'; ### ALF_edge_value implemented as syntax rule ### see Clause 7.3 ################### ### Clause 6.13 ## ################### #$ALF_non_escaped_identifier = '[A-Za-z][A-Za-z0-9\_\$\#]*'; $ALF_non_escaped_identifier = '[A-Za-z][A-Za-z0-9_\$#]*'; $ALF_placeholder_identifier = "\<$ALF_non_escaped_identifier\>"; $ALF_atomic_identifier = join('$|^', $ALF_non_escaped_identifier, $ALF_placeholder_identifier, ); ### $ALF_index_value, $ALF_single_index, $ALF_multi_index, $ALF_index ### from Clause 6.6 $ALF_index_value = join('$|^', $ALF_unsigned_integer, $ALF_atomic_identifier, ); $ALF_6_13_helper0 = join('|',split(/\$\|\^/,$ALF_index_value)); $ALF_single_index = '\[('.$ALF_6_13_helper0.')\]'; $ALF_multi_index = '\[('.$ALF_6_13_helper0.'):('.$ALF_6_13_helper0.')\]'; $ALF_index = join('$|^', $ALF_single_index, $ALF_multi_index, ); $ALF_6_13_helper1 = join('|',split(/\$\|\^/,$ALF_atomic_identifier)); $ALF_indexed_identifier = "($ALF_6_13_helper1)($ALF_index)"; $ALF_6_13_helper2 = "($ALF_6_13_helper1)($ALF_index)?"; $ALF_full_hierarchical_identifier = $ALF_6_13_helper2.'(\.'.$ALF_6_13_helper2.')+'; $ALF_6_13_helper3 = $ALF_6_13_helper2.'(\.'.$ALF_6_13_helper2.')?'; $ALF_partial_hierarchical_identifier = $ALF_6_13_helper3.'\.\.('.$ALF_6_13_helper3.'\.\.)*('.$ALF_6_13_helper3.')?'; $ALF_hierarchical_identifier = join('$|^', $ALF_full_hierarchical_identifier, $ALF_partial_hierarchical_identifier, ); $ALF_escaped_identifier = '\\\\\\S+'; $ALF_identifier = join('$|^', $ALF_atomic_identifier, $ALF_indexed_identifier, $ALF_hierarchical_identifier, $ALF_escaped_identifier, ); ### $ALF_arithmetic_value ### from Clause 6.11 $ALF_arithmetic_value = join('$|^', $ALF_number, ### Errata: $ALF_identifier should be $ALF_atomic_identifier ### $ALF_identifier, $ALF_atomic_identifier, ### Errata: $ALF_bit_literal should be $ALF_alphanumeric_bit_literal ### $ALF_bit_literal, $ALF_alphanumeric_bit_literal, $ALF_based_literal, ); ################### ### Clause 6.14 ## ################### $ALF_quoted_string = '\42.*\42'; ################### ### Clause 6.15 ## ################### $ALF_string_value = join('$|^', $ALF_quoted_string, $ALF_identifier, ); ################### ### Clause 6.16 ## ################### $ALF_generic_value = join('$|^', $ALF_number, $ALF_multiplier_prefix_symbol, $ALF_edge_value, ### Errata: $ALF_bit_literal should be $ALF_alphanumeric_bit_literal ??? $ALF_bit_literal, ### $ALF_alphanumeric_bit_literal, $ALF_based_literal, $ALF_identifier, $ALF_quoted_string, ); ### Implementation of ALF_generic_value as syntax rule ### see Clause 7.3 ################### ### Clause 6.17 ## ################### $ALF_vector_expression_macro = '#\\.('.$ALF_non_escaped_identifier.')'; ################### ### Clause 6.18 ## ################### ### whitespace implemented in ### sub ALF_ReadLexical { local(@newdata) = @_; ### see IEEE1603_2003.datamodel.pl ################### ### Clause 6.19 ## ################### ### parser ambiguity resolution not required due to implementation of ### sub ALF_ReadLexical { local(@newdata) = @_; ### see OpenALF.datamodel.pl 1;