public static void Register(TableOfMacros table, string fileData)
 {
     try
     {
         RegisterWitoutBuilding(table, fileData);
         for (int position = 0; position < fileData.Length; ++position)
         {
             if (fileData[position] == StaticData.MacroSeparator)
             {
                 string macrosName = ParseUtilites.GetMacrosNameInPosition(fileData, position);
                 if (macrosName == "#macro")
                 {
                     string macrosData             = ParseUtilites.GetMacrossData(fileData, position);
                     string userDefinedMacrossName = StaticData.MacroSeparator +
                                                     ParseUtilites.SplitAvoidingRedundantCharacters(macrosData)[0
                                                     ];
                     MainCompositeView cv = new MainCompositeView(fileData);
                     cv.StartPositionInFile = position;
                     int startOfMacroData =
                         ParseUtilites.GetMacrosCloseBracketPosAfterMacroSep(fileData, position) + 1;
                     Visitor v = new BuildCompositeVisitor(fileData, table, startOfMacroData);
                     cv.Accept(v);
                     position = cv.EndPositionInFile + "#end".Length;
                     ((UserDefinedMacross)table.Get(userDefinedMacrossName)).CompositeView = cv;
                 }
             }
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine("Error while building table of macros!");
         Console.WriteLine("Error message: {0}", ex.Message);
     }
 }
示例#2
0
        private void HandleConstructionAtPosition(CompositeConstruction comCon, string name, ref int position)
        {
            Macross currentMacros = table.Get(name);

            if (currentMacros.Name == "break")
            {
                comCon.AddUnit(
                    new StaticText(comCon, fileData.Substring(currentPosition, position - currentPosition)));
                TextUnit comp = new BreakConstruction(comCon, fileData);
                comCon.AddUnit(comp);
                currentPosition = position + name.Length;
                position        = currentPosition;
                return;
            }
            int    macrosDataEndPos = ParseUtilites.GetMacrosCloseBracketPosAfterMacroSep(fileData, position);
            string macrosData       = ParseUtilites.GetMacrossData(fileData, position, macrosDataEndPos);

            comCon.AddUnit(
                new StaticText(comCon, fileData.Substring(currentPosition, position - currentPosition)));
            if (currentMacros.IsCompositeMacross() && currentMacros.Name != "#elseif" && currentMacros.Name != "#else")
            {
                currentPosition = macrosDataEndPos + 1;
                TextUnit compositePart = PredefinedMacros.GetMacro(comCon, name, fileData, macrosData);
                comCon.AddUnit(compositePart);
                CompositeConstruction comp = (CompositeConstruction)compositePart;
                comp.StartPositionInFile = position;
                comp.Accept(this);
                position = currentPosition;
            }
            else
            {
                currentPosition = macrosDataEndPos + 1;
                if (currentMacros is UserDefinedMacross)
                {
                    UserDefinedMacross userDefined = (UserDefinedMacross)currentMacros;
                    TextUnit           comp        = new UserDefinedMacrosConstruction(comCon, userDefined, fileData, macrosData);
                    comCon.AddUnit(comp);
                    position = currentPosition;
                }
                else
                {
                    TextUnit comp = PredefinedMacros.GetMacro(comCon, name, fileData, macrosData);
                    comCon.AddUnit(comp);
                    position = currentPosition;
                }
            }
        }
        private static void RegisterWitoutBuilding(TableOfMacros table, string fileData)
        {
            int positionOfMacros = 0;
            int searchAfter      = 0;

            while ((positionOfMacros = fileData.IndexOf("#macro", searchAfter, StringComparison.Ordinal)) != -1)
            {
                string        macrosData = ParseUtilites.GetMacrossData(fileData, positionOfMacros);
                List <string> split      = new List <string>(ParseUtilites.SplitAvoidingRedundantCharacters(macrosData));
                string        macrosName = StaticData.MacroSeparator + split[0];
                if (table.Contains(macrosName))
                {
                    throw new Exception("MacroDefinitionAlreadyExists!");
                }
                split.RemoveAt(0);
                Macross macrossToAdd = new UserDefinedMacross(macrosName, split);
                table.Add(macrosName, macrossToAdd);
                searchAfter = positionOfMacros + 1;
            }
        }
示例#4
0
        private void HandleElseConstructionAtPosition(IfConstruction ifCon, string name, ref int position)
        {
            ifCon.AddUnit(
                new StaticText(ifCon, fileData.Substring(currentPosition, position - currentPosition)));
            string macrosData = null;

            if (name == "#elseif")
            {
                int macrosDataEndPos = ParseUtilites.GetMacrosCloseBracketPosAfterMacroSep(fileData, position);
                macrosData      = ParseUtilites.GetMacrossData(fileData, position, macrosDataEndPos);
                currentPosition = macrosDataEndPos + 1;
            }
            else
            {
                currentPosition = currentPosition + "#else".Length;
            }
            ElseConstruction compositePart = (ElseConstruction)PredefinedMacros.GetMacro(ifCon, name, fileData, macrosData);

            compositePart.SetFatherIfConstruction(ifCon);
            ifCon.AddElseConstruction(compositePart);
            compositePart.StartPositionInFile = position;
            compositePart.Accept(this);
            position = currentPosition;
        }