#!/usr/bin/perl $ALF_InstallDir = "../source/"; print("command: OpenALF.lextest.pl\n\n"); &lextest_LoadRulesNExamples; foreach $clause ('clause6','clause9') { require "$ALF_InstallDir/IEEE1603_2003.$clause.pl"; print("************************************************************\n"); print("*** ALF test of lexical rules for IEEE 1603-2003 $clause ***\n"); print("************************************************************\n"); &lextest_PrintRuleByExample('lextest_rule_'.$clause,'lextest_example'); &lextest_PrintExampleByRule('lextest_rule_'.$clause,'lextest_example'); print("\n"); } 1; sub lextest_PrintRuleByExample { local(*rule,*example) = @_; print("\n*** Results by example ***\n"); foreach $word (@example) { print("$word matches the following rules:\n"); foreach $item (@rule) { local $rule = '^'.eval('$ALF_'.$item).'$'; print("\t$item\n") if ($word =~ /$rule/) && ($word eq $&); } } } sub lextest_PrintExampleByRule { local(*rule,*example) = @_; print("\n*** Results by rule ***\n"); if (defined(@example)) { foreach $item (@rule) { local $eval = eval('$ALF_'.$item); local $rule = '^'.$eval.'$'; local $ruledisplay = "::=\t".join("\n|\t",split(/\$\|\^/,$eval))."\n"; print("\nDefinition of $item:\n$ruledisplay\nExamples of $item:\n"); foreach $word (@example) { print("\t$word\n") if ($word =~ /$rule/) && ($word eq $&); } } } } sub lextest_LoadRulesNExamples { @lextest_rule_clause6 = ( 'uppercase', 'lowercase', 'letter', 'digit', 'special', 'delimiter', 'arithmetic_operator', 'boolean_operator', 'relational_operator', 'shift_operator', 'event_operator', 'meta_operator', 'operator', 'sign', 'unsigned_integer', 'signed_integer', 'integer', 'mantissa', 'exponent', 'unsigned_real', 'signed_real', 'real', 'number', 'unsigned_number', 'signed_number', 'index_value', 'single_index', 'multi_index', 'index', 'giga', 'mega', 'kilo', 'unity', 'milli', 'micro', 'nano', 'pico', 'femto', 'multiplier_prefix_symbol', 'multiplier_prefix_value', 'numeric_bit_literal', 'alphabetic_bit_literal', 'alphanumeric_bit_literal', 'symbolic_bit_literal', 'bit_literal', 'octal_digit', 'hexadecimal_digit', 'binary_base', 'octal_base', 'decimal_base', 'hexadecimal_base', 'binary_based_literal', 'octal_based_literal', 'decimal_based_literal', 'hexadecimal_based_literal', 'based_literal', 'boolean_value', 'arithmetic_value', 'bit_edge_literal', 'based_edge_literal', 'symbolic_edge_literal', 'edge_literal', 'edge_value', 'non_escaped_identifier', 'placeholder_identifier', 'atomic_identifier', 'indexed_identifier', 'full_hierarchical_identifier', 'partial_hierarchical_identifier', 'escaped_identifier', 'identifier', 'quoted_string', 'string_value', 'generic_value', 'vector_expression_macro', ); @lextest_rule_clause9 = ( 'pin_variable', 'pin_value', 'statetable_control_value', 'statetable_data_value', 'boolean_unary_operator', 'boolean_binary_operator', 'event_and', 'event_or', 'vector_operator', 'control_and', ); @lextest_example = ( '(',')','{','}',';',',',':', '+','-','*','/','%','**', '&&','||','~&','~|','~^','~','!','&','|','^', '==','!=','>=','<=','>','<', '>>','<<', '<->','<~>','<&>','->','~>','&>', '=','?','@', '[index]', '[123]', '[]', '[1:2]', '[index:]', '1ohm','Kohm','MEGohm','Gohm','m','me','meow','mohm','uohm','nohm','pohm','fohm', 'nonescaped', '', 'nonescaped[index]', 'parent.child', 'anchestor..descendant', '\escaped', "\42hello world\42", '123','123e5','123e-5', '-123','-123e5','-123e-5', '1.23','1.23e5','1.23e-5', '-1.23','-1.23e5','-1.23e+5', '+1.23','+1.23e5','+1.23e-5', '.123','.123e5','.123e-5', '-.123','-.123e5','-.123e-5', '0.001','0.001E5','0.001E-5', '0.01','0.01E5','0.01E-5', '0.1','0.1E5','0.1E-5', '#.vector', '0','1','X','x','Z','z','L','l','H','h','U','u','W','w','?','*', "\47b0101","\47b1010","\47o5","\47o12","\47d5","\47d10","\47h5","\47hA","\47bZ","\47oZ","\47hZ", '01','10','??','?!','?~','?-','0*','*0','1*','*1', "\47b0101\47b1010","\47o5\47o12","\47d5\47d10","\47h5\47hA", '(01)','(10)', "\(\47b0101\47b1010\)", "\(\47o5\47o12\)", "\(\47d5\47d10\)", "\(\47h5\47hA\)", ); }