### Liberty data analysis ### sub ALF_CreateLibertyData { local($parent) = @_; print("# System Message:\tstarted creating Liberty database ",&DateTime,"\n"); &AutoNameStart($parent); $ALF_Children{$parent} = &CreateArray(); &Liberty_group(0,$parent); print("# System Message:\tfinished creating Liberty database ",&DateTime,"\n"); 1; } ### Liberty parser ### $ALF_liberty_identifier = '[A-Za-z0-9\$#][A-Za-z0-9_\$#\.]*'; $ALF_liberty_string_value = join('$|^', $ALF_quoted_string, $ALF_liberty_identifier, ); sub Liberty_statements { local($token,$object) = @_; $token = &Liberty_statement($token,$object); local $return; while ($token) { $return = $token; $token = &Liberty_statement($token+1,$object); } $return; } sub Liberty_statement { local($token,$object) = @_; &Liberty_define($token,$object) || &Liberty_group($token,$object) || &Liberty_simple_attribute($token,$object) || &Liberty_complex_attribute($token,$object) ; } sub Liberty_define { local($token,$parent) = @_; ($ALF_ParserData[$token] eq 'define') &&( ($ALF_ParserData[$token+1] eq '(') && &ALF_LexicalMatch('string_value',$ALF_ParserData[$token+2]) && ($ALF_ParserData[$token+3] eq ',') && &ALF_LexicalMatch('string_value',$ALF_ParserData[$token+4]) && ($ALF_ParserData[$token+5] eq ',') && &ALF_LexicalMatch('string_value',$ALF_ParserData[$token+6]) && ($ALF_ParserData[$token+7] eq ')') && &ALF_CreateObject($parent,undef,undef,undef, 'ALF_LibertySyntax', 'define', 'ALF_LibertyType', 'define', 'ALF_LibertyValue', &CreateArray( $ALF_ParserData[$token+2], $ALF_ParserData[$token+4], $ALF_ParserData[$token+6], ), ) && $token+8 || &ALF_SyntaxError('define',$token) ) ; } sub Liberty_group { local($token,$parent) = @_; local $object; local ($nexttoken,$type,@array) = &Liberty_head($token,$parent); ($nexttoken > $token+1) && ($ALF_ParserData[$nexttoken] eq '{') && ($object = &ALF_CreateObject($parent,undef,undef,undef, 'ALF_LibertySyntax', 'group', 'ALF_Children', &CreateArray(), 'ALF_LibertyType', $type, 'ALF_LibertyName', join(',',@array), )) &&( ($token = &Liberty_statements($nexttoken+1,$object)) || ($token = $nexttoken+1) ) &&( ($ALF_ParserData[$token+1] eq '}') && $token+1 || &ALF_SyntaxError('group',$token+1) ) ; } sub Liberty_simple_attribute { local($token,$parent) = @_; &ALF_LexicalMatch('identifier',$ALF_ParserData[$token]) && ($ALF_ParserData[$token+1] eq ':') && &ALF_CreateObject($parent,undef,undef,undef, 'ALF_LibertySyntax', 'simple_attribute', 'ALF_LibertyType', $ALF_ParserData[$token], 'ALF_LibertyValue', $ALF_ParserData[$token+2], ) &&( &ALF_LexicalMatch('liberty_string_value',$ALF_ParserData[$token+2]) || &ALF_LexicalMatch('number',$ALF_ParserData[$token+2]) || &ALF_SyntaxError('simple_attribute',$token+2) )&&( ($ALF_ParserData[$token+3] eq ';') && $token+3 || &ALF_SyntaxError('simple_attribute',$token+3) ) ; } sub Liberty_complex_attribute { local($token,$parent) = @_; local $object; local ($nexttoken,$type,@array) = &Liberty_head($token,$parent); ($nexttoken > $token+1) && ($object = &ALF_CreateObject($parent,undef,undef,undef, 'ALF_LibertySyntax', 'complex_attribute', 'ALF_LibertyType', $type, 'ALF_LibertyValue', &Liberty_Array2ALF(@array), )) &&( ($ALF_ParserData[$nexttoken] eq ';') && $nexttoken || &ALF_SyntaxError('complex_attribute',$nexttoken) ) ; } sub Liberty_head { local($token,$parent) = @_; local ($type,@array); if( &ALF_LexicalMatch('identifier',$ALF_ParserData[$token]) && $ALF_ParserData[$token+1] eq '(' ) { $type = $ALF_ParserData[$token]; $array = &CreateArray(); if ($ALF_ParserData[$token+2] eq ')') { $token = $token + 1; } else { ($token,@array) = &Liberty_param_list($token+2); } $token = $ALF_ParserData[$token+1] eq ')'? $token+1 : &ALF_SyntaxError('head',$token+1); } ($token+1,$type,@array); } sub Liberty_param_list { local($token) = @_; local $next = 1; local @array; while ($next) { if ( &ALF_LexicalMatch('liberty_string_value',$ALF_ParserData[$token]) || &ALF_LexicalMatch('number',$ALF_ParserData[$token]) ) { $array[$#array+1] = $ALF_ParserData[$token]; $token += 1; } else { &ALF_SyntaxError('param_list',$token); } if ($ALF_ParserData[$token] eq ',') { $token += 1; } else { $next = 0; $token -= 1; } } ($token,@array); } ### Liberty data transformation ### sub Liberty_Array2ALF { local(@array) = @_; local $alfarray = &CreateArray(); local $format,$quoted; foreach $value (@array) { local $unquoted = &Unquote($value); $quoted = ($unquoted ne $value); local @subarray = split(/,\s*/,$unquoted); $format = $#subarray unless $format; print("# ALF Data Error:\tarray $array in Liberty has inconsistent format\n") if ($format!=$#subarray); &AppendArray($alfarray,@subarray); } $ALF_ArrayFormat{$alfarray} = ($#array && $format)? $format+1 : $quoted? 0 : undef; #print("Liberty_Array2ALF:\t(@array) -> (",join(':',&Array($alfarray)),")\n"); $alfarray; } 1;