############################ ### ALF reader interface ### ############################ sub ALF_CreateData { local($parent) = @_; ### creates ALF database from lexical tokens, using $parent as root and name generator. Returns true print("# System Message:\tstarted adding contents to ALF database \47$parent\47 ",&DateTime,"\n"); local $firstline = $ALF_FirstLine{$parent}; local $token = $firstline? $ALF_ParserIndex[$firstline-1] + 2 : 0; &AutoNameStart($parent,$AutoNameCount); $ALF_Children{$parent} = &CreateArray() unless defined($ALF_Children{$parent}); &StringMatch($ALF_ParserData[$token+0],'ALF_REVISION') && ( $ALF_ParserData[$token+1] =~ /$ALF_string_value/ || &ALF_SyntaxError('ALF_REVISION',$token+1) ) && ($AutoFirstLine = "ALF_REVISION ".$ALF_ParserData[$token+1]."\n// ") && &ALF_SyntaxItems('ALF_statement',$token+2,$parent,1,1) || &ALF_SyntaxItems('ALF_statement',$token+0,$parent,1,1); print("# System Message:\tfinished adding contents to ALF database \47$parent\47 ",&DateTime,"\n"); 1; } sub ALF_SyntaxItems { local($rule,$token,$object,$openstart,$openend) = @_; ### evaluates syntax $rule related to children{$object} from '{' to '}'. Does not check for '{' if $openstart. Does not check for '}' if $openend. Returns token at end of evaluation. local $continue = 1; local $nexttoken = $token; ### check for ';' or for '{' unless ($openstart) { if (&StringMatch($ALF_ParserData[$token],';')) { ### object is atomic print("# ALF Data Info:\tobject $object is atomic\n") if ($ALF_Debug > 1); $token = 0; } else { ### object is compound print("# ALF Data Info:\tobject $object is compound\n") if ($ALF_Debug > 1); $nexttoken = $token + 1; $ALF_Children{$object} = &CreateArray(); &ALF_SyntaxError($rule,$token) unless &StringMatch($ALF_ParserData[$token],'{'); } $continue = $token; } ### evaluate until '}' while ($continue) { if (&StringMatch($ALF_ParserData[$nexttoken],'}')) { $token = 0; } else { print("# ALF Syntax Info:\tevaluating rule $rule\tdata[",$nexttoken,"]=\47",$ALF_ParserData[$nexttoken],"\47\n") if ($ALF_Debug > 1); $token = &Eval('ALF_'.$rule,$nexttoken,$object); $token = &ALF_SyntaxError($rule,$nexttoken) unless ($token || $openend); $nexttoken = $token + 1 if $token; } if ($token) { print("# ALF Syntax Info:\tsatisfying rule $rule \tdata[$token]=\47",$ALF_ParserData[$token],"\47\n") if ($ALF_Debug > 1); } $continue = $token; } $nexttoken; } sub ALF_AssertExpressionRule { local($rule,$token,$list) = @_; print("# ALF Syntax Info:\tparsed rule \47$rule\47 at $token\n") if ($ALF_Debug > 1); if (defined($list) && ! &FindAssocKey('ALF_ExpressionToken',$token)) { local $next = &AutoName; $ALF_ExpressionRule{$next} = $rule; $ALF_ExpressionToken{$next} = $token; &AppendArray($list,$next); #print("\tparser rule = (",join(' ',&Array($list)),")\n"); } 1; } sub ALF_ExpressionData { local ($item) = @_; local $rule = $ALF_ExpressionRule{$item}; local $token = $ALF_ExpressionToken{$item}; ($ALF_ParserData[$token],$rule,$token); } 1;