function TaxRatesTranslator_main()
{
    $obj = new TaxRatesTranslator(empty($_POST['input']) ? "abc" : $_POST['input']);
    $obj->parse();
    $TaxArray = $obj->getTaxList();
    echo "\n<br>";
    print_r($TaxArray);
}
 function isTaxFormulaSetCyclic($tax_name_id__to__formula, $source_tax_name_id)
 {
     loadCoreFile('tax_formula_translator.php');
     //VIII.1.( 6)
     //Create a graph. Vertexes are $tax_name_id. Arcs are directed relations
     //  between vertexes, taken from tax-formulae.
     $tax_names = modApiFunc("Taxes", "getTaxNamesList");
     //Graph vertex:
     $V = array();
     //Graph arcs:
     $ADJ = array();
     $ADJinfo = array();
     foreach ($tax_names as $tax_name) {
         $V[] = (int) $tax_name["Id"];
         $ADJ[(int) $tax_name["Id"]] = array();
         $ADJinfo[(int) $tax_name["Id"]] = array();
     }
     //Graph arcs:
     //In the graph arcs is stored additional information: which tax formula contains
     //  this arc. It is necessary to show, which formulae the cycle (not arcs)
     //  consists of.
     foreach ($tax_name_id__to__formula as $vertex_id => $vertex_info) {
         //            //Add a vertex, if it still doesn't exist. There should be no
         //            //iterations.
         //            if(!in_array($vertex_id, $V))
         //            {
         //                $V[] = $vertex_id;
         //            }
         //Add all arcs.
         //Parse the formula.
         $trans = new TaxRatesTranslator($vertex_info['formula']);
         $trans->parse();
         $ADJ[$vertex_id] = $trans->getTaxList();
         $ADJinfo[$vertex_id] = array("formula_id" => $vertex_info['formula_id']);
     }
     loadCoreFile('directed_graph.php');
     $graph = new DirectedGraph($V, $ADJ);
     if ($graph->hasCycleFromGivenSource($source_tax_name_id, $cycle)) {
         //It's necessary to restore formulae, which in this case
         // (i.e. depending on state and tax_class) match
         // specified arcs in the graph.
         $cycle_with_tax_info = array();
         //Suppose cycle is correct ring
         $previous_vertex_in_cycle = $cycle[sizeof($cycle) - 1]['tax_name_id'];
         $i = 0;
         for (; $i < sizeof($cycle); $i++) {
             $vertex = $cycle[$i];
             $vertex_with_tax_info = array("tax_name_id" => $vertex, "formula_id" => $ADJinfo[$vertex]['formula_id'], "child_tax_name_id" => $previous_vertex_in_cycle);
             $cycle_with_tax_info[] = $vertex_with_tax_info;
             $previous_vertex_in_cycle = $vertex;
             //formula_id in this case formula_id is a formula id, which
             //is used up to the next vertex in the cycle.
         }
         $cycle = $cycle_with_tax_info;
         return $cycle_with_tax_info;
         //true;
     } else {
         return false;
     }
 }