/// <summary>
        ///
        /// </summary>
        /// <param name="p"></param>
        /// <param name="slang_text"></param>
        /// <returns></returns>
        public string EmitProgramToRuleMappings(string p, string slang_text)
        {
            /////////////////////////////////////////////
            //
            // Retrieve the data from Excel Reader...
            DataSet ds = m_reader.GetData(p);

            if (ds == null)
            {
                return(null);
            }

            ////////////////////////////////////////
            //
            // Get the Worksheet data...
            //
            DataTable dt = ds.Tables[0];

            Dictionary <String, SYMBOL_INFO> ret = new Dictionary <string, SYMBOL_INFO>();

            if (dt == null)
            {
                return(null);
            }

            int Count = dt.Rows.Count;

            slang_text += "//----------- Program To Rule mapping \r\n\r\n";

            int i = 0;

            while (i < Count)
            {
                DataRow dr = dt.Rows[i];

                try
                {
                    if (dr["RULETEXT"] == null || dr["PROGRAMNAME"] == null)
                    {
                        return(null);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("The Cell Column name should be PROGRAMNAME , RULETEXT in " + p);
                    return(null);
                }

                String FunctionName = Convert.ToString(dr["PROGRAMNAME"]);
                String FunctionBody = Convert.ToString(dr["RULETEXT"]);

                List <String> rst = SplitLines(FunctionBody);

                string new_prog = "";

                foreach (String s in rst)
                {
                    new_prog += s + "\r\n";
                }

                string program_text = ManufactureFunction(FunctionName, new_prog);
                i++;

                ///////////////////////////////
                // CSnippetParser is a subclass of RDParser the purpose is to parse
                // PROGRAM_TO_RULE snippets...
                //
                //

                CSnippetParser par = new CSnippetParser(program_text, rule_sym);
                TModule        mod = par.ParseText();

                if (mod == null)
                {
                    Console.WriteLine("Error in Parsing " + FunctionName + " in " + "PROGRAM_TO_RULE \r\n");
                    rule_compile_flag = false;
                }
                else
                {
                    Dictionary <string, SYMBOL_INFO> inf = par.GetLocals();
                    program_text = ManufactureFunctionWithParams(inf, FunctionName, new_prog);
                    RDParser par2 = new RDParser(program_text);

                    mod = par2.DoParse();

                    if (mod == null)
                    {
                        Console.WriteLine("Error in Parsing " + FunctionName + " in " + "PROGRAM_TO_RULE \r\n");
                        rule_compile_flag = false;
                    }
                    else
                    {
                        slang_text += "\r\n" + program_text + "\r\n";
                    }
                }
            }
            return(slang_text);
        }